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 与 Kibana | Python 3.x;可访问 PyPI;另需一台能跑 ES 5.6 与 Kibana 5.6 的环境 | 失败:pip 解析阶段即中断 | 四层失败点(见下一节) |
StockSight 安装失败在哪四层?报错原文是什么
下面每一条都在本机复现过,报错文本是从日志里直接复制出来的。按顺序读,你的报错大概率落在其中一层。
| 层 | 现象 | 根因 | 判定方法 | 处置 |
|---|---|---|---|---|
| 1 | metadata-generation-failed | newspaper3k 0.2.8(2018)依赖 feedfinder2 0.0.4(2016),该包在 PyPI 上没有任何 wheel 版本,只能构建 sdist,而它的 setup.py 会先 import 自己 | 报错里出现 feedfinder2 | 跳过它,或用 --no-deps 单独装(见下一节) |
| 2 | ImportError: lxml.html.clean ... | lxml 把 HTML 清理模块拆成了独立包 lxml_html_clean,而 newspaper3k 仍按旧路径导入 | 报错里出现 lxml_html_clean | 补装 lxml_html_clean;仍不保证 newspaper 全功能可用 |
| 3 | cannot import name 'StreamListener' | requirements.txt 里 tweepy 不钉版本,pip 解析到 4.x;4.x 移除了 StreamListener/TweepError/Stream | 报错指向 sentiment.py 第 27 行 | 把 tweepy 钉到 <4(本机验证 3.10.0 三个导入全部可用) |
| 4 | No module named 'config' | 仓库只提供 config.py.sample,README 里 cp config.py.sample config.py 是硬性前置 | 报错指向 stockprice.py 第 23 行 | 执行复制命令后再跑 |
这四层是串联的:修好第一层才会看到第二层。因此「我看别人的教程一次就装上了」通常意味着对方用的是几年前的 Python 环境,或者已经手动处理过其中某几层。
一条本机验证的替代安装顺序
核心思路:把「解析失败的那个包」单独处理,并把 tweepy 钉回 3.x。
先单独装 wheel
pip install wheel必须单独执行一次。把它和别的包写在同一行没用——pip 会在装任何东西之前先解析全部依赖元数据,此时 wheel 还不存在。装除 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。把 tweepy 钉回 3.x
pip install "tweepy<4"。本机验证tweepy==3.10.0下StreamListener、TweepError、Stream三个导入全部成功,sentiment.py的导入链才通得过。单独处理 newspaper3k
pip install --no-deps newspaper3k能装上,但import newspaper仍会因lxml.html.clean失败,需要再补lxml_html_clean。如果只是不用-l/--followlinks这一组功能,可以评估是否直接跳过它。复制配置文件
cp config.py.sample config.py。少了这一步,stockprice.py连--help都跑不出来。下载 NLTK 数据
python -c "import nltk; nltk.download('punkt'); nltk.download('stopwords')"。本机实测两项均返回 True。再准备 ES 与 Kibana
这一步没有捷径:需要一台能跑 Elasticsearch 5.6 与 Kibana 5.6 的环境。
docker-compose.yml里给的正是这两个版本。
本机把前六步跑到了「除 newspaper 与 tweepy 相关的功能外均可导入」的状态。第 7 步(ES + Kibana)未验证,因此本站不宣称任何一条完整链路已经跑通。
StockSight 的 config.py 里到底要填什么?
模板文件只有 1,111 字节、12 个配置项,但其中一半会影响数据能不能入库。
| 配置项 | 模板默认值 | 作用 | 注意点 |
|---|---|---|---|
elasticsearch_host / port | localhost / 9200 | ES 连接地址 | 用 Docker 时要改成 elasticsearch(容器名),README 有写明这一点 |
elasticsearch_user / password | 空字符串 | ES 鉴权 | ES 5.x 默认不开鉴权,留空即可;开了鉴权必须填 |
consumer_key 等四项 | 空字符串 | Twitter API 凭据 | 四项缺一不可;用新闻标题路径(-n)时可以不填 |
nltk_tokens_required | 13 个 token,围绕 Tesla / Elon Musk | 白名单:必须命中其中一个才入库 | 默认值把站点锁死在美股科技股语境;换标的必须整份重写 |
nltk_min_tokens | 1 | 最短 token 数 | 新闻标题分支实际用的是硬编码 5,该配置不生效 |
nltk_tokens_ignored | ("win", "giveaway") | 黑名单:命中则不入库 | 源码里的判定写法有误,该黑名单实际不生效 |
twitter_feeds | 32 条账号 | 按关注列表抓推文 | 其中 @bespokeinvest 重复出现两次;改动后需删除 twitteruserids.txt 重新生成 |
一个容易忽略的细节:nltk_tokens_required 是白名单而不是加分项。默认值不包含任何 A 股相关词,所以即使你把价格源换成 A 股,推文/新闻仍会因为「不含默认 token」而被全部丢弃。
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 | 先删索引再重建映射 | 会清空该索引全部历史数据,慎用 |
注意 --newsheadlines 这条路只解决「抓标题 + 打分」,仍然需要 ES 在线才能写入。如果 ES 没起来,脚本会在 es.index() 处报连接错误而不是给出友好提示。
安装 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。详见对比页。
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 文档为准。