Python如何无需使用Selenium抓取网页历史价格图表背后的数据
无需Selenium的可行实现方案
以下方法均可以绕过加密参数问题获取目标数据,你可以按需选择:
- 方案1:逆向前端JS还原加密参数
接口的加密请求头基本都是前端JS动态生成的,你可以按以下步骤操作:- 打开浏览器调试工具,给对应API端点加XHR/fetch断点,请求触发后向上调用栈溯源,找到加密参数的生成函数
- 把该函数和关联的依赖代码抠出,用
PyExecJS库在Python环境运行,补全window、navigator等必要的浏览器环境变量,就能生成合法的加密参数 - 用
requests库维持访问会话,先访问目标详情页拿到正常的Cookie和基础请求头,再带上生成的加密参数发起API请求,即可直接拿到结构化的返回数据
该方法运行效率最高,资源占用最低,适合批量爬取的场景。
- 方案2:用Playwright轻量无头浏览器捕获请求
不想花时间逆向JS的话,可以用比Selenium更轻量、反爬绕过能力更强的Playwright:- 安装Playwright后初始化Chromium实例,配置
headless="new"参数启用无界面模式,不需要弹出可视化窗口 - 调用
page.goto()访问目标详情页,用page.wait_for_response()方法直接匹配你找到的API端点,不需要解析DOM元素,直接就能拿到接口返回的原始JSON数据 - 整个流程代码量极小,运行速度远快于Selenium,也不会被常规的无头浏览器检测规则拦截。
- 安装Playwright后初始化Chromium实例,配置
- 方案3:用requests-html完成轻量渲染
如果请求的加密逻辑依赖的页面渲染逻辑比较简单,也可以用requests-html库:它内置了Chromium渲染能力,调用html.render()方法执行页面JS后,既可直接从页面的网络请求缓存中提取API返回数据,也能获取到生成完成的加密参数后续复用。
注意:所有方案都建议先访问目标详情页获取正常的会话Cookie和基础请求头,不要直接发起API请求,避免被反爬规则拦截。
内容的提问来源于stack exchange,提问作者Mikko
相关产品推荐
相关产品推荐

