可用性核验 · 本机实测
investpy 还能用吗:403 拦在哪一层、怎么自己复测
「investpy 挂了」和「该库还能用」都是不完整的回答。本站把可用性拆成四层分别验证:装得上吗、import 得到吗、离线名录能读吗、联网端点通吗。四层的答案不一样,结论也应该不一样。
四层可用性
四层探测:哪一层失败、失败成什么样?
下面每一行都是一条可以自己重跑的验证,命令、结果和原始报错都保留在证据文件里。
| 层级 | 验证动作 | 结果 | 原始报错 / 返回值 | 对使用者意味着什么 |
|---|---|---|---|---|
| 第 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 层失败才是决定性的。两种需求对应完全不同的决策。
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 换端点 | 分别请求站点首页、搜索端点、历史数据端点、行情域 tvc6 | 4/4 全部 403 | 不是单点问题,是整个域被拦 |
| F 归因边界 | 未做的实验 | 未验证 | 换出口 IP、加代理、更换网络环境均未测试,不能断言「全球封锁」 |
诚实边界:第 F 行必须写出来。本站只在本机、本网络出口、2026-10-12 这个时点做了实测,因此能确证的只有「这条路径在本环境被拦」;至于是否与你所在地区、出口 IP 或对方风控策略有关,本站没有证据,不做结论。
官方文档也有一部分打不开了
README 与 PyPI 页面都指向 investpy.readthedocs.io 的具体页面,但其中多个已经 404。这也是「不要假设官方链接永远有效」的直接证据。
| 文档 URL 后缀 | HTTP 状态 | 被谁引用 | 影响 |
|---|---|---|---|
/、/index.html | 200 | README 的 Documentation 链接 | 首页仍可访问 |
/api.html | 200 | 左侧导航 | API 索引仍可访问 |
/usage.html | 404 | README 的 Usage 段 | 官方示例入口已失效 |
/search_api.html | 404 | README 的 Search Engine 段 | SearchObj 字段说明无处可查 |
/quickstart.html、/general.html、/stocks.html | 404 | 文档站旧目录结构 | 老教程里的链接大量失效 |
/technical.html、/news.html、/examples.html | 404 | 文档站旧目录结构 | 指标与日历相关说明只剩源码可读 |
本站的做法是绕开失效页面,直接以仓库源码(investpy/ 下的模块)为第一手依据,并在每一页标注来源文件。你在读任何中文教程时也可以这样核对:教程引用的官方链接如果 404,就说明它多半是照抄旧文。
怎么在你自己环境里复测这四层?
不要相信任何二手结论,包括本站的。下面四步能让你在十分钟内得到自己环境的答案。
建一个隔离环境
python -m venv venv-investpy→ 激活后执行。预期输出:出现(venv-investpy)前缀,避免污染主环境。按修复路径安装
pip install setuptools wheel,随后pip install investpy --no-build-isolation。预期输出:Successfully installed investpy-1.0.8;若直接pip install investpy则预期出现bdist_wheel报错。验证离线层(应该成功)
python -c "import investpy;print(investpy.__version__, len(investpy.get_stocks_list(country='china')))"。预期输出:1.0.8 3339。若这一步就失败,说明你的问题不在网络层。验证联网层(本机预期失败)
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 |
如果你打算把这份记录交给同事或写进项目文档,建议同时附上调用脚本本身。只写「试过,不行」的记录无法被复核,也无法在半年后判断问题是否已经解决。另外,如果同一段代码在你和同事的机器上表现不同,先比对上面这六项,通常差异都能在其中找到答案,而不是去改代码。另外提醒一句:这类上游拦截往往会随时间和出口变化,今天不通不代表下周不通,因此在项目里保留一个可随时重跑的探针脚本,比记住某个结论更有用。
关于「investpy 还能不能用」的五种误读
同一批实测数据,读法不同会得出完全相反的决策。下面是常见的五种误读及更准确的读法。
| 常见说法 | 为什么不准 | 更准确的读法 |
|---|---|---|
| 「该库已经不能用了」 | 离线名录在本机实测完全正常 | 「联网取数在本机被拦,离线名录仍可用」 |
| 「该库已经停止维护」 | 仓库未归档、Issue 仍在;master 最后提交停在 2022-10 | 「master 自 2022-10 起未更新,仓库未归档」 |
| 「换个 UA 就能绕过」 | 现代 UA、无 UA、猴子补丁三种做法实测都仍 403 | 「换 UA 在本机不足以解决」 |
| 「是该库写了 bug」 | 绕过该库 直连同一端点同样 403 | 「问题在对方的边缘层,改库代码无用」 |
| 「全球用户都不能用」 | 本站只测了一个出口、一个时点 | 「本机在 2026-10-12 不可用,其他环境需自测」 |
FAQ
investpy 常见问题:还能装吗、还能取数吗、换什么
investpy 报 403 我该怎么办?
get_stocks_list 这类离线函数正常、只有联网函数报 ERR#0015: error 403,说明拦截发生在 Investing.com 的边缘层,你无法通过改代码解决(本站实测换 User-Agent、去掉 UA、猴子补丁都无效)。务实的做法是保留离线名录的用法,行情改用其他数据源。以官方 README 与你自己的复测为准。改 User-Agent 真的没用吗?
random_user_agent 补丁成现代 UA,四者全部返回 403。这说明拦截不以 UA 为单一判据。注意这只是本机结论,不能推广为「任何环境换 UA 都无效」。是不是我网络的问题?
search_quotes 在你这里能返回结果,那就是本机环境的差异,以你的结果为准。为什么官方文档有的页面打不开?
usage.html、search_api.html 等 8 个页面实测返回 404,只有文档首页与 api.html 仍为 200。这属于文档站的链接腐化,不是你的浏览器问题。本站因此改用仓库源码作为第一手依据,并在每页标注来源文件。