使用Pandas Datareader从Yahoo获取股票数据时出现ReadTimeout错误的原因排查
关于pandas_datareader访问Yahoo Finance出现ReadTimeout的原因分析
这个ReadTimeout错误确实有可能是Yahoo Finance端的问题,但也存在不少其他常见诱因,我来给你拆解清楚:
一、Yahoo Finance端的潜在问题
- Yahoo Finance的公开数据接口稳定性一直不算理想,尤其是近几年他们多次调整了接口的访问策略,经常会出现临时限流、服务器维护或者IP临时封锁的情况,直接导致请求超时。
- 当Yahoo的服务器负载过高时,会放缓对第三方请求的响应速度,一旦超过你代码里默认的30秒超时阈值,就会触发这个错误。
二、其他可能的诱因
- 本地网络问题:你的网络波动大、防火墙/代理拦截了请求,或者带宽不足,都会导致数据传输速度过慢,无法在超时时间内完成读取。
- 请求频率过高:你循环请求8只股票的数据,短时间内连续发送请求,Yahoo可能会判定为疑似恶意访问,故意延迟响应甚至拒绝连接,最终引发超时。
- 版本兼容问题:如果你的
pandas_datareader是旧版本,可能和Yahoo Finance的最新接口不兼容,导致请求过程中出现异常阻塞,进而触发超时。
三、几个实用的解决建议
- 延长超时时间:在
DataReader调用里手动设置更长的超时时间,给服务器足够的响应时间:tmp = pdr.DataReader(i, 'yahoo', '1/1/2010', dt.date.today(), timeout=60) - 添加请求间隔:在循环中加入短暂延迟,避免密集请求触发Yahoo的限流机制:
import time tickers = ['AAPL','TSM','COKE','V','GE','JNJ','T','BABA'] Closeprice = pd.DataFrame() for i in tickers: tmp = pdr.DataReader(i, 'yahoo', '1/1/2010', dt.date.today()) Closeprice[i] = tmp['Adj Close'] time.sleep(1) # 每次请求后暂停1秒,降低请求频率 - 更换更稳定的库:如果Yahoo的问题频繁出现,推荐使用
yfinance库(专门针对Yahoo Finance做的替代工具,稳定性远高于pandas_datareader的Yahoo数据源),用法也很类似。 - 排查网络环境:确认本地网络没有被代理、防火墙限制,或者尝试切换到其他网络环境测试。
内容的提问来源于stack exchange,提问作者Lin Lex




