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

Python请求NSE India接口遇401及JSONDecodeError问题求助

问题排查与修复方案

嘿,你的问题其实是连锁反应:请求返回401未授权状态码导致后续JSON解析失败。服务器拒绝了你的请求,返回的根本不是预期的JSON数据(大概率是错误页面的HTML),所以json.loads()才会抛出Expecting value: line 1 column 1的错误——它从第一个字符开始就找不到JSON格式的内容。

下面一步步帮你解决:

1. 先确认服务器返回的真实内容

先运行这段代码,看看响应到底是什么,明确问题根源:

import requests
new_url = 'https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY'
headers = {'User-Agent':'Mozilla/5.0'}
response = requests.get(new_url, headers=headers)
print("状态码:", response.status_code)
print("响应内容前500字符:\n", response.text[:500])

你大概率会看到一堆HTML代码(比如登录提示或验证页面),这就说明NSE的API现在光靠User-Agent已经绕不开反爬机制了。

2. 完善请求头并使用会话保持Cookie

NSE的API需要更完整的请求头,还得携带从主页获取的有效Cookie。试试这段优化后的代码:

import requests
import pandas as pd

# 用Session保持会话,自动管理Cookie
session = requests.Session()
base_url = 'https://www.nseindia.com/'
api_url = 'https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY'

# 模拟真实浏览器的请求头,尽量完整
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': base_url,
    'Accept': 'application/json, text/plain, */*',
    'X-Requested-With': 'XMLHttpRequest'
}

# 先访问主页,获取服务器设置的会话Cookie
session.get(base_url, headers=headers)

# 用同一个会话请求API
response = session.get(api_url, headers=headers)

if response.status_code == 200:
    try:
        # 直接用response.json()更稳妥,无需手动调用json.loads
        data = response.json()
        # 提取数据生成DataFrame
        df = pd.DataFrame(data['records']['data'])
        print("数据获取成功,前5行:\n", df.head())
    except Exception as e:
        print(f"解析JSON出错: {e}")
        print("响应内容:\n", response.text[:500])
else:
    print(f"请求失败,状态码: {response.status_code}")
    print("响应内容:\n", response.text[:500])

3. 额外注意事项

  • 你的原代码里json.loads(response.text).decode('utf-8')是错误用法:json.loads()已经把字符串转换成Python对象了,不需要再执行decode操作,直接用response.json()更简洁可靠。
  • NSE的反爬策略经常更新,如果上面的方法失效,打开浏览器F12的Network面板,手动访问这个API,复制浏览器发送的所有请求头和Cookie,完全复刻到代码里。
  • 不要频繁请求,建议添加time.sleep(2)之类的请求间隔,防止IP被封禁。

内容的提问来源于stack exchange,提问作者Yash Mhatre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:37:40