安装与运行

StockSight 怎么装:官方依赖清单在今天为什么装不上

本站把官方 README 的安装步骤在 Windows + Python 3.11.9 + pip 24.0 的全新隔离环境里原样跑了一遍。结论是:直接照抄会失败,而且失败点有四层。

下面给出每一层的报错原文、判断方式,以及一条本机验证过的替代安装顺序。

实测环境:Windows · Python 3.11.9 · pip 24.0 · 全新 venv实测日期:2026-09-30Docker 路径未验证(本机无 Docker)

第 1 层pip 解析失败
第 2 层newspaper3k 依赖
第 3 层tweepy 版本
第 4 层config.py 缺失
示意图:本机实测到的四层失败点,按发生顺序排列;每一层都有命令日志原文,可在报错库页核对该原文。
StockSight · 官方两条路

StockSight 官方给了两条安装路径,各自要什么前置条件?

先把两条路径看清楚,再决定走哪条——它们的失败方式完全不同。

路径官方步骤前置条件本机实测状态失败风险点
Docker Compose(官方主推)克隆仓库 → 复制 config.py → docker-compose build && docker-compose up本机需装 Docker;能拉取 elasticsearch:5.6.16 与 kibana:5.6.16 镜像未验证:本机没有 Docker两个镜像都是 2017 年的版本,能否拉取与启动需自行确认
本地安装pip install -r requirements.txt → 下载 NLTK 数据 → 自备 ES 与 KibanaPython 3.x;可访问 PyPI;另需一台能跑 ES 5.6 与 Kibana 5.6 的环境失败:pip 解析阶段即中断四层失败点(见下一节)
不要因为 Docker 路径「没报错」就以为它更简单:它把复杂度换成了镜像可用性与容器资源。两种路径都需要你另外准备 Twitter 侧的凭据,那一步本站未验证。
StockSight · 本机实测

StockSight 安装失败在哪四层?报错原文是什么

下面每一条都在本机复现过,报错文本是从日志里直接复制出来的。按顺序读,你的报错大概率落在其中一层。

第 1 层 — pip 解析阶段(原文)$ python -m pip install -r requirements.txt Collecting feedfinder2>=0.0.4 (from newspaper3k) Using cached feedfinder2-0.0.4.tar.gz (3.3 kB) Preparing metadata (setup.py): started Preparing metadata (setup.py): finished with status 'error' error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. File ".../feedfinder2.../setup.py", line 15, in <module> import feedfinder2 ModuleNotFoundError: No module named 'feedfinder2' error: metadata-generation-failed
第 1 层(venv 里没有 wheel 时的另一个面孔)error: invalid command 'bdist_wheel' error: metadata-generation-failed
第 2 层 — newspaper3k 装上之后仍然 import 不了>>> import newspaper File ".../newspaper/parsers.py", line 12, in <module> import lxml.html.clean ImportError: lxml.html.clean module is now a separate project lxml_html_clean. Install lxml[html-clean] or lxml_html_clean directly.
第 3 层 — tweepy 版本(sentiment.py 第 27 行)$ python sentiment.py --help File ".../sentiment.py", line 27, in <module> from tweepy.streaming import StreamListener ImportError: cannot import name 'StreamListener' from 'tweepy.streaming'
第 4 层 — 缺少 config.py(stockprice.py 第 23 行)$ python stockprice.py --help File ".../stockprice.py", line 23, in <module> from config import elasticsearch_host, elasticsearch_port, ... ModuleNotFoundError: No module named 'config'
层现象根因判定方法处置
1metadata-generation-failednewspaper3k 0.2.8(2018)依赖 feedfinder2 0.0.4(2016),该包在 PyPI 上没有任何 wheel 版本,只能构建 sdist,而它的 setup.py 会先 import 自己报错里出现 feedfinder2跳过它,或用 --no-deps 单独装(见下一节)
2ImportError: lxml.html.clean ...lxml 把 HTML 清理模块拆成了独立包 lxml_html_clean,而 newspaper3k 仍按旧路径导入报错里出现 lxml_html_clean补装 lxml_html_clean;仍不保证 newspaper 全功能可用
3cannot import name 'StreamListener'requirements.txt 里 tweepy 不钉版本,pip 解析到 4.x;4.x 移除了 StreamListener/TweepError/Stream报错指向 sentiment.py 第 27 行把 tweepy 钉到 <4(本机验证 3.10.0 三个导入全部可用)
4No module named 'config'仓库只提供 config.py.sample,README 里 cp config.py.sample config.py 是硬性前置报错指向 stockprice.py 第 23 行执行复制命令后再跑

这四层是串联的:修好第一层才会看到第二层。因此「我看别人的教程一次就装上了」通常意味着对方用的是几年前的 Python 环境,或者已经手动处理过其中某几层。

StockSight · 可行顺序

一条本机验证的替代安装顺序

核心思路:把「解析失败的那个包」单独处理,并把 tweepy 钉回 3.x。

  1. 先单独装 wheel

    pip install wheel 必须单独执行一次。把它和别的包写在同一行没用——pip 会在装任何东西之前先解析全部依赖元数据,此时 wheel 还不存在。

  2. 装除 newspaper3k 之外的七项

    elasticsearch>=5.0.0,<6.0.0、requests、nltk、tweepy、beautifulsoup4、textblob、vaderSentiment。本机这一步返回 exit 0,装上的是 elasticsearch 5.5.3、nltk 3.10.3、bs4 4.15.0。

  3. 把 tweepy 钉回 3.x

    pip install "tweepy<4"。本机验证 tweepy==3.10.0 下 StreamListener、TweepError、Stream 三个导入全部成功,sentiment.py 的导入链才通得过。

  4. 单独处理 newspaper3k

    pip install --no-deps newspaper3k 能装上,但 import newspaper 仍会因 lxml.html.clean 失败,需要再补 lxml_html_clean。如果只是不用 -l/--followlinks 这一组功能,可以评估是否直接跳过它。

  5. 复制配置文件

    cp config.py.sample config.py。少了这一步,stockprice.py 连 --help 都跑不出来。

  6. 下载 NLTK 数据

    python -c "import nltk; nltk.download('punkt'); nltk.download('stopwords')"。本机实测两项均返回 True。

  7. 再准备 ES 与 Kibana

    这一步没有捷径:需要一台能跑 Elasticsearch 5.6 与 Kibana 5.6 的环境。docker-compose.yml 里给的正是这两个版本。

bash — 本机验证过的顺序(前六步)python -m venv venv && venv\Scripts\activate pip install wheel pip install "elasticsearch>=5.0.0,<6.0.0" requests nltk beautifulsoup4 textblob vaderSentiment "tweepy<4" pip install --no-deps newspaper3k pip install lxml_html_clean cp config.py.sample config.py python -c "import nltk; nltk.download('punkt'); nltk.download('stopwords')"

本机把前六步跑到了「除 newspaper 与 tweepy 相关的功能外均可导入」的状态。第 7 步(ES + Kibana)未验证,因此本站不宣称任何一条完整链路已经跑通。

StockSight · 配置

StockSight 的 config.py 里到底要填什么?

模板文件只有 1,111 字节、12 个配置项,但其中一半会影响数据能不能入库。

配置项模板默认值作用注意点
elasticsearch_host / portlocalhost / 9200ES 连接地址用 Docker 时要改成 elasticsearch(容器名),README 有写明这一点
elasticsearch_user / password空字符串ES 鉴权ES 5.x 默认不开鉴权,留空即可;开了鉴权必须填
consumer_key 等四项空字符串Twitter API 凭据四项缺一不可;用新闻标题路径(-n)时可以不填
nltk_tokens_required13 个 token,围绕 Tesla / Elon Musk白名单:必须命中其中一个才入库默认值把站点锁死在美股科技股语境;换标的必须整份重写
nltk_min_tokens1最短 token 数新闻标题分支实际用的是硬编码 5,该配置不生效
nltk_tokens_ignored("win", "giveaway")黑名单:命中则不入库源码里的判定写法有误,该黑名单实际不生效
twitter_feeds32 条账号按关注列表抓推文其中 @bespokeinvest 重复出现两次;改动后需删除 twitteruserids.txt 重新生成

一个容易忽略的细节:nltk_tokens_required 是白名单而不是加分项。默认值不包含任何 A 股相关词,所以即使你把价格源换成 A 股,推文/新闻仍会因为「不含默认 token」而被全部丢弃。

StockSight · 第一次运行

StockSight 装完之后,第一条命令该怎么发?

三个采集路径的命令不一样,第一次建议挑不依赖 Twitter 凭据的那条。

目标命令预期看到什么前置
只要新闻标题(推荐先跑这条)python sentiment.py -s TSLA --newsheadlines --debug终端打印抓到的标题、NLTK token、情绪三项分数,并按设定频率重复无需 Twitter 凭据;需能访问新闻源网页
抓取推文python sentiment.py -s TSLA -k 'Elon Musk',Musk,Tesla,SpaceX --debug持续打印「tweets: N, filtered: M, filter-ratio」计数与情绪摘要需要 config.py 里四项 Twitter 凭据且仍可用
跟踪推文里的外链python sentiment.py -s TSLA -k … -l --debug额外抓取链接落地页正文并对其做情绪分析依赖 newspaper3k——本机实测该包 import 会失败
把价格也灌进来python stockprice.py -s TSLA --debug按 120 秒频率写入行情文档需要 config.py 存在;本机实测 URL 返回 200
删掉重建索引python sentiment.py -s TSLA --delindex先删索引再重建映射会清空该索引全部历史数据,慎用
bash — 最省事的第一步python sentiment.py -s TSLA --newsheadlines --debug

注意 --newsheadlines 这条路只解决「抓标题 + 打分」,仍然需要 ES 在线才能写入。如果 ES 没起来,脚本会在 es.index() 处报连接错误而不是给出友好提示。

StockSight · 前置条件清单

安装 StockSight 前要准备哪些东西

任何一项没准备好,都会在其中一层卡住。

运行环境

  • Python 3.x(老版本 Dockerfile 用的是 3.6,已停止维护)
  • 能访问 PyPI;若要走 Docker 路径,本机需装 Docker
  • 一台能跑 Elasticsearch 5.6 与 Kibana 5.6 的环境
  • 磁盘:ES 数据卷会持续增长,需预留空间

账号与凭据

  • Twitter 应用的四项凭据(key / secret / token / token secret)——本站未验证其当前可用性
  • 若只走新闻标题路径,可不需要 Twitter 凭据
  • ES 若开启鉴权,需要用户名与密码

网络可达性

  • 新闻源网页可访问(本机实测 Yahoo 新闻页返回 200)
  • 行情接口可访问(本机实测返回 200、976 条 2 分钟线)
  • 若启用 --websentiment,第三方情感服务需可达——本机实测返回 HTTP 405

心理预期

  • 这不是「装完就能预测股价」的工具
  • 项目 2020 年后基本停止演进,遇到问题只能自己读源码
  • 索引被删(--delindex)后历史数据无法恢复

如果你只是想先看到「一份带来源链的报告」长什么样,不需要走这条链路:异动分析 Skill 路线可以用自带快照在离线状态下渲染 HTML,本机实测 exit 0。详见对比页。

FAQ

StockSight 安装过程中最常见的六个问题是什么

为什么我已经装了 wheel,还是一样报错?

因为失败原因有两层。venv 里没有 wheel 时,报的是 invalid command 'bdist_wheel';装上 wheel 之后,报错会换成 feedfinder2/setup.py 第 15 行 import feedfinder2 → ModuleNotFoundError。这是该包自身的 setup.py 缺陷,装 wheel 解决不了。以 PyPI 上该包的发布记录为准。

只装 requirements.txt 里除 newspaper3k 之外的包,可以吗?

本机实测可以:那七项(含 elasticsearch 5.5.3、nltk 3.10.3、bs4 4.15.0)全部装上并返回 exit 0。代价是 -l/--followlinks 这一组「跟进链接抓正文」的功能不可用。以官方 requirements.txt 与源码为准。

StreamListener 报错一定要降级 tweepy 吗?

本机对比过:不钉版本时 pip 解析到 tweepy 4.17.0,StreamListener、TweepError、Stream 三个导入全部失败;钉到 tweepy==3.10.0 后三个全部成功。要改代码把逻辑迁到 tweepy 4 的 StreamingClient 也可以,但那已经属于二次开发。以两版 tweepy 的官方文档为准。

Docker 路径是不是就没有这些问题了?

不一定。Dockerfile 的基础镜像是 python:3.6,构建时会重新执行 pip install -r requirements.txt,因此同样的依赖问题会出现在镜像构建阶段(除非基础镜像里自带 wheel)。本站没有 Docker,未验证该路径,因此不做结论。以 Docker 官方与项目 Dockerfile 为准。

没有 Twitter 凭据还能用到什么程度?

可以用 --newsheadlines 路径抓新闻标题并打分,也可以用 stockprice.py 写入行情。两条路径都不需要 Twitter 凭据,但仍然需要 Elasticsearch 在线才能落库。以官方 CLI 参数说明为准。

安装时会不会把系统环境弄坏?

如果用全局 Python 直接 pip install,会。StockSight 老版钉死了 elasticsearch<6.0.0,这会覆盖你环境里更新的 elasticsearch 客户端。本机全程使用独立 venv,因此系统环境未受影响。建议同样用虚拟环境,以 Python 官方的 venv 文档为准。

装的过程会遇到哪些报错?下一步该看哪里

报错库页按「报错原文 → 所属层 → 下一步查什么」组织,涵盖三个仓库本机实测到的全部异常。