如何不使用Selenium爬取JavaScript动态生成HTML的网页?
动态渲染页面无Selenium爬取方案(Python2兼容场景)
针对你现有Python2 + requests + BeautifulSoup的技术栈,且不使用Selenium的要求,可按优先级选择以下方案:
方案1:抓后端异步接口(优先推荐)
- 打开浏览器开发者工具的「网络」面板,筛选
Fetch/XHR分类,刷新页面后查看JS发起的异步请求,90%以上的动态内容都是通过这类请求拉取JSON格式数据返回的,直接用requests模拟请求对应接口即可,不需要解析页面 - 注意匹配接口的请求头(比如User-Agent、Referer、自定义签名头)、请求参数(GET的query参数、POST的body参数),部分接口会有签名校验,按前端JS里的签名逻辑复刻即可
- Python2版本的requests完全支持这类接口请求,拿到JSON后直接解析字段,比解析HTML效率高很多,也不容易受页面结构变动影响
方案2:直接提取JS内嵌数据
如果动态内容是直接硬编码在页面的内联JS变量里的,不需要执行JS也能拿到:
- 用requests拉取原始页面源码后,用正则匹配JS里对应数据变量的取值,比如
var pageData = {xxx};这种结构,直接把{xxx}部分抠出来用json库解析即可 - 结构复杂的非标准JS对象可以用
demjson库(Python2兼容)解析,不需要完全转成标准JSON就能读取字段 - 这种方案性能最高,不需要额外依赖,只要页面JS结构没有大变动就可以稳定使用
方案3:轻量级JS引擎渲染页面内容
如果接口有强签名没法破解,或者数据需要执行JS才能生成,可以用轻量JS引擎跑页面代码生成完整DOM:
- 先拿requests拉取原始页面源码,提取里面的内联JS或者外部JS链接
- 用
PyExecJS库(Python2兼容最新支持到1.5.1版本)调用本地Node.js环境执行页面JS,生成完整的DOM结构 - 生成的DOM直接丢给BeautifulSoup按原来的逻辑解析即可,整个流程没有浏览器启动开销,比Selenium轻量很多
注意:Python2下安装PyExecJS直接执行
pip install PyExecJS==1.5.1即可,优先搭配Node.js使用,比默认的PyV8兼容性好很多
Python2环境适配注意事项
- 所有用到的第三方库要选支持Python2的最后版本,比如requests最高支持到2.27.1,BeautifulSoup4最高支持到4.9.3,不要安装最新版导致兼容报错
内容的提问来源于stack exchange,提问作者Gulshan Kumar
相关产品推荐
相关产品推荐

