如何用R抓取等宽格式网站表格?批量抓取及分表指引
R网页抓取入门:批量提取NJCA球队数据并生成独立DataFrame
一、必备工具包
先安装并加载核心工具包:
install.packages(c("rvest", "dplyr", "purrr")) library(rvest) library(dplyr) library(purrr)
rvest:负责解析HTML页面,提取表格等内容dplyr:数据清洗与整理purrr:实现批量操作
二、单页面数据抓取(以目标球队页为例)
目标页面包含3个数据板块,需用浏览器开发者工具(F12)定位每个板块的表格结构:
- 读取页面内容
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)
- 提取三个板块的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
相关产品推荐
相关产品推荐

