这是一个本地化、个人使用的财报电话会议音频管理网站,你可以在浏览器里:
- 搜索各大公司最新季度的财报电话会议音频
- 收藏、管理你关心的公司的季度财报
- 可视化监控爬虫抓取状态和收藏夹统计
整个项目完全在 WSL2 本地环境运行,通过 Docker 容器化和 Kubernetes 编排保证环境一致性和易维护性,同时用 GitHub Actions 做 CI/CD 自动化构建和部署,支持手动触发——你自己想用的时候启动服务即可。
| 功能模块 | 技术/工具 | 功能说明 |
|---|---|---|
| 前端 | React + TypeScript + Docker | 收藏夹界面、音频播放、搜索公司财报、显示收藏状态 |
| 后端 API | Node.js + Express + Docker | 提供前端数据接口、收藏夹增删改查、调用爬虫获取音频链接 |
| 爬虫服务 | Node.js + Axios + Cheerio + Docker | 自动抓取公司 IR 页面上的财报音频链接,解析 HTML 并写入数据库 |
| 数据库 | SQLite / MySQL + Docker | 存储收藏夹数据、音频链接、爬虫抓取状态 |
| 可视化监控 | Grafana + Docker | 展示爬虫状态、收藏夹统计、音频链接数量的仪表盘 |
| CI/CD | GitHub Actions | 自动化构建、测试、推送镜像、部署到 Kubernetes |
| 容器编排 | Kubernetes (K8S) | 容器编排、服务调度、自动扩缩容、滚动更新 |
| 容器化 | Docker + docker-compose | 各模块独立运行、环境隔离、本地开发测试 |
| 服务触发方式 | 手动启动 | 你需要使用时在 WSL2 或本地服务器执行 kubectl apply 或 docker-compose up -d |
- 搜索公司财报音频
- 收藏指定公司的季度财报
- 播放音频
- 收藏夹增删改查
- 提供 REST API 给前端访问收藏夹和音频数据
- 调用爬虫抓取最新音频链接
- 把爬虫结果写入数据库
- 抓取公司官方投资者关系(IR)页面
- 自动解析 HTML 找到季度财报音频链接
- 将链接存入数据库
- 收藏夹表:存储你收藏的公司和季度
- 音频链接表:存储抓到的音频 URL
- 爬虫状态表:记录抓取成功/失败状态
- 显示每个公司音频抓取状态
- 收藏夹数量统计
- 每季度新增音频数量
- 自动构建前端 React 容器镜像
- 自动构建 Node.js API + 爬虫容器镜像
- 运行单元测试和集成测试
- 推送镜像到容器镜像仓库(如 GitHub Container Registry)
- 自动部署到 Kubernetes 集群
- 支持 workflow_dispatch 手动触发
- 使用 Deployment 管理各服务副本
- 使用 Service 暴露服务端口
- 使用 ConfigMap 和 Secret 管理配置和敏感信息
- 使用 PersistentVolume 持久化数据库数据
- 支持 Horizontal Pod Autoscaler 自动扩缩容
- 支持滚动更新和回滚
- 用户在浏览器操作前端 → 请求 Node.js API
- Node.js API 查询数据库 → 返回收藏夹 / 音频数据
- 爬虫定向抓取 IR 页面音频链接 → 写入数据库
- Grafana 读取数据库 → 展示爬虫状态、收藏夹统计、音频数量
- GitHub Actions 管理整个构建和部署流程 → 自动构建镜像并部署到 Kubernetes
- Kubernetes 编排各服务容器 → 保证服务高可用和弹性伸缩
- 打开 WSL2 或本地服务器
- 执行:
docker-compose up -d
- 浏览器访问:
- 前端网站:http://localhost:3000
- Grafana 仪表盘:http://localhost:3001
- 你可以:
- 搜索公司财报
- 收藏季度财报
- 播放音频
- 查看爬虫状态和统计数据
- 使用完毕,停止服务:
docker-compose down
- 确保 Kubernetes 集群已启动(如 minikube 或 k3s)
- 应用 Kubernetes 配置:
kubectl apply -f k8s/
- 查看服务状态:
kubectl get pods -n earnings-call kubectl get services -n earnings-call
- 端口转发访问服务(如需要):
kubectl port-forward svc/frontend 3000:80 -n earnings-call kubectl port-forward svc/grafana 3001:3000 -n earnings-call
- 停止服务:
kubectl delete -f k8s/
- Google API 搜索:使用 Google Custom Search API 搜索公司的投资者关系页面
- 爬虫抓取:
- 访问公司 IR 页面
- 解析 HTML 结构,寻找包含 "earnings call"、"webcast"、"conference call" 等关键词的链接
- 提取音频链接(通常是 MP3 或流媒体链接)
- 链接验证:确保抓取的链接是有效的音频文件
- 添加收藏:搜索公司后,选择季度财报添加到收藏夹
- 删除收藏:从收藏夹中移除已听或不需要的财报
- 查看收藏:浏览所有收藏的财报,按公司或季度排序
- 更新收藏:当有新季度财报时,自动提示更新
Worlds-Earning-Call/
├── frontend/ # React + TypeScript 前端
│ ├── src/
│ ├── Dockerfile
│ └── ...
├── backend/ # Node.js + Express 后端 API
│ ├── src/
│ ├── Dockerfile
│ └── ...
├── crawler/ # Node.js 爬虫服务
│ ├── src/
│ ├── Dockerfile
│ └── ...
├── database/ # 数据库配置和迁移
├── grafana/ # Grafana 配置和仪表盘
├── k8s/ # Kubernetes 配置文件
│ ├── namespace.yaml
│ ├── frontend-deployment.yaml
│ ├── backend-deployment.yaml
│ ├── crawler-deployment.yaml
│ ├── database-deployment.yaml
│ ├── grafana-deployment.yaml
│ ├── configmap.yaml
│ └── secrets.yaml
├── .github/
│ └── workflows/ # GitHub Actions 工作流
│ ├── frontend.yml
│ ├── backend.yml
│ ├── crawler.yml
│ └── deploy.yml
├── docker-compose.yml # Docker Compose 配置(本地开发)
├── Dockerfile # 通用 Dockerfile(可选)
└── README.md # 项目说明文档
-
安装必要工具:
- WSL2
- Docker Desktop (支持 WSL2 集成)
- Node.js (可选,用于本地开发)
- kubectl (Kubernetes 命令行工具)
- minikube 或 k3s (本地 Kubernetes 集群)
-
克隆项目:
git clone <项目仓库地址> cd Worlds-Earning-Call
-
配置环境变量:
- 创建
.env文件,配置数据库连接、API 密钥等 - 在 Kubernetes 中创建对应的 ConfigMap 和 Secret
- 创建
-
构建和启动服务:
docker-compose up -d --build
-
访问服务:
- 前端:http://localhost:3000
- Grafana:http://localhost:3001
-
启动本地 Kubernetes 集群:
# 使用 minikube minikube start # 或使用 k3s curl -sfL https://get.k3s.io | sh -
-
配置 kubectl 上下文:
kubectl config use-context minikube
-
创建命名空间和配置:
kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/configmap.yaml kubectl apply -f k8s/secrets.yaml
-
部署服务:
kubectl apply -f k8s/
-
验证部署:
kubectl get all -n earnings-call
-
配置 GitHub Secrets:
DOCKER_USERNAME: Docker Hub 用户名DOCKER_PASSWORD: Docker Hub 密码KUBE_CONFIG: Kubernetes 配置文件(base64 编码)
-
手动触发部署:
- 在 GitHub 仓库的 Actions 页面
- 选择 "Deploy to Kubernetes" workflow
- 点击 "Run workflow"
- 本项目仅用于个人本地使用,不建议公开部署
- 爬虫功能可能会受到网站反爬机制的限制,请合理使用
- 部分公司的 IR 页面结构可能会变化,需要定期更新爬虫规则
- 音频文件较大,请注意本地存储空间
- Kubernetes 部署需要一定的资源,建议至少 4GB 内存
- GitHub Actions 需要配置正确的 Secrets 才能正常工作
- 支持更多音频格式和播放控制
- 添加财报文本摘要功能
- 集成机器学习模型,自动提取财报关键信息
- 支持多用户系统(如果需要分享给团队使用)
- 添加通知系统,当关注的公司发布新财报时提醒
- 实现 Helm Chart,简化 Kubernetes 部署
- 添加 Prometheus 监控,与 Grafana 集成
- 支持多集群部署(如云上 Kubernetes)
如有问题或建议,请联系: