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

如何将NSE India API返回的JSON数据转换为表格格式并筛选指定列

解决NSE India API JSON转DataFrame及列筛选问题

首先,你直接用pd.DataFrame(res.json())失败的原因是NSE这个API返回的JSON是嵌套式结构——实际的标的数据被包裹在顶层的'data'键下面,不是直接的数组格式,所以得先提取出正确的数据部分再转换。

步骤1:先确认JSON的具体结构

先运行这段代码查看返回的JSON结构,找到存储持仓量数据的数组位置:

import requests
from pprint import pprint
import pandas as pd

baseurl = 'https://www.nseindia.com/'
url = f'https://www.nseindia.com/api/live-analysis-oi-spurts-underlyings'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 
           'accept-language': 'en,gu;q=0.9,hi;q=0.8', 
           'accept-encoding': 'gzip, deflate, br'}

session = requests.Session()
request = session.get(baseurl, headers=headers, timeout=30)
cookies = dict(request.cookies)
res = session.get(url, headers=headers, timeout=30, cookies=cookies)

# 打印完整JSON结构,定位数据所在的键
pprint(res.json())

运行后你会发现,所有持仓量激增标的的表格数据都存在'data'这个键对应的数组里。

步骤2:正确转换JSON为DataFrame

基于上面的结构,我们提取res.json()['data']来创建标准表格:

# 提取嵌套的data数组,转换为DataFrame
df = pd.DataFrame(res.json()['data'])
print(df.head())

这样就能得到正常的表格格式数据了。

步骤3:筛选特定列

如果只需要部分列,比如只保留标的代码、持仓量、持仓量变化及变化百分比,直接用列名列表筛选即可:

# 定义需要保留的列名
selected_columns = ['symbol', 'openInterest', 'changeInOi', 'percentChangeInOi']
# 筛选出目标列
filtered_df = df[selected_columns]
print(filtered_df.head())

完整可运行代码

把所有步骤整合后的完整代码如下:

import requests
import pandas as pd

baseurl = 'https://www.nseindia.com/'
url = f'https://www.nseindia.com/api/live-analysis-oi-spurts-underlyings'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 
           'accept-language': 'en,gu;q=0.9,hi;q=0.8', 
           'accept-encoding': 'gzip, deflate, br'}

session = requests.Session()
# 先获取站点Cookie,避免请求被拦截
session.get(baseurl, headers=headers, timeout=30)
# 请求API数据
res = session.get(url, headers=headers, timeout=30)

# 转换为DataFrame
df = pd.DataFrame(res.json()['data'])

# 筛选特定列
selected_columns = ['symbol', 'openInterest', 'changeInOi', 'percentChangeInOi']
filtered_df = df[selected_columns]

# 输出结果
print("完整表格数据前5行:")
print(df.head())
print("\n筛选后的特定列数据:")
print(filtered_df.head())

补充说明

如果后续NSE的API结构有变化,只需要调整提取数据的键名即可。另外,若遇到请求失败,可以尝试更新user-agent为你当前浏览器的最新版本,避免被反爬机制拦截。

内容的提问来源于stack exchange,提问作者Brijesh Chaurasia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:39:06