如何免费调用NSE API获取历史数据,解决代码/Postman调用报错问题
NSE接口访问异常解决方案
问题根因
NSE官方站点配置了严格的反爬校验规则,会对所有请求的请求头完整性、会话Cookie合法性、来源属性进行校验,你直接通过代码/Postman发送的裸请求缺少必要校验字段,同时也未提前获取合法会话凭证,因此会被拦截,出现挂起、401报错的情况。另外你在前端直接发送跨域请求时,浏览器的同源策略也会拦截请求,导致无响应。
具体解决步骤
- 补全标准浏览器请求头,必须包含
User-Agent、Accept、Accept-Language、Referer四个核心字段,字段值可以直接从你浏览器访问NSE站点时的开发者工具网络面板中复制,不要使用代码、Postman默认的请求头参数,避免被识别为爬虫。 - 先请求NSE首页获取合法会话Cookie,再调用业务API。NSE会给首次合法访问的请求下发会话Cookie,后续所有API调用必须携带该Cookie才能通过校验,不要直接跳过首页请求直接调用业务接口。
- 不要在前端直接调用NSE接口,NSE未配置跨域资源共享规则,前端XMLHttpRequest发送的跨域请求会被浏览器直接拦截,建议通过自己的后端服务代理转发请求,或者直接用服务端脚本调用接口。
调试&调用示例
Postman调试方法:先在浏览器访问NSE官网,打开F12开发者工具的网络面板,复制浏览器请求中的全部Cookie、User-Agent、Referer字段,粘贴到Postman的请求头配置中,再发送请求即可正常拿到返回。
以下是Python服务端调用的示例代码:
import requests # 替换为你自己浏览器中复制的请求头参数 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": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Referer": "https://www.nseindia.com/" } # 创建会话自动维护Cookie session = requests.Session() # 先请求首页获取合法Cookie session.get("https://www.nseindia.com", headers=headers, timeout=10) # 替换为你需要查询的证券代码后调用业务接口 resp = session.get("https://www.nseindia.com/api/quote-equity?symbol=RELIANCE", headers=headers, timeout=10) print(resp.json())
注意事项
- 不要短时间内发送大量高频请求,否则会被NSE临时封禁IP,建议请求间隔至少1秒以上。
- 请求头中的User-Agent要定期更新,和主流浏览器版本保持一致,避免被识别为过时的爬虫请求。
内容的提问来源于stack exchange,提问作者keepmoving
相关产品推荐
相关产品推荐

