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

如何使用R爬取MLB.com球员的小联盟防守数据?

用R爬取MLB.com球员小联盟防守数据

已完成的工作

我已经成功改编代码,从baseball-reference爬取了Junior Caminero的小联盟防守数据,代码如下:

library(tidyverse)

player_html <- "https://www.baseball-reference.com/register/player.fcgi?id=camine000jun#standard_fielding"

fielding_data <- 
  player_html |> 
  read_html() |> 
  as.character() |> # 提取HTML内容为字符串
  str_replace_all("<!--|-->", "") |> # 移除HTML注释,这一步是必要的
  read_html() |>  # 解析清理后的HTML
  html_nodes(xpath = '//*[@id="div_standard_fielding"]') |> 
  html_table() |> # 提取并解析表格
  pluck(1)     # 取出防守数据表

当前需求与问题

现在需要爬取MLB.com上该球员的小联盟防守数据:

  • 目标页面需要依次点击“Minors”和“Fielding”按钮才能显示对应数据
  • 点击按钮后URL变为https://www.mlb.com/player/junior-caminero-691406?stats=career-r-fielding-minors&year=2024,但直接访问该链接会跳转到小联盟击球数据页面
  • 不懂HTML,不知道怎么用Chrome检查元素定位目标表格

解决方案

方法1:直接请求MLB Stats API(推荐)

MLB.com的球员数据通过API动态加载,直接请求API比爬取页面更稳定可靠:

  1. 提取球员ID:从MLB.com球员URL中提取ID,比如junior-caminero-691406中的691406
  2. 构造API请求:小联盟生涯防守数据的API地址可通过Chrome开发者工具的「网络」标签(过滤XHR请求)找到,示例代码如下:
library(tidyverse)
library(httr)
library(jsonlite)

# 球员ID
player_id <- "691406"
# 小联盟生涯防守数据API
api_url <- paste0("https://statsapi.mlb.com/api/v1/people/", player_id, "/stats?stats=careerMinorLeagueFielding")

# 发送请求并解析JSON
response <- GET(api_url)
raw_data <- fromJSON(content(response, "text"))

# 整理成表格格式
fielding_data <- raw_data$stats$splits[[1]]$stat %>%
  as_tibble() %>%
  mutate(
    球队 = raw_data$stats$splits[[1]]$team$name,
    赛季 = raw_data$stats$splits[[1]]$season
  )

方法2:用RSelenium模拟浏览器操作

如果一定要模拟点击按钮爬取页面,可使用RSelenium:

library(RSelenium)
library(rvest)

# 启动Chrome驱动(需提前安装ChromeDriver并配置环境变量)
driver <- rsDriver(browser = "chrome")
remDr <- driver[["client"]]

# 打开球员页面
remDr$navigate("https://www.mlb.com/player/junior-caminero-691406")

# 点击「Minors」按钮
minors_btn <- remDr$findElement(using = "css selector", value = "[data-tab='minors']")
minors_btn$clickElement()

# 等待页面加载,点击「Fielding」按钮
Sys.sleep(2)
fielding_btn <- remDr$findElement(using = "css selector", value = "[data-tab='fielding']")
fielding_btn$clickElement()

# 等待数据渲染
Sys.sleep(3)

# 解析页面表格
page_source <- remDr$getPageSource()[[1]]
fielding_data <- read_html(page_source) %>%
  html_node("table.stats-table") %>%
  html_table()

# 关闭驱动
remDr$close()
driver$server$stop()

关于URL跳转的说明

MLB.com采用单页应用(SPA)架构,URL参数仅用于前端路由逻辑,实际数据通过异步API请求获取。直接访问带参数的URL时,前端可能因初始化逻辑错误跳转,因此直接请求API是更可靠的方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:57:06