可用性核验 · 本机实测

investpy 还能用吗:403 拦在哪一层、怎么自己复测

「investpy 挂了」和「该库还能用」都是不完整的回答。本站把可用性拆成四层分别验证:装得上吗、import 得到吗、离线名录能读吗、联网端点通吗。四层的答案不一样,结论也应该不一样。

实测时间:2026-10-12环境:Windows + Python 3.11.9 + pip 24.0版本 1.0.8证据:本机探针 JSON

四层可用性

第 1 层装得上吗 → 直接 pip 失败
第 2 层import 得到吗 → 成功
第 3 层离线名录能读吗 → 可以
第 4 层联网取数通吗 → 403
本站四层探测示意(2026-10-12 实测)。只有第 1、4 层失败,第 2、3 层正常——这正是「一句挂了」会掩盖的信息。
Four layers

四层探测:哪一层失败、失败成什么样?

下面每一行都是一条可以自己重跑的验证,命令、结果和原始报错都保留在证据文件里。

层级验证动作结果原始报错 / 返回值对使用者意味着什么
第 1 层 安装pip install investpy失败error: invalid command 'bdist_wheel' → metadata-generation-failed照官方 README 照抄会卡住,需换安装参数
第 2 层 导入修复后 import investpy成功investpy.__version__ == "1.0.8",顶层公开名 102 个包本体完好,不含语法/编译问题
第 3 层 离线名录get_stocks_list(country='china') 等 19 个名录函数全部成功中国 3339 条、香港 1129 条、美股 4582 条、加密货币 1037 条……名录类任务今天仍然可用
第 4 层 联网取数search_quotes / get_stock_historical_data / get_stock_information / get_crypto_historical_data全部失败ConnectionError: ERR#0015: error 403, try again later.行情类任务在本机不可用,且库内没有兜底
第 4 层 补充绕过该库,用 requests 直接打同一端点同样失败HTTP 403,响应头 server: cloudflare,响应体 3 字节 403问题不在该库代码,而在对方边缘

为什么值得这样拆:如果你只是需要一份「哪个国家有哪些股票代码」的名录,第 3 层成功就够了;如果你要日线数据,第 4 层失败才是决定性的。两种需求对应完全不同的决策。

Attribution

403 到底是不是 User-Agent 的问题?

该库的请求头会从一份 66 条的内置 UA 列表里随机挑一个,而这些 UA 最新的一条停在 2017 年的 Chrome 62。很容易顺势得出「换现代 UA 就好了」的结论——本站专门做了对照实验,结论是换 UA 不足以解决。

实验做法结果结论
A 现状用该库默认的随机 UA 发请求403(cloudflare)默认路径不通
B 现代 UA把请求头换成 Chrome 141 的 UA 直连同一端点403(cloudflare)仅换 UA 不能绕过
C 不带 UA完全不发送 User-Agent 头403(cloudflare)与 UA 缺失无关
D 补丁重试把该库内部的 random_user_agent 猴子补丁成 Chrome 141,再跑 search_quotes仍然 ERR#0015: error 403在库内改 UA 无效
E 换端点分别请求站点首页、搜索端点、历史数据端点、行情域 tvc64/4 全部 403不是单点问题,是整个域被拦
F 归因边界未做的实验未验证换出口 IP、加代理、更换网络环境均未测试,不能断言「全球封锁」

诚实边界:第 F 行必须写出来。本站只在本机、本网络出口、2026-10-12 这个时点做了实测,因此能确证的只有「这条路径在本环境被拦」;至于是否与你所在地区、出口 IP 或对方风控策略有关,本站没有证据,不做结论。

Doc rot

官方文档也有一部分打不开了

README 与 PyPI 页面都指向 investpy.readthedocs.io 的具体页面,但其中多个已经 404。这也是「不要假设官方链接永远有效」的直接证据。

文档 URL 后缀HTTP 状态被谁引用影响
/、/index.html200README 的 Documentation 链接首页仍可访问
/api.html200左侧导航API 索引仍可访问
/usage.html404README 的 Usage 段官方示例入口已失效
/search_api.html404README 的 Search Engine 段SearchObj 字段说明无处可查
/quickstart.html、/general.html、/stocks.html404文档站旧目录结构老教程里的链接大量失效
/technical.html、/news.html、/examples.html404文档站旧目录结构指标与日历相关说明只剩源码可读

本站的做法是绕开失效页面,直接以仓库源码(investpy/ 下的模块)为第一手依据,并在每一页标注来源文件。你在读任何中文教程时也可以这样核对:教程引用的官方链接如果 404,就说明它多半是照抄旧文。

Reproduce

怎么在你自己环境里复测这四层?

不要相信任何二手结论,包括本站的。下面四步能让你在十分钟内得到自己环境的答案。

  1. 建一个隔离环境

    python -m venv venv-investpy → 激活后执行。预期输出:出现 (venv-investpy) 前缀,避免污染主环境。

  2. 按修复路径安装

    pip install setuptools wheel,随后 pip install investpy --no-build-isolation。预期输出:Successfully installed investpy-1.0.8;若直接 pip install investpy 则预期出现 bdist_wheel 报错。

  3. 验证离线层(应该成功)

    python -c "import investpy;print(investpy.__version__, len(investpy.get_stocks_list(country='china')))"。预期输出:1.0.8 3339。若这一步就失败,说明你的问题不在网络层。

  4. 验证联网层(本机预期失败)

    python -c "import investpy;investpy.search_quotes(text='apple',products=['stocks'],n_results=1)"。本机预期输出:ConnectionError: ERR#0015: error 403, try again later.。若你这里成功了,说明你的出口未被拦——请以你自己的结果为准。

你看到的现象最可能的原因下一步
第 3 步就报 ModuleNotFoundError装到了别处或没激活环境先用 pip show investpy 确认路径
第 3 步报 FileNotFoundError: ERR#0056包内名录文件缺失(安装不完整)重装并确认 sdist 解包完整
第 4 步报 ERR#0093请求通了但搜索无结果说明你的出口未被拦,改用更准确的关键词
第 4 步报 ERR#0015: error 403与本机一致,被边缘拦截止步,转迁移方案
第 4 步长时间无响应后超时网络层拦截(丢包而非直接拒绝)换网络重测一次,仍失败则转迁移

复测要记录什么:复测本身不是目的,可复现的记录才有价值。建议至少记下五项:操作系统与 Python 版本、pip 版本、investpy 版本、复测日期与网络出口、以及每条调用返回的状态。很多「上周还能用、这周不行了」的困惑,都是因为当时没记这几项,事后无法判断变的是环境还是对方。

记录项为什么必须记本机示例
操作系统与 Python 版本不同版本的依赖解析结果不同Windows + Python 3.11.9
pip 版本直接决定安装方式是否可行pip 24.0
investpy 版本同名包在不同环境可能解析到不同版本1.0.8
复测日期与网络出口拦截策略按出口与时间变化2026-10-12,本机默认出口
每条调用的返回状态区分「参数写错」与「服务端拒绝」离线名录成功;联网调用 403
原始报错文本错误码是排查的主要线索ERR#0015: error 403

如果你打算把这份记录交给同事或写进项目文档,建议同时附上调用脚本本身。只写「试过,不行」的记录无法被复核,也无法在半年后判断问题是否已经解决。另外,如果同一段代码在你和同事的机器上表现不同,先比对上面这六项,通常差异都能在其中找到答案,而不是去改代码。另外提醒一句:这类上游拦截往往会随时间和出口变化,今天不通不代表下周不通,因此在项目里保留一个可随时重跑的探针脚本,比记住某个结论更有用。

Read correctly

关于「investpy 还能不能用」的五种误读

同一批实测数据,读法不同会得出完全相反的决策。下面是常见的五种误读及更准确的读法。

常见说法为什么不准更准确的读法
「该库已经不能用了」离线名录在本机实测完全正常「联网取数在本机被拦,离线名录仍可用」
「该库已经停止维护」仓库未归档、Issue 仍在;master 最后提交停在 2022-10「master 自 2022-10 起未更新,仓库未归档」
「换个 UA 就能绕过」现代 UA、无 UA、猴子补丁三种做法实测都仍 403「换 UA 在本机不足以解决」
「是该库写了 bug」绕过该库 直连同一端点同样 403「问题在对方的边缘层,改库代码无用」
「全球用户都不能用」本站只测了一个出口、一个时点「本机在 2026-10-12 不可用,其他环境需自测」

FAQ

investpy 常见问题:还能装吗、还能取数吗、换什么

investpy 报 403 我该怎么办?
先确认是不是第 4 层的问题:如果 get_stocks_list 这类离线函数正常、只有联网函数报 ERR#0015: error 403,说明拦截发生在 Investing.com 的边缘层,你无法通过改代码解决(本站实测换 User-Agent、去掉 UA、猴子补丁都无效)。务实的做法是保留离线名录的用法,行情改用其他数据源。以官方 README 与你自己的复测为准。
改 User-Agent 真的没用吗?
在本站实测的四种组合里都没用:默认随机 UA、现代 Chrome 141 UA、完全不发 UA、以及在库内把 random_user_agent 补丁成现代 UA,四者全部返回 403。这说明拦截不以 UA 为单一判据。注意这只是本机结论,不能推广为「任何环境换 UA 都无效」。
是不是我网络的问题?
有可能,但本站没有证据下结论。实测只覆盖了一个网络出口、一个时间点;我们没有测试代理、境外出口或移动网络。判断方法很简单:按本页第 4 步复测,如果 search_quotes 在你这里能返回结果,那就是本机环境的差异,以你的结果为准。
为什么官方文档有的页面打不开?
README 与 PyPI 指向的 usage.html、search_api.html 等 8 个页面实测返回 404,只有文档首页与 api.html 仍为 200。这属于文档站的链接腐化,不是你的浏览器问题。本站因此改用仓库源码作为第一手依据,并在每页标注来源文件。
那 investpy 还值得学吗?
取决于你要什么。如果你的需求是「枚举某国/某类资产的代码清单」或「理解一个网页抓取型数据库怎么组织接口」,该库的离线名录与源码结构仍有参考价值;如果你要的是稳定的行情通道,现在用它就是选错了工具,应参考迁移选型页按任务换源。
离线名录会过期吗?
会。随包名录是发布时(1.0.8,2022-01-24)生成的快照,既不会自动更新,也不代表 Investing.com 当前的真实索引。例如 README 声称有 4697 个加密货币,而 1.0.8 实际只带 1037 条。把它当作一份历史快照使用,而不是当作实时名录。

你已经知道它被拦在哪一层了?

如果结论是「行情拿不到」,就不要再花时间修代码。下一步按你的任务在迁移选型页里找替代方案,或者先把离线名录的用法用起来。