如何用R抓取Transfermarkt网页表格多页数据及补全国家名称
解决方案
问题1:补充国家名称
Transfermarkt网页中,国旗图片的alt属性存储了对应的国家名称,需要单独提取后添加到数据框中,而非仅依赖html_table抓取。
问题2:多页数据抓取
该网站的分页参数为page,在原URL后追加&page=页码即可访问对应页面,通过循环遍历1-17页实现批量抓取。
完整代码
library(rvest) library(dplyr) library(purrr) library(httr) # 定义单页抓取函数 scrape_tm_page <- function(page_num) { # 构造目标页面URL url <- paste0("https://www.transfermarkt.com/wettbewerbe/europa/wettbewerbe?plus=1&page=", page_num) # 模拟浏览器请求,避免反爬拦截 session <- html_session(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")) # 抓取表格数据 raw_table <- session %>% html_nodes("table.items") %>% html_table(fill = TRUE) %>% .[[1]] # 提取国旗对应的国家名称 country_list <- session %>% html_nodes("table.items img.flaggenrahmen") %>% html_attr("alt") # 清理表格并添加国家列 cleaned_table <- raw_table %>% filter(!is.na(Rang)) %>% # 过滤重复的表头行 mutate(Country = country_list) %>% select(Rang, Country, everything()) # 调整列顺序,将国家列前置 return(cleaned_table) } # 批量抓取1-17页数据并合并 all_competitions <- map_df(1:17, scrape_tm_page) # 查看结果示例 head(all_competitions)
关键说明
user_agent设置:模拟浏览器请求,避免被网站的反爬机制拦截。- 选择器验证:如果后续网站结构更新,需检查
table.items(目标表格类)和img.flaggenrahmen(国旗图片类)是否仍有效,可通过浏览器开发者工具确认。 - 表格清理:
html_table可能会抓取到重复的表头行,通过filter(!is.na(Rang))过滤空值行保证数据整洁。
内容的提问来源于stack exchange,提问作者user2165379
相关产品推荐
相关产品推荐

