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

如何用R抓取等宽格式网站表格?批量抓取及分表指引

R网页抓取入门:批量提取NJCA球队数据并生成独立DataFrame

一、必备工具包

先安装并加载核心工具包:

install.packages(c("rvest", "dplyr", "purrr"))
library(rvest)
library(dplyr)
library(purrr)
  • rvest:负责解析HTML页面,提取表格等内容
  • dplyr:数据清洗与整理
  • purrr:实现批量操作

二、单页面数据抓取(以目标球队页为例)

目标页面包含3个数据板块,需用浏览器开发者工具(F12)定位每个板块的表格结构:

  1. 读取页面内容
target_url <- "https://www.njcaa.org/sports/bsb/2021-22/div1/teams/arizonawesterncollege?sort=ab&pos=h&tmpl=teaminfo-network-monospace-template"
page <- read_html(target_url)
  1. 提取三个板块的DataFrame
    通过CSS选择器定位每个表格(替换为你在开发者工具中找到的实际选择器,比如表格的id或class):
# 板块1:打击数据
df_hitting <- page %>% 
  html_element("table#hitting-stats") %>%  # 示例选择器,需自行验证
  html_table(header = TRUE) %>% 
  as_tibble()

# 板块2:投球数据
df_pitching <- page %>% 
  html_element("table#pitching-stats") %>% 
  html_table(header = TRUE) %>% 
  as_tibble()

# 板块3:防守数据
df_fielding <- page %>% 
  html_element("table#fielding-stats") %>% 
  html_table(header = TRUE) %>% 
  as_tibble()

提示:右键目标表格→「检查」,查看表格的HTML属性(如id="hitting-stats"),用这个属性作为选择器更稳定。

三、批量抓取核心思路

1. 收集所有目标URL

先从NJCA的球队列表页抓取所有球队的详情页链接:

team_list_url <- "https://www.njcaa.org/sports/bsb/2021-22/div1/teams"
team_page <- read_html(team_list_url)

# 提取所有球队的完整URL
team_urls <- team_page %>% 
  html_elements("a.team-link") %>%  # 替换为实际选择器
  html_attr("href") %>% 
  paste0("https://www.njcaa.org", .)  # 补全绝对路径

2. 封装批量抓取函数

把单页面的抓取逻辑写成函数,用map批量处理:

# 定义单球队数据抓取函数
scrape_team <- function(url) {
  # 加延迟避免反爬
  Sys.sleep(2)
  
  page <- read_html(url)
  team_name <- basename(url)  # 提取球队名称作为标识
  
  # 抓取三个板块并添加球队标识
  hitting <- page %>% 
    html_element("table#hitting-stats") %>% 
    html_table(header = TRUE) %>% 
    as_tibble() %>% 
    mutate(team = team_name)
  
  pitching <- page %>% 
    html_element("table#pitching-stats") %>% 
    html_table(header = TRUE) %>% 
    as_tibble() %>% 
    mutate(team = team_name)
  
  fielding <- page %>% 
    html_element("table#fielding-stats") %>% 
    html_table(header = TRUE) %>% 
    as_tibble() %>% 
    mutate(team = team_name)
  
  # 返回三个DataFrame的列表
  list(hitting = hitting, pitching = pitching, fielding = fielding)
}

# 批量抓取所有球队数据
all_data <- map(team_urls, scrape_team)

# 合并同类型数据(可选,得到全联盟的打击/投球/防守总表)
all_hitting <- map_dfr(all_data, "hitting")
all_pitching <- map_dfr(all_data, "pitching")
all_fielding <- map_dfr(all_data, "fielding")

四、关键注意事项

  • 反爬策略:添加Sys.sleep()延迟,避免短时间内大量请求被网站封禁
  • 数据清洗:抓取的表格可能包含重复表头、空行,需用filter()或slice()清理
  • 选择器维护:网站HTML结构可能更新,定期验证选择器有效性,及时调整

内容的提问来源于stack exchange,提问作者MichaelSampson123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:15:38