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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:54