Python使用requests请求网页时article元素内容为空如何解决?
你拿到空的<article id="dashboard"></article>节点,是因为该站点的仪表盘数据完全由前端JavaScript动态加载渲染,requests库仅能获取初始静态HTML源码,不会执行页面内置的JS逻辑,自然拿不到后续填充的动态数据。
解决方案
以下两种方案可以根据你的场景选择:
方案1:直接抓取后端数据接口(推荐,速度最快、稳定性最高)
该方案不需要解析页面,直接拿到结构化JSON数据,资源消耗最低,适合长期稳定采集。
- 操作步骤:
- 打开浏览器F12开发者工具,切换到「网络」面板,刷新页面后筛选「XHR/ Fetch」类型的请求,找到返回仪表盘数据的接口(响应内容一般为JSON格式)。
- 复制该接口的请求URL、完整请求头(重点是User-Agent、站点自定义鉴权头、Cookie等校验字段)、请求参数(POST请求需要额外复制请求体参数)。
- 用
requests模拟该请求即可直接拿到目标数据。
- 注意事项:
- 定期检查接口参数是否有变更,部分站点会给接口加签名、时效token等校验,可逆向JS逻辑还原参数生成规则适配。
- 控制请求频率,可加合理的间隔时间、轮换User-Agent避免触发反爬限制。
- 示例代码结构:
import requests headers = { "User-Agent": "从浏览器请求中复制的真实User-Agent", # 其他从浏览器中复制的必要请求头都可以加在此处 } # POST请求换成requests.post方法,参数放到data或json字段即可 resp = requests.get("你抓到的真实数据接口地址", headers=headers) dashboard_data = resp.json() # 直接处理dashboard_data的结构化字段即可
方案2:使用无头浏览器渲染页面(开发成本低,适合接口逆向难度高的场景)
如果站点接口加密逻辑复杂,逆向成本过高,可以用支持JS渲染的工具加载完整页面后再提取数据。
- 以playwright为例的示例代码:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头模式浏览器,无可视化窗口 browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://bitcoin.clarkmoody.com/dashboard/", timeout=60000) # 等待dashboard节点加载完成,最长等待10秒 page.wait_for_selector("#dashboard", timeout=10000) # 提取dashboard的完整HTML内容,也可以直接提取内部子节点的文本/属性 dashboard_content = page.locator("#dashboard").inner_html() browser.close() # 后续用BeautifulSoup等工具解析dashboard_content即可
- 注意事项:
- 首次使用需要安装依赖:执行
pip install playwright后再执行playwright install chromium - 可配置代理、自定义User-Agent绕过基础反爬,性能比直接抓接口低,适合小批量采集场景。
- 首次使用需要安装依赖:执行
内容的提问来源于stack exchange,提问作者Grim Ranger
相关产品推荐
相关产品推荐

