向NSE Option Chain API发送请求的正确方法是什么?
问题原因
不需要部署到受信任域名,问题出在请求缺少必要的会话凭证和请求头校验。
NSE的接口有两层基础反爬校验:
- 所有API请求必须携带从NSE主站下发的合法会话Cookie,直接访问API接口会被判定为未授权访问,返回401
- 请求头必须携带
Referer字段,值设置为NSE主站地址,缺失的话也会被拦截
你浏览器能正常访问是因为你之前访问过NSE主站,浏览器已经自动保存了有效Cookie,请求时会自动带上;在线Python工具偶尔能跑通是因为它的IP没被NSE临时封禁,且请求时恰好命中了无Cookie校验的临时窗口期。
修复后代码示例
import requests # 先创建会话对象,自动管理Cookie session = requests.Session() headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US', # 新增Referer字段 'Referer': 'https://www.nseindia.com/' } # 先请求主站获取Cookie session.get('https://www.nseindia.com/', headers=headers) url = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY" # 用带Cookie的会话请求API res = session.get(url, headers=headers) # 打印返回结果验证 print(res.json())
注意事项
- 控制请求频率,不要短时间内多次请求,NSE对单个IP的请求频率限制比较严格,高频请求会触发IP封禁,导致长时间无响应
- 如果出现401错误,可以重新创建会话对象,再次请求主站获取新的Cookie即可
- 本地运行时不要使用公共代理,大部分公共代理IP已经被NSE拉黑,会直接被拦截
内容的提问来源于stack exchange,提问作者Ashutosh
相关产品推荐
相关产品推荐

