yfinance 请求被 429 限流?代理配置加请求间隔,3 步让数据拉取稳定下来
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
批量拉 5 只股票,第 3 只开始报 429,脚本直接卡死。本文给出代理配置 + 请求间隔 + 日志定位的完整改法。
最小复现与快速对表
这段代码连发 5 个行情请求,中间没有任何间隔,用来触发 Yahoo 的 IP 级限流。
import yfinance as yf tickers = ["AAPL", "MSFT", "GOOG", "AMZN", "TSLA"] for t in tickers: hist = yf.Ticker(t).history(period="5d") # 连发请求,无间隔 print(t, len(hist)) # 第 3、4 只开始抛 YFRateLimitError 或 429本地网络正常的话,一般拉到第 2、3 只就开始掉。触发不了就换更大的 period 或多发几只,目的只是让 429 出现。
429 不是你代码的错。Yahoo 对同一 IP 的短时请求计数,超阈值直接拒。yfinance 在源码里把它转成 YFRateLimitError 抛出,见 yfinance/data.py。
先对表,确认你属于哪类。
| 故障现象 | 大概率原因 | 验证方法 |
|---|---|---|
| 429 报错 | 请求过于频繁 | 加间隔后重跑 |
| 连接超时 | 代理地址不通 | 单独测代理连通 |
| 403 拒绝 | IP 被临时封禁 | 换 IP 再试 |
对不上号也别慌,三种之外基本是网络层问题,先测裸连是否通。
逐条处方
把代理写进全局配置
代理不用写进每个请求,改一次全局配置就够。这一行把代理写进全局配置,后面的拉取全部走它。
import yfinance as yf yf.config.network.proxy = "http://127.0.0.1:7890" # 全局生效 t = yf.Ticker("AAPL") print(t.history(period="1d"))原因是这个值存在 yfinance 全局配置里,所有拉取共用,改一行即覆盖全部请求。代理地址要带协议头,写错端口的现象是超时而不是 429。改完这一行,重新跑一次。详见高级配置。
给循环加一个可感知的延迟
限流按 IP 计,间隔拉开比换代理更直接。循环里每个请求后睡 2 秒,同时打开自动重试。
import time import yfinance as yf yf.config.network.retries = 2 # 瞬时错误自动重试,1s/2s/4s 退避 for t in ["AAPL", "MSFT", "GOOG"]: yf.Ticker(t).history(period="5d") time.sleep(2) # 每个请求后停 2 秒原因是 Yahoo 按 IP 统计请求频次,sleep 拉开间隔,retries 兜底瞬时抖动,两者配合比硬刷稳定。间隔 2 秒起步,标的上百只再拉长,每拉 3 只多停一次,节奏更像人肉刷。
打开 debug 日志看请求链路
报错说不清原因时,先开日志。两行配置打开详细日志,再跑一次同样的拉取。
import yfinance as yf yf.config.debug.logging = True # 打开详细日志 yf.config.debug.hide_exceptions = False # 不再吞异常 yf.Ticker("AAPL").history(period="1d")原因是日志会打印每次请求的响应码和 cookie 策略切换,能直接区分限流、超时还是被封。输出走标准 logging,接你自己的 handler 也行。定位完记得关掉,别把详细日志留到生产。配置方法见日志文档。
边界与下一步
⚠️ 以下情况上面改法不生效,别硬扛:
- Yahoo 地域封锁靠代理绕不过去,只能换数据源
- sleep 压到 0.1 秒以下等于没加,间隔要有感知
- retries 只兜瞬时错误,429 持续出现就停手
- 缓存只省重复请求,不解决限流本身,见缓存文档
- 一次只改一处,挂了就先查日志,别三处同时动
完整文档在 doc/source/index.rst,所有配置项都有说明。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考