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

请求NSE银行期货API返回资源未找到HTML页面,触发JSONDecodeError报错

请求NSE银行期货API返回资源未找到HTML页面,触发JSONDecodeError报错

嘿,我完全懂你碰到的这个麻烦——你写的代码逻辑没问题,但请求NSE的银行期货API时,返回的根本不是预期的JSON数据,而是一个HTML页面(大概率是404错误页,或者被反爬机制拦截的提示页),所以当你用response.json()去解析的时候,自然就触发了JSONDecodeError。

我给你分析下可能的原因和对应的解决办法:

第一步:先搞清楚返回的到底是什么内容

首先你可以先把返回的原始内容打印出来,看看具体情况,代码如下:

import requests

url_fut = 'https://www.nseindia.com/api/liveEquity-derivatives?index=nifty_bank_fut'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

response = requests.get(url_fut, headers=headers)
print(response.text)  # 打印返回的原始内容

如果输出的是HTML代码(比如有<html>标签、404提示),那基本可以确定要么这个API端点已经失效了,要么是NSE的反爬机制把你的请求拦住了。

第二步:针对性解决问题

情况1:反爬拦截导致返回非JSON

NSE对公开API的反爬限制越来越严,只带User-Agent可能不够,你可以试试补充更多请求头,模拟真实浏览器的请求:

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': 'application/json, text/plain, */*',
    'Referer': 'https://www.nseindia.com/market-data/live-equity-derivatives',
    'X-Requested-With': 'XMLHttpRequest',
    'Cookie': ''  # 如果浏览器访问需要登录,你可以从浏览器复制Cookie过来(注意不要泄露个人信息)
}

补充这些头之后,再尝试请求,看看能不能拿到正常的JSON数据。

情况2:API端点已经失效

NSE的公开API经常会调整路径和参数,你可以自己动手找最新的有效端点:

  1. 打开浏览器访问NSE的银行期货页面
  2. 按下F12打开开发者工具,切换到「网络」标签
  3. 刷新页面,找到类型为json的请求,查看它的URL和请求参数,把代码里的url_fut替换成最新的端点。

情况3:需要动态渲染内容

如果API数据是通过JavaScript动态加载的,requests这种纯HTTP请求工具就拿不到数据了,得用模拟浏览器的工具,比如selenium或者playwright。这里给你一个selenium的示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pandas as pd
import time

# 配置无头浏览器
options = Options()
options.add_argument('--headless=new')
options.add_argument('--disable-blink-features=AutomationControlled')  # 绕过反爬检测
driver = webdriver.Chrome(options=options)

# 访问目标页面
driver.get('https://www.nseindia.com/market-data/live-equity-derivatives')
time.sleep(3)  # 等待页面加载完成,也可以用显式等待更可靠

# 从页面的全局变量中提取数据(NSE很多数据存在window.__INITIAL_STATE__里)
data_fut = driver.execute_script("return window.__INITIAL_STATE__.liveEquityDerivatives.data")
df = pd.DataFrame(data_fut)
print(df)

driver.quit()

最后提醒

NSE的API政策经常变,所以如果这次解决了,之后可能还会遇到类似问题,最好养成自己抓包找最新API的习惯,或者看看有没有官方的开发者文档(不过NSE的官方文档不太完善)。

备注:内容来源于stack exchange,提问作者sachin sawant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:40:29