如何使用Python等待JavaScript渲染完成后再请求页面内容
问题1:requests-html的HTMLSession正确配置方法
你当前代码不生效的核心原因有两个:
- 取值错误:
response.html.render()执行后,渲染完成的DOM内容存储在response.html.html属性中,直接读取response.text拿到的永远是初始请求返回的未渲染原始HTML,和渲染操作无关。 - 渲染参数未做适配:默认render方法等待时间短,遇到React/Vue构建的单页应用(你爬的站点就是React单页应用,源码里的
<div id="root"></div>是典型特征),加上站点用了Cloudflare CDN,很容易出现JS还没执行完就返回结果的问题。
可直接运行的修正代码
from requests_html import HTMLSession from bs4 import BeautifulSoup url = 'https://www.edwarddan.com/projects' this_session = HTMLSession() response = this_session.get(url) # 渲染参数说明: # sleep: 渲染完成后固定等待3秒,给JS执行、资源加载留时间 # timeout: 渲染超时时间设为20秒,避免资源加载慢导致中断 # wait: 等待#root下的子元素加载完成再返回,比固定等待更精准 response.html.render( sleep=3, timeout=20, wait="#root div" ) # 读取渲染后的完整HTML rendered_content = response.html.html soup = BeautifulSoup(rendered_content, "html.parser") all_divs = soup.find_all("div")
注意:第一次调用render()方法时,requests-html会自动下载Chromium渲染内核,需要确保网络正常没有拦截,否则渲染会直接失效。如果需要更复杂的等待逻辑,可以加keep_page=True参数,拿到页面对象后手动等待特定元素加载、模拟滚动等操作。
问题2:其他支持JS渲染的Python爬虫库
如果requests-html无法满足需求(比如遇到反爬严格、复杂交互的场景),可以选择以下方案,优先推荐前两种:
- Playwright:微软维护的浏览器自动化库,是目前动态页面爬取的首选方案。API简洁,自带智能等待元素的能力,安装后自动下载适配的浏览器,不需要手动配置驱动,支持无头模式,对React/Vue等现代前端框架适配极好,还自带拦截请求、模拟登录、绕过简单反爬的能力。
- 接口直爬:这是效率最高的方案,不需要启动浏览器渲染。动态站点的内容几乎都是通过异步接口加载的,打开浏览器F12控制台,切到「网络」面板筛选XHR/ Fetch请求,刷新页面就能找到返回项目数据的接口,直接请求接口拿结构化JSON数据,比渲染HTML后再解析快10倍以上,也更稳定。
- Pyppeteer:Python版本的Puppeteer,基于Chromium内核,支持异步调用,不过目前社区维护活跃度不如Playwright,遇到问题排查资料相对少。
- Selenium 4:你之前了解的旧版本Selenium需要搭配PhantomJS、手动下载驱动的问题已经不存在了,最新的Selenium 4自带无头浏览器支持,自动管理驱动,稳定性很好,适合有旧Selenium使用经验的用户。
内容的提问来源于stack exchange,提问作者Geneku2
相关产品推荐
相关产品推荐

