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

在R中爬取国会记录遭遇403 Forbidden错误,该如何解决?

解决爬取Congressional Record时的403 Forbidden错误

给你几个针对性的解决办法,针对congress.gov的反爬机制调整你的代码:

1. 补充完整请求头,模拟真实浏览器

congress.gov的反爬可能会校验请求头的完整性,只传User-Agent不够。你可以添加浏览器常用的请求头字段,比如Accept、Accept-Language、Referer等:

# 定义完整请求头
headers <- 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',
  'Accept' = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  'Accept-Language' = 'en-US,en;q=0.5',
  'Referer' = 'https://www.congress.gov/'
)

# 修改get_urls_in_table函数,加入请求头与状态码检查
get_urls_in_table <- function(master_link) {
  with_user_agent <- GET(master_link, headers)
  # 提前检查请求状态,方便排查问题
  if (status_code(with_user_agent) == 403) {
    warning(paste("403错误:", master_link))
    return(NULL)
  }
  links <- read_html(with_user_agent) %>% html_nodes("td a") %>% html_attr('href') %>% as.data.frame()
  return(links)
}

2. 使用会话保持(handle)

网站可能会跟踪会话一致性,每次新建GET请求容易被识别为爬虫。用httr::handle()创建固定会话,所有请求复用这个会话:

# 初始化固定会话
congress_session <- handle("https://www.congress.gov")

# 修改两个爬取函数,复用会话
get_urls_in_table <- function(master_link) {
  with_user_agent <- GET(master_link, headers, handle = congress_session)
  if (status_code(with_user_agent) == 403) {
    warning(paste("403错误:", master_link))
    return(NULL)
  }
  links <- read_html(with_user_agent) %>% html_nodes("td a") %>% html_attr('href') %>% as.data.frame()
  return(links)
}

get_content <- function(x) {
  with_user_agent <- GET(x, headers, handle = congress_session)
  if (status_code(with_user_agent) == 403) {
    warning(paste("403错误:", x))
    return(NULL)
  }
  content <- read_html(with_user_agent) %>% html_nodes(".styled") %>% html_text()
  print("getting content")
  Sys.sleep(30)
  return(content)
}

3. 检查IP是否被临时封禁

如果上述方法都无效,大概率是你的IP被网站临时封禁了。可以换个网络环境(比如手机热点)测试,确认是否是IP的问题。

4. 尝试模拟真实浏览器(RSelenium)

如果网站用了JavaScript渲染或更严格的反爬,静态请求可能无法绕过。可以用RSelenium模拟真实浏览器操作:

library(RSelenium)

# 启动Chrome浏览器
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.congress.gov/congressional-record/108th-congress/browse-by-date")

# 获取页面链接
links <- remDr$findElements(using = "css selector", value = "td a")
hrefs <- sapply(links, function(x) x$getElementAttribute("href"))

# 爬取单篇内容示例
remDr$navigate(hrefs[1])
content <- remDr$findElement(using = "css selector", value = ".styled")$getElementText()

# 关闭浏览器
remDr$close()
driver$server$stop()

5. 确认网站爬取规则

先查看网站的robots.txt文件,确认你要爬取的路径是否被禁止,避免违反网站的爬取规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:37:24