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

使用yfinance获取Yahoo Finance股票行业数据时报TypeError错误求助

问题:yfinance获取股票板块/行业时报错TypeError: string indices must be integers

我尝试从Yahoo Finance批量获取股票的板块(Sector)和行业(Industry)数据,代码首次运行正常,但现在报错TypeError: string indices must be integers。我没有使用pandas datareader,而是直接通过yfinance的Ticker对象获取个股信息。

我的代码:

import yfinance as yf

companies = ['AAPL','AMZN','GOOG','META','NFLX','TSLA']

i=0
while i<len(companies):
    stock=yf.Ticker(companies[i])
    print(stock.info['sector'])
    print(stock.info['industry'])

报错信息:

Traceback (most recent call last):
  File "C:/Python_Programs/stack_overflow_code.py", line 8, in <module>
    print(stock.info['sector'])
  File "C:\PerfLogs\Python Software\Python 3_10_7\lib\site-packages\yfinance\ticker.py", line 138, in info
    return self.get_info()
  File "C:\PerfLogs\Python Software\Python 3_10_7\lib\site-packages\yfinance\base.py", line 894, in get_info
    data = self._quote.info
  File "C:\PerfLogs\Python Software\Python 3_10_7\lib\site-packages\yfinance\scrapers\quote.py", line 27, in info
    self._scrape(self.proxy)
  File "C:\PerfLogs\Python Software\Python 3_10_7\lib\site-packages\yfinance\scrapers\quote.py", line 58, in _scrape
    quote_summary_store = json_data['QuoteSummaryStore']
TypeError: string indices must be integers

原因分析

这个错误是因为yfinance从Yahoo Finance获取的响应不是预期的JSON格式,而是字符串(比如反爬提示页、错误响应),导致代码试图用键名索引字符串,触发类型错误。Yahoo Finance会频繁调整页面结构或反爬策略,旧版本yfinance会出现适配失效的情况。


解决方案

1. 升级yfinance到最新版本

开发者会跟进Yahoo的更新修复适配问题,执行以下命令升级:

pip install --upgrade yfinance

2. 添加重试机制(应对临时反爬/网络问题)

单次请求失败可能是临时限制,添加重试逻辑可以提高成功率:

import yfinance as yf
import time

companies = ['AAPL','AMZN','GOOG','META','NFLX','TSLA']

for ticker in companies:
    max_retries = 3
    success = False
    for attempt in range(max_retries):
        try:
            stock = yf.Ticker(ticker)
            sector = stock.info.get('sector', '未获取到')
            industry = stock.info.get('industry', '未获取到')
            print(f"{ticker}: 板块={sector}, 行业={industry}")
            success = True
            break
        except TypeError as e:
            print(f"{ticker} 尝试{attempt+1}次失败: {e}")
            time.sleep(2)
    if not success:
        print(f"{ticker} 多次重试后仍无法获取数据")

3. 批量获取数据(更稳定的方式)

使用yf.Tickers批量加载股票信息,比循环创建单个Ticker对象更高效稳定:

import yfinance as yf

tickers = yf.Tickers('AAPL AMZN GOOG META NFLX TSLA')
for ticker_code, stock in tickers.tickers.items():
    try:
        sector = stock.info.get('sector', '未知')
        industry = stock.info.get('industry', '未知')
        print(f"{ticker_code}: 板块={sector}, 行业={industry}")
    except Exception as e:
        print(f"{ticker_code} 获取失败: {e}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:32:51