YFinance批量下载大量股票代码数据时出现JSONDecodeError问题求助
问题根因
你遇到的JSONDecodeError和进度卡死问题本质是雅虎财经接口的反爬限流机制触发导致的:当你一次性请求2000个标的的行情数据时,过高的并发请求会触发接口限流,服务端会返回429/503错误的HTML页面而非标准JSON格式数据,yfinance解析这类非JSON响应时就会抛出解析错误,未处理的异常会导致后续下载逻辑中断卡在99%。
解决方案
1. 调整并发参数
不要直接设置threads=True,该参数会默认启用和CPU核心数相等的并发线程,请求密度过高极易触发限流。建议将线程数调整为3~8的较小值,降低请求频率:
# 调整为小并发线程数 sample = yf.download(schwab_list, start=start, end=end, threads=5)
2. 拆分批量+增加延时
将2000个标的的列表拆分为每2050个一组,每组下载完成后停留12秒再请求下一组,进一步降低触发限流的概率:
import time # 按每批30个拆分标的列表 batch_size = 30 batch_list = [schwab_list[i:i+batch_size] for i in range(0, len(schwab_list), batch_size)] result = [] for batch in batch_list: batch_data = yf.download(batch, start=start, end=end, threads=5) result.append(batch_data) time.sleep(1.5) # 合并所有批次数据 sample = pd.concat(result, axis=1)
3. 增加异常捕获与重试逻辑
对单次下载失败的标的单独捕获异常并重试3~5次,避免单个标的请求失败影响全量下载进度:
from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def download_batch(batch, start, end): return yf.download(batch, start=start, end=end, threads=5)
如果不想额外安装tenacity库,也可以自己写简单的循环重试逻辑。
内容的提问来源于stack exchange,提问作者Matthew Harwit
相关产品推荐
相关产品推荐

