如何用多变量生成链接批量爬取PGA Tour赛事统计数据?
解决PGA Tour数据爬取的全组合URL生成问题
你的问题出在URL生成阶段:原来的paste()是按向量元素的对应位置拼接,只生成了3组一一对应的URL,而你需要的是stat_id和tournament_id的所有两两组合(笛卡尔积),总共9个URL。下面是修改方案:
步骤说明
- 先生成
stat_id和tournament_id的全组合(笛卡尔积) - 基于每个组合拼接完整URL
- 循环爬取所有URL的数据并合并
修改后的完整代码
library(rvest) library(dplyr) library(tidyr) # 用于生成笛卡尔积 tournament_id <- c("t041", "t054", "t464") stat_id <- c("02568", "02567", "02564") # 生成所有stat_id和tournament_id的笛卡尔积组合 id_combinations <- crossing(stat_id = stat_id, tournament_id = tournament_id) # 拼接每个组合对应的URL url_g <- pmap_chr(id_combinations, function(stat_id, tournament_id) { paste0('https://www.pgatour.com/stats/stat.', stat_id, '.y2019.eon.', tournament_id,'.html') }) # 循环爬取数据,加入错误处理避免中断 test_table_pga4 <- lapply(url_g, function(i){ tryCatch({ page2 <- read_html(i) page2 %>% html_nodes("#statsTable") %>% html_table() %>% .[[1]] %>% mutate(tournament_url = i, stat_id = str_extract(i, "stat\\.(\\d+)\\.y2019", group = 1), tournament_id = str_extract(i, "eon\\.(\\w+)\\.html", group = 1)) }, error = function(e) { message(paste("爬取URL失败:", i, "错误信息:", e$message)) return(tibble()) # 返回空表避免合并出错 }) }) # 合并所有爬取到的数据表 test_golf7 <- bind_rows(test_table_pga4) %>% as_tibble()
关键修改点
- 使用
tidyr::crossing()生成两个向量的全组合,替代原来的按位置对应 - 用
pmap_chr()遍历组合拼接URL,确保每个stat和tournament的组合都生成对应的链接 - 加入
tryCatch()错误处理,避免单个URL爬取失败导致整个循环中断 - 新增
stat_id和tournament_id列,方便后续数据筛选分析,不用从URL里提取
内容的提问来源于stack exchange,提问作者DonnyDolio
相关产品推荐
相关产品推荐

