使用R语言rvest包爬取多页表格并合并为数据框的代码调整方法
R多页表格爬取调整方案
方案1:指定爬取页数
适用于明确知晓需要爬取的页面数量的场景,直接修改页码范围即可生效。
library(rvest) library(dplyr) library(purrr) # 定义基础链接,页码位置用%s做占位符 base_url <- "https://www.worldathletics.org/records/toplists/sprints/100-metres/outdoor/women/senior/2021?page=%s" # 指定要爬取的页码范围,示例为爬取前5页,可按需修改 page_range <- 1:5 # 批量爬取每个页面的表格 all_tables <- map(page_range, function(page_num) { current_url <- sprintf(base_url, page_num) WA_page <- read_html(current_url) WA_table <- WA_page %>% html_nodes("table.records-table") %>% html_table() %>% .[[1]] # 设置1秒延迟,避免请求频率过高被网站限制 Sys.sleep(1) return(WA_table) }) # 合并所有页面表格为单个数据框 final_df <- bind_rows(all_tables)
如果不想额外安装purrr包,把map替换为base R的lapply即可,后续合并逻辑不变。
方案2:自动识别总页数爬取全部内容
适用于不清楚总页面数量的场景,会先读取第一页的分页栏获取总页数,再完成全量爬取。
library(rvest) library(dplyr) library(purrr) base_url <- "https://www.worldathletics.org/records/toplists/sprints/100-metres/outdoor/women/senior/2021?page=%s" # 读取第一页提取总页数 first_page <- read_html(sprintf(base_url, 1)) total_pages <- first_page %>% # 选择分页栏非「下一页」的页码元素,若网站结构调整可自行修改选择器 html_nodes(".pagination li:not(.next) a") %>% html_text() %>% as.integer() %>% max(na.rm = TRUE) # 批量爬取所有页面表格 all_tables <- map(1:total_pages, function(page_num) { current_url <- sprintf(base_url, page_num) WA_page <- read_html(current_url) WA_table <- WA_page %>% html_nodes("table.records-table") %>% html_table() %>% .[[1]] Sys.sleep(1) return(WA_table) }) final_df <- bind_rows(all_tables)
注意事项
- 若运行时出现分页选择器报错,可通过浏览器F12审查分页元素的class属性,调整
html_nodes中的匹配规则即可 - 可根据自身网络情况调整
Sys.sleep的等待时长,网络不稳定时建议适当延长,减少爬取失败概率
内容的提问来源于stack exchange,提问作者CarlosFC
相关产品推荐
相关产品推荐

