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

