批量爬取Yahoo Finance数据遇ValueError:高量股票代码报错
解决大量股票代码请求时的ValueError问题
错误原因
一次性请求10000+股票代码时,要么是大量股票无有效估值数据,导致faang.valuation_measures返回空字典/标量;要么是Yahoo接口对批量请求做了限制,返回数据格式异常,直接传给pd.DataFrame()就会触发这个错误。
解决方案
1. 先校验返回数据有效性
转换DataFrame前先检查估值数据格式,避免空数据报错:
import pandas as pd from yahooquery import Ticker symbols = ['AAPL','GOOG','MSFT'] + ['无效代码']*10000 # 模拟大量代码场景 faang = Ticker(symbols) val_measures = faang.valuation_measures # 判断数据是否为可迭代的有效格式 if isinstance(val_measures, (list, pd.core.frame.DataFrame)): df = pd.DataFrame(val_measures) else: # 空数据时创建指定列的空DataFrame df = pd.DataFrame(columns=['symbol', 'marketCap', 'peRatio', 'pbRatio']) # 按需定义列名 df.to_excel('output.xlsx')
2. 分批次处理大量股票
一次性请求太多代码易触发接口限制,分批次请求更稳定:
import pandas as pd from yahooquery import Ticker import time symbols = ['AAPL','GOOG','MSFT'] + ['其他代码']*10000 batch_size = 500 # 每批次请求500个,可根据实际调整 all_data = [] for i in range(0, len(symbols), batch_size): batch_symbols = symbols[i:i+batch_size] ticker = Ticker(batch_symbols) val_data = ticker.valuation_measures # 仅保留有效数据 if val_data: all_data.extend(val_data) time.sleep(1) # 加延迟避免请求过于频繁 # 合并所有数据,无数据则生成空DataFrame df = pd.DataFrame(all_data) if all_data else pd.DataFrame() df.to_excel('output.xlsx')
3. 加入请求重试机制
针对请求失败的批次,添加重试逻辑提升成功率:
import pandas as pd from yahooquery import Ticker import time def get_valuation_batch(batch_symbols): max_retries = 3 for _ in range(max_retries): try: ticker = Ticker(batch_symbols) val_data = ticker.valuation_measures return val_data if val_data else [] except Exception as e: print(f"批次请求失败,重试中: {e}") time.sleep(2) return [] symbols = ['AAPL','GOOG','MSFT'] + ['其他代码']*10000 batch_size = 500 all_data = [] for i in range(0, len(symbols), batch_size): batch = symbols[i:i+batch_size] data = get_valuation_batch(batch) all_data.extend(data) time.sleep(1) df = pd.DataFrame(all_data) if all_data else pd.DataFrame() df.to_excel('output.xlsx')
内容的提问来源于stack exchange,提问作者HTMLHelpMe
相关产品推荐
相关产品推荐

