请求解决yfinance获取ISIN时的HTTPError 404问题
处理yfinance获取ISIN时的404错误:跳过无效Ticker并记录
我将股票代码(ticker)存储在列表中,需要获取对应的ISIN代码。使用yfinance的isin属性可获取ISIN,但部分ticker在yfinance中不存在,触发HTTPError 404错误。需修改代码跳过无效ticker并记录它们。
原代码
tickers = list_companies tickers = [yf.Ticker(ticker) for ticker in tickers] dfs = [] for ticker in tickers: isin = ticker.isin
报错信息
--------------------------------------------------------------------------- HTTPError Traceback (most recent call last) <ipython-input-40-66c3d6fb28b7> in <module> 2 3 for ticker in tickers: ----> 4 isin = ticker.isin ~/opt/anaconda3/lib/python3.8/site-packages/yfinance/ticker.py in isin(self) 100 @property 101 def isin(self): --> 102 return self.get_isin() 103 104 @property ~/opt/anaconda3/lib/python3.8/site-packages/yfinance/base.py in get_isin(self, proxy) 1404 1405 self._quote.proxy = proxy --> 1406 if self._quote.info is None: 1407 # Don't print error message cause self._quote.info will print one 1408 return None ~/opt/anaconda3/lib/python3.8/site-packages/yfinance/scrapers/quote.py in info(self) 570 if self._info is None: 571 # self._scrape(self.proxy) # decrypt broken --> 572 self._fetch(self.proxy) 573 574 self._fetch_complementary(self.proxy) ~/opt/anaconda3/lib/python3.8/site-packages/yfinance/scrapers/quote.py in _fetch(self, proxy) 721 modules = ['summaryProfile', 'financialData', 'quoteType', 722 'defaultKeyStatistics', 'assetProfile', 'summaryDetail'] --> 723 result = self._data.get_raw_json( 724 _BASIC_URL_ + f"/{self._data.ticker}", params={"modules": ",".join(modules), "ssl": "true"}, proxy=proxy 725 ) ~/opt/anaconda3/lib/python3.8/site-packages/yfinance/data.py in get_raw_json(self, url, user_agent_headers, params, proxy, timeout) 212 def get_raw_json(self, url, user_agent_headers=None, params=None, proxy=None, timeout=30): 213 response = self.get(url, user_agent_headers=user_agent_headers, params=params, proxy=proxy, timeout=timeout) --> 214 response.raise_for_status() 215 return response.json() 216 ~/opt/anaconda3/lib/python3.8/site-packages/requests/models.py in raise_for_status(self) 1019 1020 if http_error_msg: --> 1021 raise HTTPError(http_error_msg, response=self) 1022 1023 def close(self): HTTPError: 404 Client Error: Not Found for url: https://query2.finance.yahoo.com/v10/finance/quoteSummary/AGN?modules=summaryProfile%2CfinancialData%2CquoteType%2CdefaultKeyStatistics%2CassetProfile%2CsummaryDetail&ssl=true
尝试的新代码
import requests df = [] company_na = [] for ticker in tickers: try: isin = ticker.isin data = isin #data['Ticker'] = ticker.ticker df.append(data) except requests.exceptions.HTTPError: print('error ticker not found:') company_na.append(ticker) continue df = pd.DataFrame(df, columns = ['ISIN']) dfs['Ticker'] = ticker.ticker print(dfs)
修正后的正确代码
import yfinance as yf import pandas as pd import requests # 假设list_companies是你的股票代码列表 tickers_list = list_companies valid_isin_data = [] invalid_tickers = [] for ticker_symbol in tickers_list: try: # 将Ticker实例化放入try块,避免提前触发404 ticker = yf.Ticker(ticker_symbol) isin = ticker.isin if isin: # 过滤无ISIN数据的有效Ticker valid_isin_data.append({ 'Ticker': ticker_symbol, 'ISIN': isin }) else: invalid_tickers.append(ticker_symbol) print(f"无ISIN数据: {ticker_symbol}") except requests.exceptions.HTTPError: invalid_tickers.append(ticker_symbol) print(f"无效Ticker(404): {ticker_symbol}") except Exception as e: # 捕获其他未知异常 invalid_tickers.append(ticker_symbol) print(f"处理{ticker_symbol}时出错: {str(e)}") # 转换为结构化DataFrame isin_df = pd.DataFrame(valid_isin_data) print("有效ISIN数据:") print(isin_df) print("\n无效/无数据的Ticker列表:") print(invalid_tickers)
关键修正说明
- 提前捕获异常:原代码提前实例化所有Ticker对象,此时已触发404错误,后续try-except无法捕获。修正后将
ticker = yf.Ticker(ticker_symbol)放入try块,在实例化阶段就捕获错误。 - 保持数据关联:用字典存储Ticker符号与对应ISIN,避免原尝试代码中数据对应关系丢失的问题。
- 全面异常处理:除HTTPError外,增加通用异常捕获,覆盖网络超时、数据解析错误等其他可能问题。
- 过滤空值:部分有效Ticker可能无ISIN数据,新增判断逻辑并记录这类情况。
内容的提问来源于stack exchange,提问作者Lucien Jetten
相关产品推荐
相关产品推荐

