Python不使用Selenium获取JS动态生成页面源码的问题
动态JS页面源码获取可行方案
原有代码失效原因
- 代码执行顺序错误:先调用
session.get()再实例化HTMLSession(),请求发起逻辑本身不成立 - 属性读取错误:
r.text存储的是初始请求返回的未渲染静态源码,JS渲染完成后内容不会同步更新到这个属性 - 缺少适配参数:打印机嵌入式Web服务用自签名HTTPS证书、JS逻辑存在跨域/非常规资源加载逻辑,默认参数会导致JS执行中断,触发JS禁用提示
可直接运行的修正代码
from requests_html import HTMLSession import urllib3 # 关闭自签名证书访问警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 先实例化会话再发起请求 session = HTMLSession() r = session.get('https://220.116.57.59', timeout=10, verify=False) # 配置渲染参数:留足JS执行时间、忽略资源加载错误、适配无桌面环境运行 r.html.render( timeout=20, sleep=3, ignore_resource_errors=True, browser_args=["--no-sandbox", "--disable-web-security"] ) # 从html属性读取JS执行完成后的完整页面源码 full_source = r.html.html print(full_source)
关键说明
- 方案不需要提前安装全量浏览器,首次运行
render()方法会自动下载轻量Chromium内核,符合运行环境要求 - 渲染完成后必须通过
r.html.html获取动态源码,不要读取r.text - 如果页面加载慢,可以适当调大
sleep参数值,给前端JS预留充足的渲染执行时间
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

