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

多页网页表格爬取异常:仅获每页首条数据求助

问题解决:爬取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:25:31