使用rvest爬取多页网页表格仅能获取前10条数据如何解决
爬取不到全量数据的原因
该站点的士兵表格采用异步分页加载逻辑,首次访问页面仅返回第一页共10条数据,剩余数据需要切换页码时由浏览器在后台发起请求动态加载,因此静态爬取首页源码只能获取到前10条记录。
解决方案
可以选择以下两种方案实现全量数据爬取:
方案1:模拟分页接口请求(效率更高)
- 打开浏览器开发者工具(F12),切换到「网络」面板,筛选「XHR/ fetch」类型的请求
- 点击表格的第二页,找到对应的分页数据请求,查看请求地址、请求参数和响应格式:通常这类请求会包含
paged(页码)、per_page(每页返回条数)两类核心参数 - 可以先尝试将
per_page参数值改为31385,确认接口是否支持一次性返回全量数据;如果不支持则构造循环,依次请求每一页的数据后合并 - 请求时注意添加User-Agent请求头,避免被站点拦截
示例代码逻辑:
library(httr) library(jsonlite) library(dplyr) # 替换为你抓到的实际接口地址和参数模板 base_url <- "你抓到的分页接口地址" total_page <- 3139 # 按每页10条算总页数约3139页,可根据接口返回的总页数调整 all_data <- data.frame() for (i in 1:total_page) { res <- GET( url = base_url, query = list(paged = i, per_page = 10), # 替换为实际的请求参数 add_headers("User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") ) # 解析响应数据,根据接口返回的是JSON还是HTML片段调整解析逻辑 page_data <- content(res, as = "text") %>% read_html() %>% html_nodes("table") %>% html_table(fill = T) %>% as.data.frame() all_data <- bind_rows(all_data, page_data) # 加延时避免请求过快被封 Sys.sleep(1) }
方案2:用RSelenium模拟浏览器操作(门槛更低)
如果不想抓接口,可以直接用RSelenium模拟真实浏览器翻页,爬取每一页的表格数据后合并:
library(RSelenium) library(rvest) library(dplyr) # 启动浏览器驱动 driver <- rsDriver(browser = "chrome", chromever = "你本地安装的Chrome对应版本") remDr <- driver$client remDr$navigate("https://irelandsgreatwardead.ie/the-archive/") all_data <- data.frame() total_page <- 3139 # 也可以从页面元素获取总页码数 for (i in 1:total_page) { # 解析当前页表格 page_source <- remDr$getPageSource()[[1]] page_data <- read_html(page_source) %>% html_nodes("table") %>% html_table(fill = T) %>% as.data.frame() all_data <- bind_rows(all_data, page_data) # 点击下一页按钮,替换为实际的下一页按钮CSS选择器 next_btn <- remDr$findElement(using = "css selector", value = "下一页按钮的CSS选择器") next_btn$clickElement() Sys.sleep(1) } # 关闭驱动 remDr$close() driver$server$stop()
内容的提问来源于stack exchange,提问作者natalieee
相关产品推荐
相关产品推荐

