一个基于 YAML 配置驱动的通用分布式爬虫系统,支持多 Topic 并发消费,按平台灵活执行爬虫逻辑,最终推送至 ETL 消费系统。
├── config/ # 配置文件
│ ├── __init__.py # 配置初始化
│ ├── recommend.py # 环境配置定义
│ └── spiders_config.yaml# 爬虫平台配置
├── core/ # 核心框架模块
│ ├── recommend/ # 基础组件(异步客户端等)
│ ├── models/ # 数据模型
│ ├── utils/ # 工具类
│ │ ├── config_manager.py # 统一配置管理器
│ │ ├── config_health_check.py # 配置健康检查
│ │ ├── config_documentation.py# 配置文档生成
│ │ └── spider_config.py # 爬虫配置加载
│ └── __init__.py
├── spiders/ # 业务爬虫实现
│ ├── basespider.py # 爬虫基类
│ ├── recommendspider.py # 推荐模式爬虫基类
│ ├── authorspider.py # 账号模式爬虫基类
│ └── spider_registry.py # 爬虫注册中心
├── services/ # 业务服务
│ ├── pipeline.py # 数据处理管道
│ └── async_mysql_service.py # 数据库服务
├── scheduler/ # 调度器
│ ├── process_manager.py # 进程管理
│ └── async_consumer.py # 异步消费者
├── tests/ # 测试用例
└── scripts/ # 运维脚本
└── config_cli.py # 配置管理命令行工具
## 🚀 功能特性
- ✅ 多 Topic 单进程并发监听消费(使用线程)
- ✅ 根据消息动态获取 platform/mode,并注入 user_list、rule_dict
- ✅ YAML 驱动爬虫逻辑,无需重复开发代码
- ✅ 请求支持自动重试、动态分页、字段抽取
- ✅ 视频封装为标准 `VideoItem`,统一推送到 MQ
- ✅ 任务执行成功后再确认 ACK,保证一致性
- ✅ 完善的配置管理(验证、健康检查、文档生成、命令行工具)
- ✅ 异步高并发垂直 Spider 视频查询 API
### 垂直 Spider API
完整的接口参数、筛选规则、去重分页、响应、错误码、日志和部署说明见
[`docs/chui_zhi_video_api.md`](docs/chui_zhi_video_api.md)。
API 默认只监听 `127.0.0.1:8888`。跨服务器访问时应使用 Nginx 反向代理,
并通过固定出口 IP 白名单和限流保护公网接口。
```bash
sh run_api.sh prod
POST /api/v1/crawler/videos/queryGET /health 和 GET /ready 仅用于本机健康检查,Nginx 示例默认禁止公网访问start_time、end_time 推荐传13位毫秒时间戳,API 会统一转换为东八区数据库查询时间create_time 查询最近3天;传入 keywords 时按 video_title 模糊匹配has_more 和 next_cursor 表示是否存在下一页;调用方下一页原样回传 cursormessage 包含脱敏后的原始堆栈;本地日志仅记录
URL、请求参数、状态码,失败时额外记录错误原因crawler-log-prod / crawler-api-access,不再与爬虫日志 crawler-fetch 混合API_HOST、API_PORT、API_MAX_CONCURRENT_REQUESTS、DB_POOL_SIZE、API_QUERY_TIMEOUT、API_QUEUE_TIMEOUT、API_LOG_QUEUE_SIZE、API_MAX_LIMIT 调整运行参数api/app.py,应用生命周期和请求上下文在
api/fastapi_app.pyapi/base.py 统一封装路由注册、执行、响应、异常和数据库查询保护,api/reporting.py 统一访问日志;垂直视频的入参模型、SQL、查询和分页全部集中在
api/chui_zhi/videos.py 的 VideoQueryApi 子类中/docs、/redoc 和 /openapi.json 查看接口文档;Nginx 默认不向公网暴露这些路径筛选条件使用 field/operator/value 结构;没有筛选条件时传空数组或省略 filters:
{
"filters": [
{"field": "like_cnt", "operator": ">", "value": 3},
{"field": "play_cnt", "operator": ">=", "value": 1000},
{"field": "duration", "operator": "between", "value": [60, 300]},
{"field": "publish_time", "operator": ">=", "value": 1785772800000}
]
}
支持 >、>=、=、<、<=、between、in 和 not_in。API 会校验字段、操作符和值,
并使用参数化 SQL。
第一页不传 cursor。如果 has_more=true,下一页将响应里的 next_cursor 原样传回:
{
"cursor": {"id": 6815000}
}
API在筛选范围内按 out_video_id 分组并保留最大 id 的记录,然后只回表查询当前页完整字段;
空 out_video_id 按各自 id 保留。游标作用于分组后的最大 id,避免重复记录跨页再次出现。
公网部署时,API 仍保持 API_HOST=127.0.0.1 和 API_PORT=8888,由 Nginx 对外提供 HTTPS:
# 1. 配置 API 环境变量
API_HOST=127.0.0.1
API_PORT=8888
API_ALIYUN_LOG_PROJECT=crawler-log-prod
API_ALIYUN_LOGSTORE=crawler-api-access
API_ALIYUN_LOG_ENDPOINT=cn-hangzhou.log.aliyuncs.com
# 2. 使用现有部署脚本同时启动主爬虫和API
bash deploy.sh
# 3. 首次部署时安装 Nginx 配置(先替换域名、证书路径和可选 IP 白名单)
cp deploy/nginx/chui_zhi_api.conf.example /etc/nginx/conf.d/chui_zhi_api.conf
nginx -t
systemctl reload nginx
.env 文件和 config/recommend.py 管理config/spiders_config.yaml 管理AutoScraperX 使用分层配置管理系统,提供完整的配置管理功能:
环境配置通过 .env 文件管理,包含数据库、消息队列、日志等基础设施配置。
.env.example 为 .envcp .env.example .env
# 编辑 .env 文件
爬虫配置通过 config/spiders_config.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 模型对配置进行验证,确保配置格式正确:
运行以下命令检查配置健康状态:
python -m core.utils.config_health_check
该工具会检查:
运行以下命令生成配置文档:
python -m core.utils.config_documentation
生成的文档包含:
使用命令行工具管理配置:
# 检查配置健康状态
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>
当修改了配置文件后,可以通过以下方式重新加载配置而无需重启服务:
# 通过API重新加载配置(如果启用了配置API服务)
curl -X POST http://127.0.0.1:8080/config/reload
# 或者在代码中调用
from core.utils.spider_config import SpiderConfig
SpiderConfig.reload_config()
python main.py
程序将自动监听所有 Topic,消费消息后创建对应的爬虫任务并执行。
default:
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: "{{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_stamp: "$.update_time"
out_user_id: "$.nid"
cover_url: "$.video_cover"
like_cnt: 0
video_url: "$.video_url"
out_video_id: "$.nid"
.run(),完成后再 ACK运行测试:
# 运行所有测试
pytest
# 运行特定测试
pytest tests/test_config.py
# 安装依赖
pip install -r requirements.txt
# 启动服务
python main.py
# 推荐:同时部署主爬虫和垂直视频API,并执行API就绪检查
bash deploy.sh
查看所有平台配置:
python scripts/config_cli.py list
bash
python scripts/config_cli.py show <platform_name>
检查配置健康状态:
python scripts/config_cli.py check
bash
python scripts/config_cli.py docs
查看配置统计信息:
python scripts/config_cli.py stats
当需要更新配置时:
config/spiders_config.yaml 文件通过命令行工具重新加载配置:
# 在代码中调用重新加载
from core.utils.spider_config import SpiderConfig
SpiderConfig.reload_config()
检查系统健康状态:
python -m core.utils.config_health_check
bash
python -m core.utils.config_documentation
写入安全标题表:
https://w42nne6hzg.feishu.cn/sheets/U5dXsSlPOhiNNCtEfgqcm1iYnpf?sheet=K0gA9Y