如何用R爬取FBRef球员数据?URL随机ID生成难题求解
解决FBRef球员比赛日志URL中随机ID的爬取方案
方法一:通过搜索接口动态获取球员ID
FBRef的搜索功能可以返回匹配球员的主页链接,从中提取随机ID后再拼接比赛日志URL,这是处理单/少量球员的直接方式:
library(rvest) library(stringr) library(glue) # 定义函数:根据球员名获取FBRef唯一ID get_fbref_player_id <- function(player_name) { # 构造搜索请求URL search_url <- glue("https://fbref.com/en/search/search.fcgi?search={URLencode(player_name)}") # 读取搜索页面 search_page <- read_html(search_url) # 提取第一个匹配球员的主页链接(若有同名需额外筛选,比如俱乐部) player_link <- search_page %>% html_elements(".search-item-url a") %>% html_attr("href") %>% .[1] # 从链接中提取8位随机ID player_id <- str_extract(player_link, "/players/([a-f0-9]{8})/") %>% str_remove_all("/players/|/") return(player_id) } # 测试获取目标球员ID rashford_id <- get_fbref_player_id("Marcus Rashford") haaland_id <- get_fbref_player_id("Erling Haaland") # 构造2022-2023赛季比赛日志URL rashford_logs_url <- glue("https://fbref.com/en/players/{rashford_id}/matchlogs/2022-2023") haaland_logs_url <- glue("https://fbref.com/en/players/{haaland_id}/matchlogs/2022-2023")
方法二:批量爬取索引页建立ID映射表
如果需要处理大量球员,建议先爬取FBRef的球员索引页面(比如联赛/国家队的球员列表),提前建立「球员名-ID」映射表,后续直接查表生成URL:
# 示例:爬取英超2022-2023赛季球员索引 prem_index_url <- "https://fbref.com/en/comps/9/2022-2023/2022-2023-Premier-League-Stats" prem_page <- read_html(prem_index_url) # 提取所有球员的链接和姓名 player_data <- prem_page %>% html_elements("#stats_standard tr") %>% html_elements("td[data-stat='player'] a") %>% tibble( player_name = html_text(.), player_link = html_attr("href") ) %>% mutate(player_id = str_extract(player_link, "/players/([a-f0-9]{8})/") %>% str_remove_all("/players/|/")) # 后续通过姓名匹配ID target_players <- c("Marcus Rashford", "Erling Haaland") target_ids <- player_data %>% filter(player_name %in% target_players) %>% pull(player_id)
注意事项
- 每次请求后添加
Sys.sleep(2)延迟,避免触发网站反爬机制 - 若搜索结果出现同名球员,需在函数中加入俱乐部、国籍等筛选条件(比如从搜索结果的
.search-item-details中提取信息判断)
内容的提问来源于stack exchange,提问作者user12025050
相关产品推荐
相关产品推荐

