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
相关产品推荐
相关产品推荐

