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

使用Rvest爬取美国国务院网站遭遇403访问禁止问题求助

解决Rvest爬取美国国务院新闻稿时403访问被拒的方案

问题背景

此前定期使用Rvest爬取美国国务院新闻稿,突然收到403访问禁止响应,更换多台电脑及云平台尝试后结果一致,且无法访问该站点的RSS订阅源https://www.state.gov/rss-feed/press-releases/feed/,核心代码如下:

options(stringsAsFactors = F)         # no automatic data transformation
options("scipen" = 999, "digits" = 4) # suppress math annotation
library(tidyverse)
library(rvest)
library(readtext)
library(webdriver)
library(gsubfn)
library(lubridate)
library(stringr)
library(readxl)
library(urltools)
library(crul)
############################********Department_of_State*****##################################

HEADERS <- list(
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
  
)


US_Gov=tibble(url="https://www.state.gov/press-releases/page/",page=1)
US_Gov=rbind(US_Gov, US_Gov[rep(1, 4), ])
US_Gov=US_Gov %>% mutate(page=row_number())
US_Gov$page=paste0(US_Gov$url,US_Gov$page,"/")

df=US_Gov$page


ttt=lapply(df,function(x){
  
  HttpClient$new(x, header=HEADERS)$get()
})



t4=lapply(ttt,function(x){
  read_html(x$parse())
})

links=lapply(t4,function(x){
  html_attr(html_nodes(x, "a"), "href")
  
})

class=lapply(t4,function(x){
  html_attr(html_nodes(x, "a"), "class")
  
})



US_Links=plyr::ldply(links, cbind)
US_Class=plyr::ldply(class, cbind)


US_Data=bind_cols(US_Links,US_Class)

解决方案

1. 完善请求头字段

单一User-Agent易被识别为爬虫,补充更多真实浏览器的请求头信息,模拟正常用户访问:

HEADERS <- list(
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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.state.gov/",
  "DNT" = "1",
  "Connection" = "keep-alive",
  "Upgrade-Insecure-Requests" = "1"
)

2. 添加请求延迟

频繁无间隔的请求会触发反爬机制,在每次请求间添加随机延迟:

ttt <- lapply(df, function(x){
  Sys.sleep(runif(1, min = 1, max = 3)) # 随机延迟1-3秒
  HttpClient$new(x, header=HEADERS)$get()
})

3. 使用Session维持会话状态

改用crul的Session对象维持会话,模拟用户连续访问的行为,避免每次请求都新建连接:

session <- Session$new(url = "https://www.state.gov", headers = HEADERS)
ttt <- lapply(df, function(x){
  Sys.sleep(runif(1, 1, 3))
  session$get(x)
})

4. 优化RSS源访问

针对RSS源,添加适配的Accept请求头,确保请求格式匹配:

rss_headers <- list(
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
  "Accept" = "application/rss+xml,application/xml;q=0.9,*/*;q=0.8"
)
rss_response <- HttpClient$new("https://www.state.gov/rss-feed/press-releases/feed/", header = rss_headers)$get()

# 若请求成功,解析RSS内容
if(rss_response$status_code == 200){
  library(xml2)
  rss_xml <- read_xml(rss_response$parse())
  titles <- xml_text(xml_find_all(rss_xml, "//item/title"))
  links <- xml_text(xml_find_all(rss_xml, "//item/link"))
}

5. 排查IP封禁问题

若上述方法无效,可能IP段被网站封禁:

  • 查看网站robots.txt(访问https://www.state.gov/robots.txt)确认爬取权限
  • 尝试使用合规代理IP更换访问IP(注意遵守网站使用条款)
  • 联系网站管理员确认是否存在误封禁情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:41