R语言网页爬取问题:多球队URL循环与投球表提取失败
问题解决方案
1. 多球队爬取数据被覆盖的问题
原因
直接将team向量传入make_url函数时,mutate会为每一行日期生成对应所有球队的URL,但这种方式没有生成日期×球队的完整组合,导致后续爬取时数据被覆盖,最终只保留最后一支球队的记录。
解决方案
先通过笛卡尔积扩展dates和team的所有组合,再生成对应URL:
# 生成日期与球队的所有组合 team_dates <- expand_grid(team = c('ARI','WAS'), dates) # 修改URL生成逻辑 urls <- team_dates |> mutate( url = make_url(team, year, month, day), date = paste(year, month, gsub('.{1}$', '', day), sep = '-'), .keep = 'unused' )
这样每一行都会对应唯一的「球队+日期」组合,避免数据被覆盖。
2. 投球表提取为空的问题
原因
Baseball Reference的投球表分为主队投球表和客队投球表,对应的div id格式为all_pitching_home和all_pitching_visitor,原xpath逻辑本身没问题,但页面中的投球表可能被包裹在HTML注释中,直接用html_elements无法提取到有效内容。
解决方案
调整scrape_table函数的逻辑,先处理HTML注释中的表格,再提取所有投球表节点:
scrape_table <- function(html) { # 提取所有包含投球表的div(包括主客队) nodes <- html |> html_elements(xpath = '//div[starts-with(@id, "all_pitching")]') # 处理每个节点中的表格(包括注释里的内容) tables <- purrr::map(nodes, function(node) { # 提取节点内的HTML内容,包括注释 node_html <- node |> html_text() # 解析注释中的表格 parsed <- read_html(node_html) # 提取表格并转为数据框 parsed |> html_element('table') |> html_table(header = TRUE, fill = TRUE) |> # 添加区分主客队的标识(可选) mutate(team_type = ifelse(stringr::str_detect(node |> html_attr('id'), 'home'), 'Home', 'Visitor')) }) # 合并所有投球表数据 dplyr::bind_rows(tables) }
如果不需要区分主客队,可以去掉team_type的生成逻辑。同时确保你的rvest包是最新版本,避免解析兼容性问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

