使用R的rvest包爬取CapitolTrades分页数据时始终返回首页内容的问题
爬取CapitolTrades分页内容的问题及解决方案
问题背景
已成功爬取CapitolTrades首页(https://www.capitoltrades.com/trades)的政客姓名,但通过https://www.capitoltrades.com/trades?page=NNN格式的URL爬取分页时,read_html()始终返回第一页内容,尝试过检查变量、自定义User-Agent、使用httr会话等方法均无效。
核心原因
CapitolTrades是基于React的单页应用(SPA),前端URL的page参数仅用于客户端路由,服务器返回的静态HTML始终是首页框架,分页数据由JavaScript动态调用API加载,read_html()只能获取初始静态内容,无法捕获动态渲染的分页数据。
解决方案
方案1:直接调用官方API(推荐,高效稳定)
通过浏览器开发者工具可发现,网站的交易数据来自官方API接口,直接调用API能绕过前端渲染问题,且数据结构更清晰。
library(httr2) library(jsonlite) library(dplyr) # API基础地址 api_base <- "https://api.capitoltrades.com/v1/trades" all_names <- c() # 遍历分页(自动识别是否有下一页) current_page <- 1 repeat { # 构造请求,添加必要请求头模拟浏览器 resp <- request(api_base) %>% req_url_query(page = current_page) %>% req_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" ) %>% req_perform() # 解析JSON响应 data <- resp_body_json(resp) # 提取当前页的政客姓名并去重 page_names <- data$results %>% sapply(function(item) item$politician$name) %>% unique() all_names <- c(all_names, page_names) # 无下一页则终止循环 if (!data$pagination$has_next) break current_page <- current_page + 1 } # 最终去重后的姓名列表 all_names <- unique(all_names)
方案2:使用浏览器渲染工具(模拟用户浏览)
如果不想分析API,可使用RSelenium模拟浏览器加载页面,获取动态渲染后的内容。
library(RSelenium) library(rvest) # 启动Chrome驱动(需提前安装Chrome浏览器及对应版本的chromedriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver$client all_names <- c() n_pages <- 10 # 可根据实际情况调整页数 for (page in 1:n_pages) { # 访问目标分页 remDr$navigate(paste0("https://www.capitoltrades.com/trades?page=", page)) # 等待页面加载完成(根据网络情况调整等待时间) Sys.sleep(3) # 获取页面源码并解析 page_source <- remDr$getPageSource()[[1]] page_html <- read_html(page_source) # 提取姓名 page_names <- page_html %>% html_elements(xpath = '//*[@id="__next"]/div/main/div/article/section/div[2]/div[1]/table/tbody/tr/td[1]/div/div/h3/a') %>% html_text() %>% unique() all_names <- c(all_names, page_names) } # 关闭浏览器驱动 remDr$close() driver$server$stop() # 去重处理 all_names <- unique(all_names)
内容的提问来源于stack exchange,提问作者help_pls
相关产品推荐
相关产品推荐

