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

R语言循环爬取多网页表格合并为单表的三类问题求解

R爬取自由球员数据问题修复方案

修正后完整可运行代码

# 加载依赖包
library(rvest)
library(dplyr)

years <- c(2016:2021)
# 初始化空列表存储分年爬取的表格,替代逐次rbind的逻辑
table_list <- list()

for(i in seq_along(years)){
  target_year <- years[i]
  # 拼接对应年份的URL
  url <- paste0("https://www.basketball-reference.com/friv/free_agents.cgi?year=", target_year)
  
  fa_page <- read_html(url)
  fa_node <- html_nodes(fa_page, "table")
  # 提取单年自由球员表格
  single_year_fa <- html_table(fa_node, header = TRUE)[[1]] |> 
    as.data.frame()
  
  # 过滤网页插入的重复表头行:第一列值为"Player"的行即为无效表头
  single_year_fa <- single_year_fa[single_year_fa[[1]] != "Player", ]
  
  # 新增赛季年份标识列,不覆盖原有数据
  single_year_fa$season <- target_year
  
  # 将处理完的单年表格存入列表
  table_list[[i]] <- single_year_fa
}

# 批量合并所有年份表格,自动对齐列
final_table <- bind_rows(table_list)

对应问题的解决逻辑

  • 列名不匹配报错:原循环内逐次rbind()的逻辑对列名、列顺序一致性要求极高,不同年份网页表格只要存在列顺序微调、少量字段增减就会报错。改用列表暂存分年表格、最后用bind_rows()统一合并的方案,函数会自动匹配同名字段,缺失字段自动填充NA,从根源上避免列匹配报错。
  • 重复表头行过滤:Basketball-Reference的长表格会分页插入和主表头完全一致的冗余行,这类行的统一特征是第一列(球员姓名字段)的值为Player,通过行索引过滤掉符合该特征的行即可,不会误删正常球员数据。
  • 年份标识列添加:之前写法失效是因为df[,1] <- 赋值会直接覆盖表格原有的第一列(球员姓名列),正确逻辑是给数据框新增一个不存在的列名直接赋值,即可在表中追加整列值为当前年份的标识字段,用于区分不同赛季的同名球员数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:18:42