如何使用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比爬取页面更稳定可靠:
- 提取球员ID:从MLB.com球员URL中提取ID,比如
junior-caminero-691406中的691406 - 构造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
相关产品推荐
相关产品推荐

