多页网页表格爬取异常:仅获每页首条数据求助
问题解决:爬取BotRank网站表格仅获取每页首行数据
问题原因
你的代码中,lapply的函数最后一行是colnames(data) = data[1,]——在R语言里,赋值语句的返回值是右侧的data[1,](即每页的第一行数据),而非处理后的完整数据框。因此lapply最终只收集了每页的第一行,导致结果只有318行。
此外,网站表格的第一行是<th>标签,rvest::html_table()默认会自动将其识别为列名(header=TRUE),手动设置列名反而会导致数据混乱。
修正后的代码
方法一:自动识别表头(推荐)
利用html_table(header=TRUE)直接将<th>内容设为列名,无需手动处理:
library(rvest) library(dplyr) pages <- seq(1:318) bots <- lapply(pages, function(i){ # 添加1秒延迟,避免请求过于频繁 Sys.sleep(1) url <- paste0("https://botrank.pastimes.eu/?sort=rank&page=", i) webpage <- url %>% httr::GET(config = httr::config(ssl_verifypeer = FALSE)) %>% read_html() # 自动识别<th>作为列名 data <- webpage %>% html_node("table") %>% html_table(header = TRUE) %>% as_tibble() # 明确返回完整数据框 data }) bots_table <- do.call(rbind, bots) head(bots_table, n=10)
方法二:手动处理表头(适合表头识别异常场景)
如果自动识别表头出现问题,可以手动提取表头行并设置列名,再移除表头行:
library(rvest) library(dplyr) pages <- seq(1:318) bots <- lapply(pages, function(i){ Sys.sleep(1) url <- paste0("https://botrank.pastimes.eu/?sort=rank&page=", i) webpage <- url %>% httr::GET(config = httr::config(ssl_verifypeer = FALSE)) %>% read_html() # 不自动识别表头,先获取所有行 data <- webpage %>% html_node("table") %>% html_table(header = FALSE) %>% as_tibble() # 用第一行作为列名 colnames(data) <- data[1,] # 移除表头行,返回数据内容 data[-1,] }) bots_table <- do.call(rbind, bots) head(bots_table, n=10)
补充说明
- 添加
Sys.sleep(1)是为了给服务器留出缓冲时间,避免因高频请求被限制访问。 - 两种方法都能完整提取每页250条数据,最终
bots_table会包含318×250=79500条记录。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

