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

使用R的httr包请求US BLS接口返回403,Python requests则返回200

解决R httr请求BLS网站返回403,而Python requests返回200的问题

尝试从美国劳工统计局(BLS)获取CPI发布日期时,用R的httr包请求https://www.bls.gov/bls/news-release/cpi.htm返回403状态码,但用Python requests包发起相同User-Agent的请求却返回200。

问题代码示例

R代码(返回403)

library(httr)

p = GET(
  "https://www.bls.gov/bls/news-release/cpi.htm",
  user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36")
)
status_code(p)
# [1] 403

Python代码(返回200)

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}

p = requests.get("https://www.bls.gov/bls/news-release/cpi.htm", headers=headers)

p.status_code
# 200

问题原因

差异核心在于httr默认携带的请求头与Python requests的默认请求头不一致,BLS的服务器反爬机制识别到httr的请求特征后进行了拦截。比如:

  • httr默认的Accept头为*/*,而Python requests默认的Accept头更贴近真实浏览器的取值
  • httr缺少Accept-Language、Upgrade-Insecure-Requests等浏览器常用请求头

解决方案

手动添加完整的请求头,模拟Python requests的默认请求头集合,让R的请求更贴近浏览器或Python请求的格式:

修正后的R代码

library(httr)

# 模拟Python requests默认的请求头组合
request_headers = add_headers(
  `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.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",
  `Accept-Encoding` = "gzip, deflate, br",
  `Connection` = "keep-alive",
  `Upgrade-Insecure-Requests` = "1"
)

p = GET(
  "https://www.bls.gov/bls/news-release/cpi.htm",
  request_headers
)

status_code(p)
# 预期返回200

验证思路

可以通过str(p$headers)查看httr默认发送的请求头,对比Python中print(p.request.headers)输出的请求头,精准定位差异字段,针对性补充即可解决403拦截问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:30:23