Python调用Yahoo Finance获取实时股价报JSONDecodeError如何修复
Yahoo Finance接口JSONDecodeError报错排查与修复
报错核心原因
JSONDecodeError: Expecting value: line 1 column 1 (char 0) 代表传入json.loads的内容为空、或者不是合法JSON格式。当前代码直接裸请求Yahoo Finance行情接口,会被平台反爬机制拦截,返回的内容是人机验证页/空响应/鉴权失败提示,根本不是预期的JSON行情数据,所以解析失败。
排查步骤
- 在JSON解析逻辑前打印响应状态码和响应正文:在
data = json.loads(response.text)前新增print(response.status_code, response.text[:200]),运行后就能看到实际返回的是403/401状态码、还是HTML格式的验证页面,确认拦截事实。 - 检查请求参数:旧版v7接口已不支持无身份标识的裸请求,缺失浏览器标识头的请求会被直接拦截。
可直接运行的修复代码
给请求补充合法的浏览器User-Agent头,同时增加异常判断逻辑,避免其他边界错误:
def get_stock_price(symbol): """get a stock price from yahoo finance""" import requests import json url = "https://query1.finance.yahoo.com/v7/finance/quote?symbols=" + symbol # 模拟浏览器请求头,绕过基础反爬 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) # 请求失败直接抛出HTTP错误,不进入JSON解析流程 response.raise_for_status() data = json.loads(response.text) quote_result = data['quoteResponse']['result'] if not quote_result: raise ValueError(f"股票代码{symbol}无对应返回数据,请检查代码是否正确") return quote_result[0]['regularMarketPrice'] print(get_stock_price('AAPL'))
备选稳定方案
如果加请求头后依然被拦截,不需要自己手动处理crumb鉴权、cookie验证等反爬逻辑,直接使用官方接口的成熟封装库即可:
- 先安装依赖:
pip install yfinance - 调用代码:
import yfinance as yf def get_stock_price(symbol): ticker = yf.Ticker(symbol) # 获取最近1个交易日的收盘价作为实时价格参考 latest_trade = ticker.history(period='1d') return round(latest_trade['Close'].iloc[-1], 2) print(get_stock_price('AAPL'))
内容的提问来源于stack exchange,提问作者dwk601
相关产品推荐
相关产品推荐

