rss订阅数据爬取及数据处理

This commit is contained in:
z66
2025-10-23 17:18:49 +08:00
parent fd67231866
commit e1db06dd79
8 changed files with 84042 additions and 229449 deletions
+91 -99
View File
@@ -3,62 +3,57 @@
### 参考文档
https://alidocs.dingtalk.com/i/nodes/NZQYprEoWoexdo1ohPdxXvDbJ1waOeDk?utm_scene=team_space
### 程序框架
### 程序框架(当前实现)
```angular2html
intelligence_system/
├── collectors/ # 数据采集层
│ ├── weibo_spider.py # 黑猫爬虫
│ ├── rss_subscriptions.py # rss订阅
── news_api.py # 新闻接口
│ └── internal/ # 内部数据收集
│ ├── jian_dao_cloud.py # 简道云表单收集器
├── collectors/ # 数据采集层
│ ├── complaint_spider.py # 投诉信息爬虫(结构化入库/附件走MinIO)
│ ├── rss_subscriptions.py # RSS 订阅抓取
── internal/ # 内部数据收集(保留)
└── jian_dao_cloud.py # 简道云表单收集器(示例/占位)
├── processors/ # 数据处理层
│ ├── data_cleaner.py # 数据清洗(去重/标准化)
│ ├── schema_mapper.py # 数据结构转换器
│ ├── text_parser.py # 文本解析(PDF/HTML等)
── image_analyzer.py # 图像识别(OpenCV集成)
├── video_processor.py # 音视频分离分析
│ │
│ └── ai_engine/ # AI分析核心
│ ├── nlp_processor.py # 自然语言处理引擎
│ ├── sentiment_analyzer.py # 情感分析模型
│ └── topic_modeler.py # LDA主题建模工具
├── processors/ # 数据处理层
│ ├── processor_rss_data.py # RSS数据清洗、分词、过滤与入库
│ ├── keywords.txt # 行业关键词(用于分词/过滤)
│ ├── stopwords.txt # 停用词
── ai_engine/
└── ai_proessor_rss_data # 预留(AI分析扩展占位)
├── services/ # 应用服务层
│ ├── monitoring/ # 舆情监控
│ │ ├── opinion_monitor.py # 实时舆情追踪
│ │ └── brand_reputation.py # 品牌口碑分析
│ ├── analysis/ # 竞品分析
│ │ ── competitor_tracker.py # 竞品动态监控
│ └── swot_generator.py # SWOT分析报告
│ │
├── reporting/ # 报告服务
│ ├── daily_reporter.py # 自动化日报生成
── weekly_digest.py # 周报汇编系统
│ └── alert/ # 预警服务
│ ├── alert_trigger.py # 动态阈值告警
│ └── notification_center.py # 邮件/短信通知
├── services/ # 应用服务层(保留)
│ ├── monitoring/ # 舆情监控
│ │ ├── opinion_monitor.py # 实时舆情追踪(占位)
│ │ └── brand_reputation.py # 品牌口碑分析(占位)
├── analysis/ # 竞品分析
│ ├── competitor_tracker.py # 竞品动态监控(占位)
│ │ ── swot_generator.py # SWOT分析报告(占位)
├── reporting/ # 报告服务
│ │ ├── daily_reporter.py # 自动化日报生成(占位)
│ └── weekly_digest.py # 周报汇编系统(占位)
└── alert/ # 预警服务
── alert_trigger.py # 动态阈值告警(占位)
└── notification_center.py # 邮件/短信通知(占位)
├── system_management/ # 系统管理
│ ├── scheduler/ # 任务调度
│ └── task_scheduler.py # 任务调度器
│ └── monitor/ # 系统监控
│ ├── health_monitor.py # 服务健康检测
│ └── performance_watcher.py # 资源占用监控
├── applications/ # 应用
│ ├── alert.py # 告警触发/通知(占位/实现中)
│ └── reporter/
├── daily.py # 日报生成
└── monthly.py # 月报生成
├── utils/ # 工具库
│ ├── file_handler.py # 通用文件操作
│ ├── logger.py # 日志系统
├── mysql_agent.py # MySQL读写管理器
│ └── datetime_parser.py # 时间格式处理
├── system_management/ # 系统管理层
│ ├── scheduler/
│ ├── task_scheduler.py # 任务调度器(Cron表达式 + 线程池)
│ └── task_management.py # 任务管理辅助
│ └── monitor/ # 系统监控(目录占位)
├── config.py # 配置加载与管理
└── main.py # 系统入口(启动所有服务)
├── utils/ # 工具库
│ ├── file_handler.py # 通用文件操作
│ ├── logger.py # 跨平台日志系统(Loguru)
│ ├── mysql_agent.py # MySQL读写管理器
│ └── minio_agent.py # MinIO对象存储客户端
├── config.py # 配置加载与管理(含数据库/存储配置)
├── main.py # 系统入口(Cron轮询 + 调度执行)
└── requirements.txt # 依赖清单
```
### 程序设计原则
@@ -67,23 +62,32 @@ intelligence_system/
3. 密钥等信息直接放在配置类中
4. 数据存储遵循"结构化存MySQL,非结构化存MinIO"原则,通过元数据关联
### 主程序设计
主程序需要一次启动,一直运行,启动时运行一次(在代码中可取消),之后每天定时生成一次报告
### 主程序与调度设计(已实现)
主程序以长运行进程方式启动,进入轻量轮询循环(每10秒)。调度器按Cron表达式在`main_task`表中拉取到期任务,使用线程池异步执行,并在每分钟输出运行状态、每小时汇总统计。
主程序包含爬虫/api调度器。该调度器通过查询mysql中任务调度情况按需执行,db文件中应包含任务名称、
任务路径、任务执行频率(支持按天、按周,按分钟)、上次执行时间、下次执行时间等信息
- 调度器能力:
- 基于`croniter`解析Cron表达式,支持时区(默认`Asia/Shanghai`
- 线程池并发执行,信号量限制最大并发(与`max_workers`一致)
- 任务入口动态解析:支持`package.module``package.module.ClassName.main``package.module.func` 等形式
- 成功/失败后自动计算`next_run_time`或设置15分钟后重试
- 关键字段自动更新:`is_running``last_run_time``last_run_status``run_count``next_run_time`
主程序应包含数据处理调度器,根据数据类别分别处理,如文本数据处理调度器、图片数据处理调度器等,
每天定时拉取db获取到的原始数据,分别进行处理,处理完成后将结果保存到mysql中
- 主循环:
- 每10秒检查一次待运行任务
- 每分钟打印当前周期统计;每小时写入累计统计日志
- 支持`SIGINT/SIGTERM`优雅关闭,等待正在运行的任务完成
主程序应包含日报、周报等生成,根据时间定时生成报告,报告需要存储
### 日志设计(已实现)
跨平台日志系统(Loguru)输出至`logs/`目录:
### 日志设计
日志系统兼容Windows、Mac、Linux平台,以`log`文件形式存储,超过20MB自动压缩。新增存储相关日志内容:
- MySQL操作:批量插入行数、表结构变更、事务状态
- MinIO操作:文件上传/下载状态、路径、大小、耗时
- 关联日志:MySQL记录与MinIO对象的绑定关系(如"ID:123 关联文件: collector/images/xxx.jpg"
- 异常日志:MySQL连接失败、MinIO上传超时、数据关联不一致等告警信息
- application.log:主日志,`rotation = 20MB`,达到阈值后压缩为`application.log.YYYYMMDD.zip``retention = 30天`
- errors.log:错误日志(ERROR及以上),`rotation = 10MB``retention = 90天`
- 结构化扩展字段:日志支持`extra`键值对,自动美化并对长字段(如`sql``params`)截断
建议记录的业务事件:
- MySQL读写操作要点(表名、影响行数、事务状态)
- MinIO对象操作(对象路径、大小、耗时、状态)
- 任务执行上下文(task_id、task_name、module_path、耗时、状态)
### 存储系统设计(MinIO+MySQL
#### 核心存储分工
@@ -113,44 +117,32 @@ intelligence_system/
- 系统类:如任务调度表等采用功能命名(如`main_task`
#### 核心表结构
1. `collector_news_api`:新闻API采集数据表(存储新闻标题、内容等结构化数据
2. `collector_complaint_spider`:投诉信息爬虫数据表(含投诉文本、附件MinIO路径`attachment_minio_path`等)
3. `collector_image_source`:采集层图片元数据表(存储图片URL、MinIO路径、格式、大小等)
4. `processor_text_processor`:文本处理结果表(存储NLP分析结果、关联原文ID等)
5. `processor_image_processor`:图片处理结果表(存储识别标签、特征向量、处理后图片MinIO路径`result_minio_path`
6. `storage_object_index`:MinIO对象索引表(存储所有对象的MinIO路径、哈希值、创建时间、过期时间等)
7. `main_task`:任务调度表(存储任务名称、路径、执行频率、上次/下次执行时间等)
8. `application_reporter_daily`:日报数据表(存储日报结构化内容、报表文件MinIO路径等)
9. `application_reporter_monthly`:月报数据表(存储月报结构化内容、报表文件MinIO路径等)
#### 数据交互特性
1. **MySQL交互**
- 支持DataFrame直接读写,提供分块处理(`chunksize`)和批量插入能力
- 自动适配平台特性(如Windows小批次写入优化)
- 完善的事务机制确保结构化数据一致性
2. **MinIO交互**
- 支持大文件分片上传、断点续传
3. **联动机制**
- 非结构化数据存储时,先上传至MinIO获取路径,再将路径及元数据写入MySQL
- 读取非结构化数据时,先从MySQL获取MinIO路径,再通过路径从MinIO下载
- 日志同步记录MySQL操作和MinIO对象操作(如"上传文件至MinIO: {path},关联MySQL记录ID: {id}"
#### 核心表结构(当前落地)
1. `main_task`:任务调度表(`task_name``task_type``module_path``cron_expression``time_zone``run_count``is_running``last_run_time``last_run_status``next_run_time``is_active`
2. `collector_rss_subscriptions`RSS源采集数据(`文章标题``文章摘要``发布时间``来源URL``文章链接``是否已处理` 等)
3. `processed_rss_data`RSS处理结果(`分词结果``是否汽车相关``处理时间` 等)
4. `collector_complaint_spider`:投诉信息爬虫数据(含文本与附件MinIO路径`attachment_minio_path`等)
5. 可选:`storage_object_index`(建议用于统一索引MinIO对象元数据
### 数据采集设计
1. 结构化数据(如新闻文本、投诉内容):直接写入对应`collector_`前缀表
2. 非结构化数据(如爬取的图片、附件):
- `minio_agent.py`上传至对应存储桶
-MinIO路径、文件大小、格式等元数据写入`collector_`前缀表或`storage_object_index`
3. 每个采集模块(独立py文件,`main`方法入口)需同时处理MySQLMinIO交互,确保数据关联完整
1. 结构化数据(RSS、投诉文本):写入`collector_`前缀表
2. 非结构化数据(附件/图片等):
- 使`utils/minio_agent.py`上传至对应存储桶
-对象路径与元数据写入业务表或`storage_object_index`
3. 采集模块需同时处理MySQLMinIO交互,确保关联完整
### 数据处理设计(RSS流程已实现)
`processors/processor_rss_data.py`流程:
-`collector_rss_subscriptions`加载未处理数据(可配置`limit`
- 加载停用词与行业关键词(`stopwords.txt` / `keywords.txt`),并动态注入`jieba`词典
- 标注词性并过滤停用词,仅保留与汽车后市场相关的词汇
- 标记与过滤:出现任一行业关键词即视为相关,进入保存
- 将结果写入`processed_rss_data`,并回写源表`是否已处理 = 1`
- 输出处理统计(总量、命中量、命中率、时间)
### 数据处理设计
1. 结构化数据处理:从MySQL读取原始数据,处理后写入`processor_`前缀表
2. 非结构化数据处理:
- 从MySQL获取MinIO路径,通过`minio_agent.py`下载原始文件
- 处理后(如图片识别、视频帧提取)将结果文件上传至MinIO(处理层存储桶)
- 将处理结果的结构化信息(如识别标签)和处理后文件的MinIO路径写入`processor_`前缀表
3. 支持多表关联存储,通过`source_id`关联原始数据与处理结果
### 依赖与运行
- 依赖:见`requirements.txt`pandas、SQLAlchemy、PyMySQL、croniter、pytz、loguru、jieba、feedparser、beautifulsoup4、minio 等)
- 配置:在`config.py`中设置`MYSQL_CONFIG`与MinIO参数
- 运行:
- 启动主程序:`python main.py`
- 添加任务:向`main_task`插入记录,`module_path`可指向如`processors.processor_rss_data.main`