网页爬取生成空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
相关产品推荐
相关产品推荐

