使用rvest爬取FBREF英超防守数据时返回空列表求助
解决FBREF英超球员防守数据爬取问题
问题原因分析
FBREF页面中球队统计表格是默认优先加载的静态内容,球员防守数据表格虽为静态渲染,但需精准定位其容器元素才能与球队表格区分,同时部分情况下网站会拦截无浏览器标识的请求,导致无法获取目标表格。
解决方案
1. 精准定位表格并模拟浏览器请求
球员防守数据表格被包裹在div#div_stats_defense容器内,结合模拟浏览器请求避免拦截:
library(rvest) library(dplyr) # 目标URL url <- "https://fbref.com/en/comps/9/defense/Premier-League-Stats" # 模拟浏览器请求读取页面 page <- read_html(url, user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") # 获取球员防守数据表格 def_stats_list <- page %>% html_nodes("div#div_stats_defense table") %>% html_table(header = TRUE, fill = TRUE) # 转换为数据框(列表第一个元素即为目标表格) def_stats_df <- def_stats_list[[1]]
2. 清洗多级表头(可选)
FBREF表格存在多级表头,可通过以下代码合并并整理:
# 合并多级表头 names(def_stats_df) <- paste(def_stats_df[1, ], def_stats_df[2, ], sep = "_") def_stats_df <- def_stats_df[-c(1,2), ] # 转换数据类型(按需调整列范围) def_stats_df <- def_stats_df %>% mutate(across(-c(Player, Squad, Nation, Pos, Age), as.numeric))
常见排查点
- 若仍返回空列表:更换
user_agent字符串(可使用任意主流浏览器的UA标识),或检查网络连接; - 表格数据截断:确保
html_table参数fill = TRUE已开启,避免因单元格缺失导致数据丢失。
内容的提问来源于stack exchange,提问作者gunner14
相关产品推荐
相关产品推荐

