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

使用rvest爬取HTML表格仅返回10行的原因及解决方法

问题原因

目标站点表格采用分页动态渲染机制,初始加载页面时仅返回第一页的10条数据,剩余数据需要触发分页操作后才会异步加载,因此直接爬取初始静态HTML只能获取到前10条结果。

解决方法

提供两种可行实现方案:

方案1:调用分页API(推荐,运行效率高)

通过浏览器开发者工具抓包可获取表格分页请求的后端接口,直接调用接口即可一次性拉取全量数据,示例代码如下:

library(httr)
library(jsonlite)

# 目标站点分页请求接口
api_url <- "https://cip.org.pt/wp-admin/admin-ajax.php"
# 构造请求参数,调整length参数为大于总数据量的数值即可一次性获取所有数据
req_params <- list(
  action = "get_associados",
  draw = 1,
  start = 0,
  length = 1000,
  `search[value]` = "",
  `search[regex]` = "false"
)

# 发送POST请求
response <- POST(api_url, body = req_params, encode = "form")
# 解析返回的JSON数据
res_data <- fromJSON(content(response, "text"))
# 提取全量表格数据
full_table <- res_data$data

使用该方案时如果发现获取到的数据不全,可将length参数调整为更大的数值即可。

方案2:模拟浏览器操作翻页(兼容性强)

如果站点存在接口反爬限制,可使用RSelenium模拟真实浏览器操作逐页提取数据,示例代码如下:

library(RSelenium)
library(rvest)

# 启动Chrome驱动,注意chromever需要和本地安装的Chrome版本一致
rd <- rsDriver(browser = "chrome", chromever = "你的Chrome对应版本号")
remDr <- rd$client
# 打开目标页面
remDr$navigate("https://cip.org.pt/associativismo/associados/")

all_page_data <- list()
page_idx <- 1
while(TRUE) {
  # 提取当前页表格数据
  page_source <- read_html(remDr$getPageSource()[[1]])
  current_table <- page_source %>% 
    html_nodes("table") %>% 
    html_table() %>% 
    .[[1]]
  all_page_data[[page_idx]] <- current_table
  
  # 尝试定位下一页按钮,按钮禁用则代表到最后一页,终止循环
  next_btn <- tryCatch({
    remDr$findElement(using = "css", ".paginate_button.next:not(.disabled)")
  }, error = function(e) {
    return(NULL)
  })
  if (is.null(next_btn)) break
  
  # 点击下一页,等待页面加载完成
  next_btn$clickElement()
  Sys.sleep(1)
  page_idx <- page_idx + 1
}

# 合并所有页数据为完整表格
full_table <- do.call(rbind, all_page_data)

# 关闭浏览器和驱动
remDr$close()
rd$server$stop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:48:00