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

网页爬取生成空DataFrame:同域名页面仅获表头无数据

解决动态加载表格的爬取问题

我碰到过很多类似的情况——有些页面的表格是直接嵌在初始HTML里的,而另一些是靠JavaScript动态拉取数据渲染的,你的第二个页面就属于后者。requests库只能获取服务器返回的初始HTML,不会执行页面里的JS,所以你只能拿到表头,拿不到实际数据。

下面是具体的解决步骤:

1. 找到动态加载数据的API接口

用浏览器的开发者工具(按F12打开),切换到「网络」标签页,然后刷新页面。在请求列表里找类型为XHR或Fetch的请求(这些就是AJAX请求),你会发现一个返回表格数据的接口——比如在你提到的rollingsystemdemand页面,这个接口大概率是类似https://www.bmreports.com/bmrs/?q=ajax/demand/rollingsystemdemand的地址(或带参数的版本)。

点击这个请求,查看「响应」标签页,确认里面包含了你需要的表格数据(通常是JSON格式)。

2. 修改脚本直接请求API接口

既然找到了数据源,直接请求这个接口比解析HTML高效得多。下面是修改后的示例代码:

import requests
import pandas as pd

# 替换成你从开发者工具找到的AJAX接口地址
api_url = "https://www.bmreports.com/bmrs/?q=ajax/demand/rollingsystemdemand"

# 添加请求头,模拟浏览器请求,避免被网站拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Referer": "https://www.bmreports.com/bmrs/?q=demand/rollingsystemdemand"
}

# 请求API获取数据
response = requests.get(api_url, headers=headers)
data = response.json()

# 处理数据并转成DataFrame(需根据实际返回的JSON结构调整字段名)
# 假设返回的JSON中"data"字段包含表格行数据
df = pd.DataFrame(data["data"])

# 查看结果
print(df.head())

3. 额外注意事项

  • 如果接口需要参数(比如日期范围),可以在开发者工具的「请求参数」面板里查看,然后在requests.get()中通过params参数传递。
  • 部分网站会校验请求头,务必带上User-Agent,必要时加上Referer,模拟正常的浏览器访问行为。
  • 如果接口返回的是HTML片段(比如仅表格的<tr>内容),可以复用你原来的解析逻辑,只需要把page.content替换成接口的响应内容即可。

这种直接请求数据源的方式,比解析动态渲染的HTML更稳定,因为页面结构可能随时变化,但API接口通常会保持相对一致的格式。

内容的提问来源于stack exchange,提问作者Mol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:57:59