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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:29