You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:14:10