使用rvest爬取MLB Statcast Hitting表格时数据异常的问题
解决MLB Statcast Hitting表格爬取问题
问题分析
你两次尝试的问题根源:
- 第一次用
#statcastHitting定位的是包含多个表格的容器,html_table()会提取容器内所有表格,导致结果冗余。 - 第二次用Selector Gadget生成的选择器错误定位了表头的零散元素,而非整个表格,所以得到空的tibble。
解决方案
方法一:静态爬取(优先尝试)
页面的目标表格属于静态渲染,只需精确定位表格元素即可:
library(rvest) library(tidyverse) library(janitor) # 可选,用于清理列名 url <- 'https://baseballsavant.mlb.com/league?season=2023#statcastHitting' # 定位#statcastHitting容器内的目标表格,提取并整理 savant_teams <- url %>% read_html() %>% html_node('#statcastHitting table') %>% # 精准定位表格元素 html_table(header = TRUE) %>% # 正确识别表头,排除跨列大标题 clean_names() # 可选,将列名转为蛇形命名(如player_name) # 查看结果 head(savant_teams)
方法二:动态渲染爬取(如果静态爬取失败)
若页面表格是JavaScript动态加载的,用RSelenium模拟浏览器加载页面:
library(RSelenium) library(rvest) library(tidyverse) library(janitor) # 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面并等待加载完成 remDr$navigate('https://baseballsavant.mlb.com/league?season=2023#statcastHitting') Sys.sleep(5) # 根据网络情况调整等待时间 # 获取页面源码并解析表格 page_source <- remDr$getPageSource()[[1]] savant_teams <- page_source %>% read_html() %>% html_node('#statcastHitting table') %>% html_table(header = TRUE) %>% clean_names() # 关闭浏览器 remDr$close() driver$server$stop() # 查看结果 head(savant_teams)
关键说明
#statcastHitting table直接定位目标容器内的表格,避免提取无关内容。html_table(header = TRUE)会自动识别第一行作为表头,忽略顶部的跨列大标题,符合你的需求。
内容的提问来源于stack exchange,提问作者Violin125
相关产品推荐
相关产品推荐

