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["re
sultSets"][0]["rowSet"]
# 转为 DataFrame
df = pd.DataFrame(rows, columns=columns)
print(df[["PLAYER_NAME", "PTS", "REB", "AST"]].head())⚠️ 注意事项: