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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:01:04