元数据
| id | yfinance-history-timeout | 收录 | 2026-08-29 |
|---|---|---|---|
| 问题域 | 网关与路由 | 主题分组 | 网络与镜像 |
| 适用工具 | yfinance · 外部工具 | ||
症状
`yf.Ticker(...).history(...)` 反复失败,日志先出现 `Cookie fetch from fc.yahoo.com failed (Timeout), continuing without it`、`Cookie/crumb fetch failed ... continuing without crumb`,最终 `Failed to get ticker ... curl: (28) Connection timed out after 10001 milliseconds`。典型场景:国内网络直连 Yahoo、或代理只放行了部分域名(Chart API 能通但 history 挂)。
原因
yfinance 取数据前先请求两个辅助接口:`fc.yahoo.com` 拿 Cookie、`query1.finance.yahoo.com/v1/test/getcrumb` 拿 crumb。国内直连这两个域超时/被墙;代理部分放行时也会出现「chart 直连通、history 挂」的表象。版本差异(实测):1.6.x 里 crumb 获取失败会直接失败;1.7.x 已放宽(cookie/crumb 失败仅告警,数据端点可轮询 query1/query2),但**数据通道整体不可达时仍然失败**。
解法
1. **直连超时 → 走代理**:SOCKS5 与 HTTP 代理均实测可用(如 `socks5h://127.0.0.1:7890`),配合 curl_cffi session(firefox 指纹 + HTTP/2):
`requests.Session(impersonate="firefox", http_version=CurlHttpVersion.V2TLS, proxies={"http": proxy, "https": proxy})`
2. **代理规则要放行全部 Yahoo 端点**:`fc.yahoo.com` + `query1/query2.finance.yahoo.com` 都要可达;漏放行某个域 = 部分请求超时(文章场景)。
3. **升级 yfinance ≥ 1.7**:对 cookie/crumb 失败宽容 + 端点轮询降级,可降低偶发失败。
4. **定位卡点**:`yf.enable_debug_mode` 看日志卡在哪个域;用同一 session 直接 `get("https://query1.finance.yahoo.com/v8/finance/chart/...")` 对比。
验证证据
- 本地实测(2026-08-29):yfinance 1.7.0 + curl_cffi 0.16.2,WSL 直连 vs Windows 侧 SOCKS5 代理(127.0.0.1:7890)。
- 直连(被墙):完整复现文章报错链(fc.yahoo.com 超时 → crumb 失败 → `curl: (28) Connection timed out`)。
- 代理全通:chart 200(HTTP/3)+ history OK(14 行)。
- 机制细节:hosts 阻断 fc.yahoo.com → 1.7.0 仅 cookie 失败仍成功;再阻断 query1 → crumb 失败仍成功(自动切 query2)——验证版本差异。
- 实测复现日志(2026-08-29)
来源与证据
素材来源:https://www.cnblogs.com/amosli/p/22652811
验证证据:Evidence details kept locally (2026-08-29)