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

