|
@@ -1,4 +1,3 @@
|
|
|
-
|
|
|
# AutoScraperX
|
|
|
|
|
|
一个基于 YAML 配置驱动的通用分布式爬虫系统,支持多 Topic 并发消费,按平台灵活执行爬虫逻辑,最终推送至 ETL 消费系统。
|
|
@@ -8,69 +7,33 @@
|
|
|
## 🧠 项目结构简介
|
|
|
|
|
|
```bash
|
|
|
+├── config/ # 配置文件
|
|
|
+│ ├── __init__.py # 配置初始化
|
|
|
+│ ├── base.py # 环境配置定义
|
|
|
+│ └── spiders_config.yaml# 爬虫平台配置
|
|
|
├── core/ # 核心框架模块
|
|
|
-│ ├── common/ # 公共工具类
|
|
|
-│ │ ├── config_loader.py # 配置加载(YAML→Pydantic模型)
|
|
|
-│ │ ├── exception.py # 自定义异常体系(DataError/NetError等)
|
|
|
-│ │ └── utils.py # 通用工具(时间戳/哈希/正则)
|
|
|
-│ ├── database/ # 数据库访问层
|
|
|
-│ │ ├── base.py # 异步DB基类(连接池管理)
|
|
|
-│ │ └── mysql.py # MySQL具体实现(CRUD封装)
|
|
|
-│ ├── log/ # 日志系统
|
|
|
-│ │ ├── aliyun_logger.py # 阿里云SLS日志适配器
|
|
|
-│ │ └── local_logger.py # 本地文件日志(按天滚动)
|
|
|
-│ └── spider/ # 爬虫核心组件
|
|
|
-│ ├── basespider.py # 爬虫基类(定义run/parse等抽象方法)
|
|
|
-│ ├── registry.py # 爬虫注册中心(动态加载子类)
|
|
|
-│ └── pipeline.py # 数据处理流水线(清洗/去重/存储)
|
|
|
+│ ├── base/ # 基础组件(异步客户端等)
|
|
|
+│ ├── models/ # 数据模型
|
|
|
+│ ├── utils/ # 工具类
|
|
|
+│ │ ├── config_manager.py # 统一配置管理器
|
|
|
+│ │ ├── config_health_check.py # 配置健康检查
|
|
|
+│ │ ├── config_documentation.py# 配置文档生成
|
|
|
+│ │ └── spider_config.py # 爬虫配置加载
|
|
|
+│ └── __init__.py
|
|
|
├── spiders/ # 业务爬虫实现
|
|
|
-│ ├── wechat_official/ # 微信公众号爬虫
|
|
|
-│ ├── video_account/ # 视频号爬虫
|
|
|
-│ └── news_website.py # 新闻网站示例爬虫
|
|
|
-├── config/ # 配置文件
|
|
|
-│ ├── __init__.py # 配置模型初始化
|
|
|
-│ ├── dev.yaml # 开发环境配置(本地MySQL/日志级别DEBUG)
|
|
|
-│ └── prod.yaml # 生产环境配置(阿里云RDS/日志级别INFO)
|
|
|
+│ ├── basespider.py # 爬虫基类
|
|
|
+│ ├── recommendspider.py # 推荐模式爬虫基类
|
|
|
+│ ├── authorspider.py # 账号模式爬虫基类
|
|
|
+│ └── spider_registry.py # 爬虫注册中心
|
|
|
+├── services/ # 业务服务
|
|
|
+│ ├── pipeline.py # 数据处理管道
|
|
|
+│ └── async_mysql_service.py # 数据库服务
|
|
|
+├── scheduler/ # 调度器
|
|
|
+│ ├── process_manager.py # 进程管理
|
|
|
+│ └── async_consumer.py # 异步消费者
|
|
|
├── tests/ # 测试用例
|
|
|
-│ ├── test_spider.py # 爬虫基类功能测试
|
|
|
-│ └── test_pipeline.py # 数据清洗流水线测试
|
|
|
-├── scripts/ # 运维脚本
|
|
|
-│ ├── manage.py # 爬虫管理工具(启动/监控/清洗)
|
|
|
-│ └── deploy.sh # 生产环境部署脚本
|
|
|
-├── .env.example # 环境变量示例(敏感信息占位符)
|
|
|
-├── requirements.txt # 依赖库清单(含版本约束)
|
|
|
-├── pyproject.toml # PEP 621项目元数据(poetry管理)
|
|
|
-└── README.md # 项目说明(当前文件)
|
|
|
-
|
|
|
-4. 添加新爬虫
|
|
|
-4.1 实现爬虫类
|
|
|
-# spiders/tech_blog.py
|
|
|
-from core.spider.base_spider import BaseSpider
|
|
|
-
|
|
|
-class TechBlogSpider(BaseSpider):
|
|
|
- name = "tech_blog"
|
|
|
-
|
|
|
- async def parse(self, response):
|
|
|
- articles = []
|
|
|
- for item in response.html.select("div.article"):
|
|
|
- title = item.select_one("h2.title").text.strip()
|
|
|
- link = item.select_one("a")["href"]
|
|
|
- articles.append({"title": title, "link": link})
|
|
|
- return articles
|
|
|
-4.2 注册爬虫
|
|
|
-# spiders/__init__.py
|
|
|
-from spiders.tech_blog import TechBlogSpider
|
|
|
-
|
|
|
-SPIDER_REGISTRY = {
|
|
|
- cls.name: cls for cls in BaseSpider.__subclasses__()
|
|
|
-}
|
|
|
-
|
|
|
-4.3 配置MQ主题
|
|
|
-# config/prod.yaml
|
|
|
-spider:
|
|
|
- topic: "custom_tech_blog_topic"
|
|
|
-
|
|
|
-核心流程
|
|
|
+└── scripts/ # 运维脚本
|
|
|
+ └── config_cli.py # 配置管理命令行工具
|
|
|
|
|
|
## 🚀 功能特性
|
|
|
|
|
@@ -80,18 +43,126 @@ spider:
|
|
|
- ✅ 请求支持自动重试、动态分页、字段抽取
|
|
|
- ✅ 视频封装为标准 `VideoItem`,统一推送到 MQ
|
|
|
- ✅ 任务执行成功后再确认 ACK,保证一致性
|
|
|
+- ✅ 完善的配置管理(验证、健康检查、文档生成、命令行工具)
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🧱 架构概览
|
|
|
|
|
|
-- **main.py**:监听多个 Topic,消费 MQ 消息,解析出平台并调度 `UniversalCrawler`
|
|
|
-- **UniversalCrawler**:核心爬虫逻辑,读取配置发送请求,抽取字段,封装数据项,交由 `pipeline` 处理
|
|
|
-- **PiaoQuanPipeline**:负责数据 ETL 入库、推送到 ETL MQ
|
|
|
+- **main.py**:监听多个 Topic,消费 MQ 消息,解析出平台并调度爬虫
|
|
|
+- **爬虫类**:核心爬虫逻辑,读取配置发送请求,抽取字段,封装数据项
|
|
|
+- **Pipeline**:负责数据校验、去重和推送至 ETL MQ
|
|
|
- **MQ 系统**:阿里云 MQ,支持按平台配置多个 Topic,消费完成再手动 ACK
|
|
|
-- **配置文件**:
|
|
|
- - `spiders_config.yaml`:各平台请求方式、字段映射、分页等配置
|
|
|
- - `topic_map.yaml`:多 Topic 映射(暂不再使用 platform 字段)
|
|
|
+- **配置系统**:
|
|
|
+ - 环境配置:通过 `.env` 文件和 `config/base.py` 管理
|
|
|
+ - 爬虫配置:通过 `config/spiders_config.yaml` 管理
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## ⚙️ 配置管理
|
|
|
+
|
|
|
+AutoScraperX 使用分层配置管理系统,提供完整的配置管理功能:
|
|
|
+
|
|
|
+### 环境配置
|
|
|
+
|
|
|
+环境配置通过 `.env` 文件管理,包含数据库、消息队列、日志等基础设施配置。
|
|
|
+
|
|
|
+1. 复制 `.env.example` 为 `.env`
|
|
|
+2. 根据实际环境填写配置项
|
|
|
+
|
|
|
+```bash
|
|
|
+cp .env.example .env
|
|
|
+# 编辑 .env 文件
|
|
|
+```
|
|
|
+
|
|
|
+### 爬虫配置
|
|
|
+
|
|
|
+爬虫配置通过 `config/spiders_config.yaml` 文件管理,采用 YAML 格式,支持默认配置和平台特定配置。
|
|
|
+
|
|
|
+```yaml
|
|
|
+# 默认配置
|
|
|
+default:
|
|
|
+ base_url: http://api.example.com
|
|
|
+ request_timeout: 30
|
|
|
+ max_retries: 3
|
|
|
+
|
|
|
+# 平台特定配置
|
|
|
+platform_name:
|
|
|
+ platform: platform_name
|
|
|
+ mode: recommend
|
|
|
+ path: /api/path
|
|
|
+ method: post
|
|
|
+ # 更多配置...
|
|
|
+```
|
|
|
+
|
|
|
+### 配置验证
|
|
|
+
|
|
|
+系统使用 Pydantic 模型对配置进行验证,确保配置格式正确:
|
|
|
+
|
|
|
+- HTTP方法必须是有效的(GET, POST, PUT, DELETE, PATCH)
|
|
|
+- 循环次数必须是正数
|
|
|
+- 循环间隔配置必须包含min和max,且min不能大于max
|
|
|
+- 响应解析配置必须包含data_path字段
|
|
|
+
|
|
|
+### 配置健康检查
|
|
|
+
|
|
|
+运行以下命令检查配置健康状态:
|
|
|
+
|
|
|
+```bash
|
|
|
+python -m core.utils.config_health_check
|
|
|
+```
|
|
|
+
|
|
|
+该工具会检查:
|
|
|
+- 环境配置完整性
|
|
|
+- 爬虫配置有效性
|
|
|
+- 配置文件权限
|
|
|
+
|
|
|
+### 配置文档生成
|
|
|
+
|
|
|
+运行以下命令生成配置文档:
|
|
|
+
|
|
|
+```bash
|
|
|
+python -m core.utils.config_documentation
|
|
|
+```
|
|
|
+
|
|
|
+生成的文档包含:
|
|
|
+- 环境配置详细说明
|
|
|
+- 爬虫配置结构说明
|
|
|
+- 当前配置状态信息
|
|
|
+
|
|
|
+### 配置命令行工具
|
|
|
+
|
|
|
+使用命令行工具管理配置:
|
|
|
+
|
|
|
+```bash
|
|
|
+# 检查配置健康状态
|
|
|
+python scripts/config_cli.py check
|
|
|
+
|
|
|
+# 生成配置文档
|
|
|
+python scripts/config_cli.py docs
|
|
|
+
|
|
|
+# 列出所有平台
|
|
|
+python scripts/config_cli.py list
|
|
|
+
|
|
|
+# 显示配置统计信息
|
|
|
+python scripts/config_cli.py stats
|
|
|
+
|
|
|
+# 显示特定平台配置详情
|
|
|
+python scripts/config_cli.py show <platform_name>
|
|
|
+```
|
|
|
+
|
|
|
+### 配置热更新
|
|
|
+
|
|
|
+当修改了配置文件后,可以通过以下方式重新加载配置而无需重启服务:
|
|
|
+
|
|
|
+```bash
|
|
|
+# 通过API重新加载配置(如果启用了配置API服务)
|
|
|
+curl -X POST http://127.0.0.1:8080/config/reload
|
|
|
+
|
|
|
+# 或者在代码中调用
|
|
|
+from core.utils.spider_config import SpiderConfig
|
|
|
+SpiderConfig.reload_config()
|
|
|
+```
|
|
|
|
|
|
---
|
|
|
|
|
@@ -100,7 +171,7 @@ spider:
|
|
|
### 1. 启动项目
|
|
|
|
|
|
```bash
|
|
|
-python main1.py
|
|
|
+python main.py
|
|
|
```
|
|
|
|
|
|
> 程序将自动监听所有 Topic,消费消息后创建对应的爬虫任务并执行。
|
|
@@ -111,29 +182,37 @@ python main1.py
|
|
|
|
|
|
```yaml
|
|
|
default:
|
|
|
- base_url: http://api.xxx.com
|
|
|
- request_timeout: 30[]()
|
|
|
+ base_url: http://8.217.192.46:8889
|
|
|
+ request_timeout: 30
|
|
|
headers:
|
|
|
{"Content-Type": "application/json"}
|
|
|
|
|
|
benshanzhufu:
|
|
|
+ platform: benshanzhufu
|
|
|
mode: recommend
|
|
|
path: /crawler/ben_shan_zhu_fu/recommend
|
|
|
method: post
|
|
|
request_body:
|
|
|
- cursor: "1"
|
|
|
- paging: true
|
|
|
- max_pages: 5
|
|
|
- etl_hook: "process_video_obj"
|
|
|
+ cursor: "{{next_cursor}}"
|
|
|
+ loop_times: 50
|
|
|
+ loop_interval:
|
|
|
+ min: 30
|
|
|
+ max: 60
|
|
|
+ feishu_sheetid: "aTSJH4"
|
|
|
response_parse:
|
|
|
+ data: "$.data"
|
|
|
next_cursor: "$.data.next_cursor"
|
|
|
data_path: "$.data.data"
|
|
|
fields:
|
|
|
video_id: "$.nid"
|
|
|
video_title: "$.title"
|
|
|
play_cnt: 0
|
|
|
- publish_time: "$.update_time"
|
|
|
+ publish_time_stamp: "$.update_time"
|
|
|
+ out_user_id: "$.nid"
|
|
|
+ cover_url: "$.video_cover"
|
|
|
+ like_cnt: 0
|
|
|
video_url: "$.video_url"
|
|
|
+ out_video_id: "$.nid"
|
|
|
```
|
|
|
|
|
|
---
|
|
@@ -141,8 +220,87 @@ benshanzhufu:
|
|
|
## 🧵 线程调度与消费机制
|
|
|
|
|
|
- 每个 topic 启一个线程进行 MQ 消费
|
|
|
-- 每条消息创建一个 UniversalCrawler 实例,执行 `.run()`,完成后再 ACK
|
|
|
+- 每条消息创建一个爬虫实例,执行 `.run()`,完成后再 ACK
|
|
|
- 失败或超时不会阻塞其他任务
|
|
|
|
|
|
-pip freeze > requirements.txt
|
|
|
-pip install -r requirements.txt
|
|
|
+---
|
|
|
+
|
|
|
+## 🧪 测试
|
|
|
+
|
|
|
+运行测试:
|
|
|
+
|
|
|
+```bash
|
|
|
+# 运行所有测试
|
|
|
+pytest
|
|
|
+
|
|
|
+# 运行特定测试
|
|
|
+pytest tests/test_config.py
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 📦 部署
|
|
|
+
|
|
|
+```bash
|
|
|
+# 安装依赖
|
|
|
+pip install -r requirements.txt
|
|
|
+
|
|
|
+# 启动服务
|
|
|
+python main.py
|
|
|
+
|
|
|
+# 或使用部署脚本
|
|
|
+sh deploy.sh
|
|
|
+```
|
|
|
+
|
|
|
+## 🧰 常用操作
|
|
|
+
|
|
|
+### 配置管理操作
|
|
|
+
|
|
|
+1. **查看所有平台配置**:
|
|
|
+ ```bash
|
|
|
+ python scripts/config_cli.py list
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **查看特定平台配置详情**:
|
|
|
+ ```bash
|
|
|
+ python scripts/config_cli.py show <platform_name>
|
|
|
+ ```
|
|
|
+
|
|
|
+3. **检查配置健康状态**:
|
|
|
+ ```bash
|
|
|
+ python scripts/config_cli.py check
|
|
|
+ ```
|
|
|
+
|
|
|
+4. **生成配置文档**:
|
|
|
+ ```bash
|
|
|
+ python scripts/config_cli.py docs
|
|
|
+ ```
|
|
|
+
|
|
|
+5. **查看配置统计信息**:
|
|
|
+ ```bash
|
|
|
+ python scripts/config_cli.py stats
|
|
|
+ ```
|
|
|
+
|
|
|
+### 配置更新操作
|
|
|
+
|
|
|
+当需要更新配置时:
|
|
|
+
|
|
|
+1. 编辑 `config/spiders_config.yaml` 文件
|
|
|
+2. 通过命令行工具重新加载配置:
|
|
|
+ ```bash
|
|
|
+ # 在代码中调用重新加载
|
|
|
+ from core.utils.spider_config import SpiderConfig
|
|
|
+ SpiderConfig.reload_config()
|
|
|
+ ```
|
|
|
+
|
|
|
+### 日常维护操作
|
|
|
+
|
|
|
+1. **检查系统健康状态**:
|
|
|
+ ```bash
|
|
|
+ python -m core.utils.config_health_check
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **生成最新的配置文档**:
|
|
|
+ ```bash
|
|
|
+ python -m core.utils.config_documentation
|
|
|
+ ```
|