使用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
相关产品推荐
相关产品推荐

