You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:03:54