diff --git a/README.md b/README.md index e27959f..825a9a9 100644 --- a/README.md +++ b/README.md @@ -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 +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 \ No newline at end of file +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 +- 可扩展更多数据可视化方式 +- 支持多股票同时监控 + +## 许可证 + +本项目仅供学习交流使用,请遵守相关法律法规和网站使用条款。 \ No newline at end of file diff --git a/main_window.py b/main_window.py index 002106d..d40332a 100644 --- a/main_window.py +++ b/main_window.py @@ -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}") diff --git a/sse_screenshot.png b/sse_screenshot.png index 5ca40f0..c3d6797 100644 Binary files a/sse_screenshot.png and b/sse_screenshot.png differ