如何用purrr包修改URL参数实现多赛季足球数据爬取?
解决多参数爬虫的purrr实现方案
你已经写好了处理单赛季单页面的函数page_season_func,接下来只需要生成赛季和页码的所有组合,再用purrr的多参数映射函数批量调用这个函数就可以了。下面是具体的实现步骤:
步骤1:生成所有目标赛季的序列
首先我们生成从1956-1957到2017-2018的完整赛季字符串列表:
# 自动生成赛季向量 seasons <- paste0(1956:2017, "-", 1957:2018)
这段代码会输出"1956-1957"、"1957-1958"……直到"2017-2018"的所有赛季值。
步骤2:创建赛季与页码的组合
假设每个赛季的页码范围都是1到11(和你爬取2017-2018赛季的范围一致),我们用tidyr::crossing生成所有可能的组合,得到一个包含所有赛季和对应页码的数据框:
library(tidyverse) season_page_pairs <- crossing( seizoen = seasons, page = 1:11 )
步骤3:用pmap_df批量调用爬虫函数
purrr的pmap_df是处理多参数函数的利器——它会把组合数据框的每一行作为参数(对应page_season_func的seizoen和page),自动执行函数并将所有结果合并成一个统一的tibble:
library(rvest) # 格式化后的原函数(提升可读性) page_season_func <- function(seizoen, page) { cat(".") read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-", seizoen, "/nach-name/", page)) %>% html_nodes("table") %>% html_table() %>% as.data.frame() %>% as.tbl() %>% select(Speler, Team, Geboren, Lengte, Positie) %>% add_column(year = seizoen) } # 批量爬取并合并所有数据 all_season_data <- season_page_pairs %>% pmap_df(page_season_func)
可选:添加错误处理避免中断
考虑到部分赛季可能不存在或页码数不足11,爬取时可能出现报错中断。你可以用purrr::possibly包装爬虫函数,让它遇到错误时返回空数据框,继续执行后续爬取:
# 包装函数,错误时返回空tibble safe_page_season_func <- possibly(page_season_func, otherwise = tibble()) # 带错误处理的批量爬取 all_season_data <- season_page_pairs %>% pmap_df(safe_page_season_func)
替代方案:嵌套map调用
如果你更习惯嵌套写法,也可以先遍历每个赛季,再在每个赛季内部遍历页码:
all_season_data <- map_df(seasons, function(current_season) { map_df(1:11, ~page_season_func(current_season, .x)) })
这样就能一次性获取1956-1957到2017-2018所有赛季的球员数据了。
内容的提问来源于stack exchange,提问作者Tdebeus
相关产品推荐
相关产品推荐

