使用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
相关产品推荐
相关产品推荐

