使用Python+Selenium无法保存nseindia接口JSON数据,求问题原因及解决方案
问题原因
- 核心错误为文件写入逻辑错误:
json.dumps()仅负责将Python对象序列化为JSON字符串,不会直接写入文件对象。你的代码仅调用了json.dumps()但未将返回的字符串写入已打开的文件对象,也没有使用专门用于文件写入的json.dump()方法,是文件为空的直接原因。 - 元素定位逻辑稳定性极低:你定位的
rawdata-tab、data类元素都是Firefox浏览器自带JSON预览页的内置元素,一旦浏览器版本更新、预览组件规则调整,或者更换其他浏览器运行,定位逻辑会直接失效。 - 存在反爬触发风险:NSE接口有严格的反爬校验,直接通过Selenium访问接口可能被拦截,返回验证码页或错误响应,导致你拿到的文本不是合法JSON结构。
修复方案
原有代码快速修复
仅需要修改文件写入部分的代码即可,将写入逻辑替换为:
with open('data.json', 'w', encoding='utf-8') as f: json.dump(d, f, default=lambda o: '<not serializable>')
更优实现方案
完全不需要调用Selenium启动浏览器,直接用requests模拟请求即可,资源消耗更低、运行速度更快、稳定性更高,参考代码如下:
import json import requests # 构造请求头,模拟正常浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": "https://www.nseindia.com/option-chain", "Accept": "application/json, text/javascript, */*; q=0.01" } # 初始化会话,自动管理Cookie session = requests.Session() # 先访问首页获取必要的校验Cookie session.get("https://www.nseindia.com", headers=headers, timeout=10) # 请求目标接口 target_url = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY" resp = session.get(target_url, headers=headers, timeout=10) # 校验请求是否成功 resp.raise_for_status() json_data = resp.json() # 写入本地文件 with open("data.json", "w", encoding="utf-8") as f: json.dump(json_data, f, ensure_ascii=False, indent=2, default=lambda o: "<not serializable>")
内容的提问来源于stack exchange,提问作者Evelyn Smith
相关产品推荐
相关产品推荐

