网关与路由 · 收录于 2026-08-29 · 适用 1 工具 ✓ 实测验证

yfinance history 一直超时(Cookie/crumb fetch failed / curl 28)

已验证 2026-08-29yfinance history 一直超时——升级 >=1.7 并用 curl_cffi firefox 指纹会话走代理(yf.download(..., proxy='socks5h://...'))。

快速修复

# 一键:升级到 yfinance>=1.7 并用 curl_cffi 的 firefox 指纹会话走代理(示例 SOCKS5 端口按你的代理改)
pip install -U yfinance curl_cffi && python3 -c "import yfinance as yf; yf.download('AAPL', period='5d', proxy='socks5h://127.0.0.1:7890')"

用你本地代理的实际端口(示例 7890);这一步同时解决"版本太老"和"通道不可达"。

你会遇到什么

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。

在国内直连、或代理只放行部分域名时最容易出现——甚至 chart 接口能通,history 却一直挂。

本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。

为什么会这样

yfinance 取数据前先请求两个辅助接口:fc.yahoo.com 拿 Cookie、query1.finance.yahoo.com/v1/test/getcrumb 拿 crumb。这些域在国内直连普遍超时/不可达;代理如果只放行了部分域名,就会出现"chart 直连通、history 挂"的表象。

场景现象(实测)
国内直连fc.yahoo.com 超时 → crumb 失败 → curl: (28)
代理部分放行chart 通、history 挂(漏放 fc/query1/query2 之一)
1.6.xcrumb 获取失败 → 直接失败
1.7.xcookie/crumb 失败仅告警,自动轮询 query1/query2;数据通道整体不可达仍失败

yfinance 拉历史数据是「三接口链」:先 fc.yahoo.com 拿 Cookie,再 query1.finance.yahoo.com/v1/test/getcrumb 拿 crumb,最后才用 crumb 调数据接口——前两步是前置依赖,任何一步不可达,历史数据就取不到。

「chart 直连通、history 挂」的表象来自部分放行:代理只放行了数据域名,漏放 fc/query1/query2 之一。

版本差异在失败语义:1.6.x crumb 失败直接失败;1.7.x 改为告警 + 自动轮询 query1/query2(数据通道整体不可达仍失败)。

确定性推论:curl: (28) 超时先定位是哪一环——分别 curl 三个域名;国内直连 = 三个都走代理(或全直连换数据源);代理场景 = 把 fc.yahoo.com、query1/query2.finance.yahoo.com 全部放行;1.7.x 下「有告警但能出数据」是正常降级,不是故障;判断路径:错误发生在 crumb 阶段 = 前置链断,发生在数据阶段 = 数据通道断。

一步步来

1. 升级 yfinance — 必做

pip install -U yfinance curl_cffi

≥1.7 对 cookie/crumb 失败宽容,还能自动轮询 query1/query2。

2. 走代理(直连被墙时) — 必做

用 curl_cffi 会话 + firefox 指纹 + HTTP/2,把 http/https 都指向代理(实测 SOCKS5 与 HTTP 代理均可用):

python3 - <<'EOF'
from curl_cffi import requests
s = requests.Session(impersonate="firefox", proxies={"http": "socks5h://127.0.0.1:7890", "https": "socks5h://127.0.0.1:7890"})
EOF

注意把 SOCKS5 换成你的实际端口;socks5h 让 DNS 也走代理。

3. 代理规则放行全部 Yahoo 端点 — 必做

fc.yahoo.com + query1/query2.finance.yahoo.com 都要可达。漏放任意一个 = 部分请求超时(文章场景)。

4. 定位卡点 — 排查

yf.enable_debug_mode

看日志卡在哪个域;再用同一 session 直接 GET https://query1.finance.yahoo.com/v8/finance/chart/... 对比是否可达。

怎么确认修好了

history 请求能正常返回数据(实测输出形态:14 行数据):

yf.Ticker("AAPL").history(period="5d")
→ DataFrame(14 行 × 7 列,Open/High/Low/Close/Volume…)

日志里不再出现 Cookie/crumb fetch failed 与 curl: (28) 超时。

其它环境的表现

环境说明
WSL 直连实测被墙,完整复现报错链(fc.yahoo.com 超时 → crumb 失败 → curl 28)
Windows 侧 SOCKS5 代理(127.0.0.1:7890)实测全通:chart 200(HTTP/3)+ history OK(14 行)
1.7.0 + hosts 阻断 fc.yahoo.com实测仅 cookie 失败仍成功
1.7.0 + 再阻断 query1实测 crumb 失败仍成功(自动切 query2)
代理漏放行某域部分请求超时,需放行 fc/query1/query2 全部

症状

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})

  1. 代理规则要放行全部 Yahoo 端点:fc.yahoo.com + query1/query2.finance.yahoo.com 都要可达;漏放行某个域 = 部分请求超时(文章场景)。
  2. 升级 yfinance ≥ 1.7:对 cookie/crumb 失败宽容 + 端点轮询降级,可降低偶发失败。
  3. 定位卡点: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)

适用工具 (1)

本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。

yfinance · 外部工具

来源与证据

收录 验证 ✓ 实测验证适用 1 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

素材来源:https://www.cnblogs.com/amosli/p/22652811

← 网关与路由 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡