400 8949 560

NEWS/新闻

分享你我感悟

您当前位置> 主页 > 新闻 > 技术开发

如何在网页无标准表格标签时高效提取结构化数据

发表时间:2026-01-01 00:00:00

文章作者:花韻仙語

浏览次数:

本文详解当目标网页不使用 `

` 标签(如 nba 官网动态渲染的统计表格)时,如何绕过传统 `beautifulsoup` 和 `pd.read_html()` 的局限,结合网络请求、html 解析、javascript 渲染识别与 api 逆向等多策略精准提取结构化数据。

NBA 官网(如 https://www.nba.com/stats/players/traditional)并非通过静态 HTML 表格呈现数据,而是采用 React 框架 + AJAX 动态加载——页面源码中几乎不存在

元素,取而代之的是大量 嵌套与 CSS 类名(如 Crom_table__p1iZz),且真实数据实际由前端 JavaScript 从 JSON API 接口拉取并渲染。因此,直接用 requests + BeautifulSoup 获取的 HTML 源码中根本没有表格内容,pd.read_html() 自然会误匹配页面其他残留表格(如日历组件),导致返回毫无意义的周历数据。

✅ 正确做法是:跳过 HTML 渲染层,直击数据源头。观察浏览器开发者工具(Network → XHR/Fetch),可发现 NBA Stats 页面实际调用如下 RESTful API:

import requests
import pandas as pd

# NBA Stats API 真实数据端点(经逆向分析确认)
base_url = "https://stats.nba.com/stats/leaguedashplayerstats"
params = {
    "Season": "2010-11",
    "SeasonType": "Regular Season",
    "PerMode": "PerGame",
    "LeagueID": "00",
    "MeasureType": "Base",
    "PageNumber": "1",
    "PageSize": "1000"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Referer": "https://www.nba.com/",
    "x-nba-stats-origin": "stats",
    "x-nba-stats-token": "true"
}

response = requests.get(base_url, params=params, headers=headers)
response.raise_for_status()
data = response.json()

# 提取字段名与数据行
columns = data["resultSets"][0]["headers"]
rows = data["resultSets"][0]["rowSet"]

# 转为 DataFrame
df = pd.DataFrame(rows, columns=columns)
print(df[["PLAYER_NAME", "PTS", "REB", "AST"]].head())

⚠️ 注意事项:

  • 必须携带合法 Headers:NBA API 严格校验 User-Agent、Referer 及 x-nba-stats-* 自定义头,缺失将返回 403;
  • 分页处理:单次请求最多返回 1000 条记录,若需全量数据,需循环 PageNumber 并合并;
  • 避免反爬:添加 time.sleep(1) 间隔请求,切勿高频调用;
  • 替代方案(无 API 时):若目标站无公开 API,可改用 Selenium 或 Playwright 启动真实浏览器等待 JS 渲染完成,再定位 .Crom_table__p1iZz 下的 结构解析(但性能低、维护成本高);
  • ❌ 切勿尝试“字符串清洗法”(如答案中建议的空格转逗号):该方法不可靠、易断裂、无法复现列对齐,且完全忽略表头与数据语义,属于严重降级方案,仅作最后兜底。
  • 总结:现代网页数据抓取的核心逻辑已从“解析 HTML 表格”转向“识别数据接口”。掌握 Chrome DevTools 的 Network 分析、API 参数构造及请求头模拟,才是应对无

场景的通用解法。

相关案例查看更多