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

如何使用R爬取stats.nba.com球队高阶数据表格 现有方案失效

问题原因

你两次尝试失败、以及拿到res后找不到表格的核心原因是:NBA stats站点的表格是前端JavaScript动态渲染生成的,原始HTML中没有现成的<table>节点,数据是预先内嵌在页面的<script>标签中、或者通过单独的接口请求拉取的。你之前直接调用API无响应是因为缺少API要求的请求头校验字段。

可行解决方案

方案1:调用官方统计API(更稳定,推荐)

你之前抓的API地址是对的,只需要补全对应的请求头就能正常返回数据,不需要带复杂的cookie:

library(httr)
library(jsonlite)

# 补全API要求的请求头,核心校验字段为Host和Referer
api_headers <- c(
  `Host` = "stats.nba.com",
  `Referer` = "https://www.nba.com/",
  `User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",
  `Accept` = "application/json, text/plain, */*"
)

# 调用官方统计接口
api_res <- GET(
  url = "https://stats.nba.com/stats/leaguedashteamstats",
  query = list(
    Conference = "",
    DateFrom = "",
    DateTo = "",
    Division = "",
    GameScope = "",
    GameSegment = "",
    LastNGames = 0,
    LeagueID = "00",
    Location = "",
    MeasureType = "Advanced",
    Month = 0,
    OpponentTeamID = 0,
    Outcome = "",
    PORound = 0,
    PaceAdjust = "N",
    PerMode = "PerGame",
    Period = 0,
    PlayerExperience = "",
    PlayerPosition = "",
    PlusMinus = "N",
    Rank = "N",
    Season = "2020-21",
    SeasonSegment = "",
    SeasonType = "Regular Season",
    ShotClockRange = "",
    StarterBench = "",
    TeamID = 0,
    TwoWay = 0,
    VsConference = "",
    VsDivision = ""
  ),
  add_headers(.headers = api_headers)
)

# 解析返回JSON生成结构化表格
raw_data <- fromJSON(content(api_res, as = "text"))
advanced_table <- as.data.frame(raw_data$resultSets$rowSet[[1]])
colnames(advanced_table) <- raw_data$resultSets$headers[[1]]

方案2:从你已拿到的res中提取数据

如果不想调用API,直接解析你已经拿到的页面响应,提取内嵌的JSON数据即可:

library(rvest)
library(stringr)
library(jsonlite)

# 从res中读取HTML文本
page_content <- content(res, as = "text")

# 匹配页面内嵌的初始数据JSON
json_str <- str_match(page_content, 'window.__INITIAL_STATE__ = (.*?);\\s*<\\/script>')[,2]
page_data <- fromJSON(json_str)

# 提取目标表格数据
advanced_table <- as.data.frame(page_data$stats$teams$advanced$table$rows)
colnames(advanced_table) <- page_data$stats$teams$advanced$table$columns$field

以上两种方案都可以稳定拿到2020-21赛季常规赛球队进阶统计表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:03