likes
comments
collection
share

前端可视化(一) - 不抓包怎么直接从页面获取数据

作者站长头像
站长
· 阅读数 27

前段时间玩「信长之野望·新生」(已天下布武),开局的地图我很喜欢。

前端可视化(一) - 不抓包怎么直接从页面获取数据

前端可视化(一) - 不抓包怎么直接从页面获取数据

一、拆解逻辑

前端可视化(一) - 不抓包怎么直接从页面获取数据

首先,核心逻辑经过拆分,比较清晰:拿到数据,实现地图容器,数据映射填入,每天定时更新。

其次,可能需要再锦上添花,实现一些设定逻辑,比如:

  • 掘力值(土地面积)
  • 关注数(兵力值)
  • 名称写个随机颜色映射逻辑(势力颜色)
  • 从评论区拿点有趣点子 ...

二、数据获取

今天是第一篇,所以只基于页面的数据获取开展讨论

如果我只关注了 5 个人,那其实手动维护数据都可以。

只要每天点击关注博主的主页里,把相关数据 CV 更新到数据表里,相应网站重新部署下就行。

但哥们好歹是个工程师,实现方式就别这么 Low 了,况且我本身关注的人也很多,工作能自动化的就要自动化掉。回到数据获取的话题上,可以发现我们需要获取的数据有两类:

  • 用户基础数据:掘力值、关注数、被关注数 ...
  • 关注用户列表:关注了哪些人,这个列表是个动态的

下面会介绍不通过抓包,如何直接从页面获取这两类数据的方式

01 | 用户基础数据

用户基础数据相对是比较好获取的,傻瓜一点的方式就是直接抓 html 页面元素值即可:

前端可视化(一) - 不抓包怎么直接从页面获取数据

i. 开发思路

  1. 创建一个 requests 会话
  2. 发起 GET 请求,获取目标网页的内容
  3. 使用 BeautifulSoup 解析获取到的 HTML
  4. 通过 CSS 选择器找到目标元素,提取文本内容
  5. 将数字列表转换为字符串格式并打印

ii. 代码实现

下面这段 python 代码,定义了两个函数。一个是抓取页面中关注相关数据、一个数抓取用户基础数据。实现方式类似,都是通过css选择器定位元素并获取的。

运行结果前端可视化(一) - 不抓包怎么直接从页面获取数据

02 | 关注列表数据

如果有知道简便实现方式的老哥欢迎评论区分享,大家一起讨论下。

前端可视化(一) - 不抓包怎么直接从页面获取数据

i. 开发思路

  1. 用户输入的 URL
  2. 使用 selenium 库启动 Chrome 浏览器并打开指定的 URL
  3. 通过滚动和检查页面高度变化来加载所有关注用户
  4. 使用 CSS 选择器定位并提取关注用户的信息
  5. 将提取到的用户信息保存到新文件中

ii. 代码实现

下面的代码实现方式基于用户基础数据的获取方式,额外新增了一个用户翻页行为模拟。用来抓一些加载翻页表单。并将表单中抓取的数据存储到一个txt文件中:

import argparse
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By


# 获取用户关注列表(处理加载与翻页)
def get_my_following(url):
    # 设置WebDriver路径
    webdriver_service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=webdriver_service)

    driver.get(url)

    # 滚动页面直到没有新的用户加载
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)  # 等待新的用户加载
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:  # 如果没有新的用户加载,停止滚动
            break
        last_height = new_height

    following_users = driver.find_elements(By.CSS_SELECTOR, "ul.tag-list a.username")
    following_list = [user.text for user in following_users]

    driver.quit()

    return following_list


# 新建 or 覆盖,保存用户关注列表
def save_following_to_file(following_list, filename):
    with open(filename, "w") as f:
        for user in following_list:
            f.write(user + "\n")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="Get the list of users you are following on Juejin."
    )
    parser.add_argument("url", help="The URL of your following list on Juejin.")
    args = parser.parse_args()

    following_list = get_my_following(args.url)
    length = len(following_list)
    print("关注用户数:", length)

    # 保存关注的用户到文件
    save_following_to_file(following_list, "following.txt")

运行结果前端可视化(一) - 不抓包怎么直接从页面获取数据

三、功能封装

python 依赖和环境安装挺麻烦还容易报错,所以我这里对模块使用做了一层封装。

感兴趣的朋友你 pull 到本地就能用。

01 | 使用方法

  • 添加脚本权限: chmod +x install_and_run.sh

clone 仓库后只用执行一次,脚本有了执行权限,你就可以直接运行它,无需再次使用 chmod 命令。

  • 导出关注列表: ./install_and_run.sh (URL-待替换)

四、可视化容器(TODO)

下一节实现地图容器,看了这个原神哥的文章,大受启发:

前端可视化(一) - 不抓包怎么直接从页面获取数据

转载自:https://juejin.cn/post/7361433958575194150
评论
请登录