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

如何用多变量生成链接批量爬取PGA Tour赛事统计数据?

解决PGA Tour数据爬取的全组合URL生成问题

你的问题出在URL生成阶段:原来的paste()是按向量元素的对应位置拼接,只生成了3组一一对应的URL,而你需要的是stat_id和tournament_id的所有两两组合(笛卡尔积),总共9个URL。下面是修改方案:

步骤说明

  1. 先生成stat_id和tournament_id的全组合(笛卡尔积)
  2. 基于每个组合拼接完整URL
  3. 循环爬取所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:36:21