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

R调用NSE印度证券期权API报HTTP 401错误,无需浏览器如何获取数据?

问题原因
  • 报错HTTP error 401代表请求未通过站点的鉴权校验。NSE印度国家证券交易所的API接口配置了反爬机制,需要验证请求头中的User-Agent、Referer以及合法的会话Cookie信息才会返回数据。
  • 直接使用jsonlite::fromJSON发起的是无额外参数的裸请求,没有携带上述校验所需的字段,因此被站点拦截。
  • 你先打开浏览器访问站点后,浏览器已经获取了站点下发的合法会话Cookie,此时本地发起的同域名请求会自动携带已缓存的有效Cookie,因此可以正常获取数据。
无需打开浏览器的解决方案

使用httr包构造符合站点校验规则的请求,主动获取合法Cookie后再请求API接口即可,示例代码如下:

# 加载所需包
library(httr)
library(jsonlite)

# 配置请求头,模拟浏览器请求
req_headers <- c(
  "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",
  "Referer" = "https://www.nseindia.com/option-chain",
  "Accept-Encoding" = "gzip, deflate, br",
  "Accept" = "application/json, text/javascript, */*; q=0.01"
)

# 第一步:访问主页面获取合法会话Cookie
main_page <- GET("https://www.nseindia.com/option-chain", add_headers(.headers = req_headers))
# 提取响应中的Cookie
session_cookies <- cookies(main_page)

# 第二步:携带Cookie请求目标API接口
api_resp <- GET(
  "https://www.nseindia.com/api/option-chain-equities?symbol=IOC",
  add_headers(.headers = req_headers),
  set_cookies(.cookies = setNames(session_cookies$value, session_cookies$name))
)

# 校验请求是否成功
if (http_status(api_resp)$category == "Success") {
  # 解析JSON数据
  dat <- fromJSON(content(api_resp, as = "text"))
  print("数据获取成功")
} else {
  print(paste("请求失败,状态码:", status_code(api_resp)))
}
  • 代码原理是主动模拟浏览器的完整访问流程,先请求主页面拿到站点下发的有效Cookie,再携带Cookie和合法请求头访问API,不需要手动打开浏览器操作。
  • 若后续请求失败,可更新User-Agent值为你自己浏览器的真实UA标识即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:42:03