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

