refactor: 移除波形图组件并更新README文档

移除不再使用的波形图组件及相关代码,简化主窗口结构。同时全面更新README文档,详细描述项目功能、技术栈和使用说明,使其更加专业和完善。
This commit is contained in:
2026-01-14 13:10:52 +08:00
parent 9d33a8e179
commit e90bbfec7d
3 changed files with 259 additions and 53 deletions

300
README.md
View File

@@ -1,62 +1,280 @@
# 股吧人气指示器
# 股吧人气指示器 (Guba Sentiment Indicator)
一个基于 Python + PySide6 的桌面悬浮小工具,专为股票投资者设计,通过爬取股吧或论坛评论,使用大语言模型分析投资者情绪倾向,并以直观的可视化方式展示市场人气冷暖程度。
## 主要功能
### 1. 网页评论抓取
- 支持自定义目标URL和XPath表达式
- 自动重试机制,确保网页获取成功率
- 支持多页面抓取和评论解析
### 1. 智能评论爬取系统
- **自定义爬取规则**: 支持通过XPath表达式自定义爬取目标可灵活配置目标URL和内容选择器
- **智能去重机制**: 使用内容哈希算法自动识别和过滤重复评论,避免重复分析
- **自适应刷新**: 根据爬取结果动态调整刷新频率,无新内容时自动延长刷新间隔
- **多重解析策略**: 采用 lxml + BeautifulSoup 双重解析机制,提高爬取成功率
- **用户代理配置**: 支持自定义User-Agent增强反爬虫适应性
### 2. 上海证券交易所数据爬取
- 实时获取上证指数等数据
- 支持非交易时间自动跳过
- 数据持久化存储
### 2. 大语言模型情感分析
- **多模型支持**: 支持OpenAI兼容API包括NVIDIA API等主流大模型平台
- **精准情感评分**: 为每条评论生成0-100分的情感倾向评分0为极度悲观100为极度乐观
- **智能标签生成**: 自动为分析结果生成情感标签(极度悲观、悲观、中立、乐观、极度乐观等)
- **重试机制**: 集成API调用重试机制应对网络波动和API限流
- **分析历史记录**: 完整保存每次分析的结果和时间戳
### 3. 截图功能
- 使用Playwright自动化截图
- 支持指定XPath元素截图
- 自动清理旧截图保留最新10张
### 3. 可视化情感指示器
- **动态指示灯**: 基于分析结果实时更新的环形指示灯,颜色随情感倾向变化
- **渐变色彩系统**:
- 0-30分: 蓝色系(悲观情绪)
- 30-70分: 绿黄渐变(中性情绪)
- 70-100分: 红色系(乐观情绪)
- **精确数值显示**: 实时显示当前平均情感分数和整体情绪标签
- **发光特效**: 采用发光效果增强视觉体验
### 4. LLM分析
- 集成OpenAI API进行评论情感分析
- 支持自定义提示词和模型参数
- 分析结果可视化展示
### 4. 股票数据实时监控
- **上证指数监控**: 通过新浪财经API实时获取上证指数数据
- **交易时间识别**: 自动识别交易时间,非交易时间自动跳过数据获取
- **波形图展示**: 以时间轴形式展示股票价格走势,支持上午和下午交易时段
- **数据点标记**: 在波形图上精确标记每个数据点的时间和价格
### 5. 桌面客户端
- PySide6 GUI界面
- 系统托盘支持
- 窗口透明度和置顶设置
- 实时数据展示
### 5. 上证所网页截图功能
- **自动化截图**: 使用Playwright自动截取上证所网页指定区域
- **元素定位**: 通过XPath精确定位图表元素进行截图
- **定时更新**: 每5分钟自动更新一次截图
- **历史管理**: 自动管理截图文件,保留最新记录
### 6. 桌面客户端界面
- **悬浮窗口**: 无边框设计,支持窗口拖拽和置顶显示
- **系统托盘**: 集成系统托盘功能,支持最小化到托盘
- **透明度调节**: 支持0.3-1.0范围内的透明度调节
- **配置对话框**: 图形化配置界面,支持实时修改各项参数
- **状态显示**: 实时显示当前运行状态和处理进度
### 7. 数据管理与持久化
- **SQLite数据库**: 使用SQLite存储所有评论、分析结果和历史数据
- **结构化存储**: 评论表、分析历史表、配置表分离存储
- **数据统计**: 实时统计爬取次数、分析次数等运行指标
- **自动清理**: 支持历史数据管理和自动清理
### 8. 高级配置选项
- **API配置**: 支持自定义API Base URL、API Key、模型选择和超时设置
- **爬虫配置**: 可调整目标URL、XPath表达式、刷新间隔等参数
- **UI配置**: 支持透明度、置顶状态、情感阈值等界面设置
- **阈值自定义**: 可自定义"寒冷"(悲观)和"温暖"(乐观)的情感分界线
## 技术栈
- Python 3.10+
- PySide6 (GUI)
- Playwright (自动化截图)
- Requests (网络请求)
- LXML (HTML解析)
- Loguru (日志管理)
- OpenAI API (LLM分析)
### 核心技术
- **Python 3.10+**: 主要开发语言
- **PySide6**: 桌面GUI界面开发
- **SQLite**: 本地数据存储
- **Requests**: HTTP请求处理
- **LXML**: HTML解析和XPath支持
- **BeautifulSoup4**: 备选HTML解析器
- **Selenium**: Web自动化备用方案
- **Playwright**: 高级网页自动化和截图
## 使用说明
### AI技术
- **OpenAI API**: 大语言模型接口
- **JSON解析**: 结构化响应处理
- **情感分析算法**: 0-100分评分系统
### 配置文件
编辑`config.json`设置:
- API Base URL
- API Key
- 目标URL和XPath
- 刷新间隔
### 开发工具
- **Loguru**: 高级日志管理
- **Playwright**: 自动化浏览器控制
- **PyInstaller**: 应用程序打包通过build.spec
## 安装与配置
### 环境要求
- Python 3.10 或更高版本
- Windows/macOS/Linux 操作系统
### 安装步骤
1. **克隆或下载项目**
```bash
git clone <repository-url>
cd guba
```
2. **安装Python依赖**
```bash
pip install -r requirements.txt
```
3. **安装Playwright浏览器驱动**
```bash
playwright install chromium
```
4. **配置API密钥**
编辑 `config.json` 文件填入您的大语言模型API配置
```json
{
"llm_api": {
"base_url": "https://integrate.api.nvidia.com/v1",
"api_key": "your-api-key-here",
"model": "deepseek-ai/deepseek-r1",
"timeout": 120
}
}
```
5. **配置爬取参数**
在配置中设置目标URL和XPath表达式
```json
{
"spider": {
"target_url": "https://example.com",
"xpath": "//a[contains(@class, 'linkblack')]",
"fetch_interval": 15
}
}
```
### 运行程序
```bash
python main.py
```
### 截图功能
截图默认保存到`screenshots`目录自动清理超过10张的旧截图。
## 配置详解
### LLM API配置
- `base_url`: 大模型API的基础URL
- `api_key`: API访问密钥
- `model`: 使用的模型名称
- `timeout`: API请求超时时间
- `retry_times`: API调用失败时的重试次数
### 爬虫配置
- `target_url`: 目标网站URL
- `xpath`: 用于提取评论的XPath表达式
- `user_agent`: HTTP请求的User-Agent字符串
- `fetch_interval`: 爬取间隔时间(秒)
- `retry_times`: 爬取失败重试次数
- `retry_interval`: 爬取重试间隔(秒)
### UI配置
- `opacity`: 窗口透明度0.3-1.0
- `is_on_top`: 是否置顶显示
- `thresholds`: 情感阈值设置
- `cold`: 悲观阈值默认30
- `warm`: 乐观阈值默认70
### 数据库配置
- `path`: SQLite数据库文件路径
### 日志配置
- `level`: 日志级别INFO/DEBUG/ERROR等
- `path`: 日志文件路径
## 使用说明
### 基本操作
1. 启动程序后,主界面将显示情感指示器
2. 程序自动开始爬取评论并分析情感
3. 指示器颜色和数值实时反映市场情绪
4. 波形图显示股票价格走势
### 按钮功能
- **刷新**: 手动触发一次评论爬取和分析
- **配置**: 打开配置对话框修改各项参数
- **退出**: 关闭应用程序
### 系统托盘菜单
- **显示**: 显示主窗口
- **隐藏**: 隐藏到系统托盘
- **退出**: 完全退出程序
### 交易时间说明
- 上午交易时间: 9:30-11:30
- 下午交易时间: 13:00-15:00
- 非交易时间自动跳过数据获取,显示静态图表
## 高级功能
### 批量分析模式
支持一次性分析多条评论,适用于历史数据分析场景。
### 实时数据统计
程序会统计以下运行指标:
- 爬取网站次数
- 提交API分析次数
- 评论总数和已分析数
- 平均情感分数趋势
### 自定义情感标签
系统根据以下规则自动分类情感:
- 0-30分: 极度悲观
- 30-39分: 悲观
- 39-45分: 偏悲观
- 45-55分: 中立
- 55-65分: 偏乐观
- 65-70分: 乐观
- 70-100分: 极度乐观
## 故障排除
### 常见问题
1. **无法获取评论**
- 检查目标URL是否可访问
- 验证XPath表达式是否正确
- 确认网络连接正常
2. **API调用失败**
- 检查API Key是否正确
- 确认API服务是否可用
- 查看网络连接和防火墙设置
3. **界面显示异常**
- 检查PySide6是否正确安装
- 尝试调整透明度设置
### 日志文件
运行日志保存在 `guba.log` 文件中,记录所有操作和错误信息。
### 统计信息
程序退出时会生成运行统计信息,保存在 `statistics.txt` 文件中。
## 打包发布
项目提供PyInstaller打包配置build.spec可将应用打包为独立可执行文件
```bash
# 安装PyInstaller
pip install pyinstaller
# 打包应用
pyinstaller build.spec
# 执行文件将在dist目录下生成
```
## 注意事项
- 确保已安装所有依赖:`pip install -r requirements.txt`
- 首次运行Playwright需安装浏览器`playwright install chromium`
- 交易时间为工作日9:30-11:30和13:00-15:00
1. **API费用**: 使用大语言模型API可能产生费用请注意控制调用频率
2. **网络环境**: 确保网络连接稳定以保证爬取和API调用的正常进行
3. **反爬虫**: 遵守目标网站的robots.txt协议和使用条款
4. **数据隐私**: 所有数据本地存储,不会上传到第三方服务器
5. **交易时间**: 系统仅在交易时间获取实时股票数据
## 开发扩展
### 模块结构
- `main.py`: 主程序入口,负责组件初始化和信号连接
- `main_window.py`: GUI界面和用户交互处理
- `config_manager.py`: 配置文件管理和持久化
- `database.py`: SQLite数据库操作和数据管理
- `spider.py`: 网页爬取和数据提取
- `llm_analyzer.py`: 大语言模型情感分析
- `waveform_widget.py`: 股票数据波形图绘制
- `screenshot_manager.py`: 网页截图功能
### 二次开发
项目采用模块化设计,易于扩展新功能:
- 可添加新的爬取目标和解析规则
- 支持接入其他大模型API
- 可扩展更多数据可视化方式
- 支持多股票同时监控
## 许可证
本项目仅供学习交流使用,请遵守相关法律法规和网站使用条款。

View File

@@ -10,8 +10,6 @@ from PySide6.QtGui import QFont, QColor, QPainter, QBrush, QPen, QIcon, QAction,
from typing import Callable, Optional
from loguru import logger
from waveform_widget import WaveformWidget
class SentimentIndicator(QWidget):
"""情感指示灯组件"""
@@ -263,10 +261,6 @@ class MainWindow(QWidget):
status_font.setPointSize(10)
self.status_label.setFont(status_font)
# 波形图组件
self.waveform_widget = WaveformWidget()
self.waveform_widget.setMinimumHeight(200)
# 上证所截图显示
screenshot_group = QGroupBox("上证所行情")
screenshot_layout = QVBoxLayout(screenshot_group)
@@ -298,7 +292,6 @@ class MainWindow(QWidget):
layout.addWidget(self.indicator)
layout.addWidget(self.score_label)
layout.addWidget(self.status_label)
layout.addWidget(self.waveform_widget)
layout.addWidget(screenshot_group)
layout.addLayout(btn_layout)
@@ -442,11 +435,6 @@ class MainWindow(QWidget):
logger.info(f"显示消息: {title} - {message}")
QMessageBox.information(self, title, message)
def add_waveform_data(self, time_str: str, value: float):
"""添加波形图数据点"""
self.waveform_widget.add_data_point(time_str, value)
logger.info(f"添加波形图数据点: 时间={time_str}, 值={value}")
def update_sse_screenshot(self, screenshot_path: str):
"""更新上证所截图显示"""
logger.info(f"更新截图显示: {screenshot_path}")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 42 KiB