使用R抓取网页数据时遭网站禁止,但浏览器可正常访问
解决BLS数据导入HTTP 403错误的方案
遇到fread直接请求BLS静态文件返回403,甚至自定义User Agent也无效,大概率是BLS服务器对请求头校验严格,或是RStudio Cloud的IP被服务器拦截了。以下是几种可行的解决方法:
方法1:用httr构造完整请求头后读取
BLS服务器可能需要更贴近浏览器的请求头才能放行,用httr包手动构建请求,再将响应内容传给fread:
library(httr) library(data.table) # 模拟标准浏览器的请求头 request_headers <- add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", `Accept` = "text/plain, */*; q=0.8", `Accept-Language` = "en-US,en;q=0.5", `Connection` = "keep-alive" ) # 发送GET请求 resp <- GET("https://download.bls.gov/pub/time.series/cu/cu.series", request_headers) # 检查请求是否成功,失败则抛出错误 stop_for_status(resp) # 将响应文本转为data.table cu_series <- fread(content(resp, as = "text"))
方法2:使用BLS官方API获取数据
直接爬取静态文件容易触发反爬,建议用BLS官方API接口获取数据,避免403拦截。可以用blsAPI包:
library(blsAPI) library(data.table) # 获取CPI系列的元数据(对应cu.series的内容) api_response <- blsAPI('CU', catalog = TRUE) # 转为data.table格式 cu_series <- as.data.table(api_response$catalog)
注意:未申请API密钥时,API调用有每日50次的限制;如果需要更高频次,可在BLS官网申请免费密钥后,在blsAPI中通过registrationKey参数传入。
方法3:本地下载后上传至RStudio Cloud
如果上述方法都无效,可能是RStudio Cloud的IP段被BLS屏蔽。可以先在本地浏览器打开目标URL下载cu.series文件,再上传到RStudio Cloud的工作目录,最后用fread读取本地文件:
cu_series <- fread("cu.series")
内容的提问来源于stack exchange,提问作者Zhaochen He
相关产品推荐
相关产品推荐

