R语言使用httr::GET请求NSE期权链接口无输出无响应问题求助
问题核心原因
- 代码里硬编码的Cookie是站点临时生成的,存在有效期,过期后请求会被NSE的反爬机制拦截,导致请求无响应一直挂起
- 请求头中添加了
method、path、scheme这类冗余字段,httr发送请求时会自动生成这些参数,人工添加错误值反而会导致请求异常 - 没有配置超时规则,请求被拦截后会无限等待没有输出
可行解决方案
方案1:手动处理会话实现爬取
先请求NSE首页获取有效会话Cookie,再携带有效Cookie请求期权链API,同时添加超时配置避免无限挂起,示例代码如下:
library(httr) library(jsonlite) # 第一步:创建会话,请求首页获取有效Cookie nse_session <- session("https://www.nseindia.com/option-chain", add_headers( `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", `Accept-Language` = "en-US,en;q=0.9" ), timeout(10)) # 第二步:携带会话Cookie请求期权链API res <- GET(url = "https://www.nseindia.com/api/option-chain-indices", query = list(symbol = "NIFTY"), add_headers( `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", `Accept` = "*/*", `X-Requested-With` = "XMLHttpRequest" ), timeout(10), set_cookies(.cookies = cookies(nse_session)$value)) # 解析返回结果 if (status_code(res) == 200) { option_data <- fromJSON(content(res, "text")) # 后续自行处理option_data中的期权表数据 print("数据获取成功") } else { print(paste0("请求失败,状态码:", status_code(res))) }
方案2:使用封装好的专用包
R生态中有专门对接NSE数据的nser包,已经内置处理了反爬逻辑,直接调用对应函数即可获取期权链数据:
# 首次使用先安装包 # install.packages("nser") library(nser) # 直接获取NIFTY期权链数据 nifty_oc <- option_chain("NIFTY")
注意事项
- 不要频繁发起请求,建议间隔10秒以上,避免被NSE封IP
- User-Agent可以根据自己的浏览器版本更新,降低被识别为爬虫的概率
内容的提问来源于stack exchange,提问作者Nad Pat
相关产品推荐
相关产品推荐

