TiebaScraper
February 12, 2026 · View on GitHub
TiebaScraper
基于 aiotieba 的高性能百度贴吧异步爬虫工具,支持实时监控和历史数据回溯。
功能特性
- 三种运行模式可选:
- 实时监控模式: 持续监控指定贴吧首页的最新内容
- 历史数据回溯模式: 抓取指定贴吧的历史数据
- 混合模式: 同时运行实时监控和历史数据回溯
- 高性能、高可靠:
- 基于 asyncio/uvloop 的全异步架构
- 同时支持速率限制和并发控制
- 内置重试与防 429 雪崩保护机制
- 支持 PostgreSQL 数据库分区存储
- 支持使用 Redis 进行缓存优化
- 可扩展性:
- 合理的表结构设计,支持高效存储与查询大量数据
- 通过 WebSocket/Redis 支持高度可自定义的实时内容审查
- 实时监控模式支持动态添加或删除监控的贴吧
- 支持通过 Prometheus 监控爬虫相关指标
- 与 TiebaMeow 工具集无缝集成
环境要求
- uv
- PostgreSQL 14+
- (可选)TimescaleDB
- (可选)Redis 6.0+
安装依赖
uv sync
uv 会自动下载合适的 Python 版本并安装所有依赖。对于 Linux 系统,将自动同时安装并在运行时尝试使用 uvloop。
参数配置
-
复制配置文件模板
# Linux / macOS cp config.example.toml config.toml # Windows (PowerShell) Copy-Item config.example.toml config.toml -
编辑
config.toml文件,根据注释填写相应的配置项 -
(可选)使用分组配置,可以为不同的分组设置不同的调度周期
-
为
TiebaScraper创建一个单独的数据库(名称可以自定义):CREATE DATABASE tieba_data; -
推荐单独为
TiebaScraper创建一个用户:CREATE USER your_username WITH PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE tieba_data TO your_username; \c tieba_data GRANT ALL PRIVILEGES ON SCHEMA public TO your_username; GRANT CREATE ON SCHEMA public TO your_username;
数据库分区配置(可选)
如果你的数据量不大(单表量级在百万行以下),可以不启用分区。请注意,我们将爬取到的所有数据存到了 thread、post、comment 三张表中。
如果你希望对数据进行分区存储,以避免单表数据量过大,可以使用 TimescaleDB 扩展来管理 PostgreSQL 数据库中的分区表。
首先,请确保配置文件中的 partition_enabled 选项设置为 true:
partition_enabled = true
并根据你的数据量合理设置 p_interval 的值(如 "3 months"),以确保单个分区不会太大。
然后请确保 PostgreSQL 数据库已安装 TimescaleDB 扩展。可以参考官方文档进行安装,推荐直接使用官方 Docker 镜像 timescale/timescaledb:latest-pg17。
使用方法
三种运行模式
你可以在以下三种模式中选择适合你场景的模式运行:
实时监控模式
实时监控模式下,程序将定期扫描指定贴吧的首页,并根据配置将获取到的新内容推送到消费者队列中。
uv run main.py
历史数据回溯模式
历史数据回溯模式下,程序将根据用户定义的深度抓取指定贴吧的历史数据。
uv run main.py --mode backfill
混合模式
混合模式下,程序将同时运行实时监控和历史数据回溯。混合模式的历史数据回溯任务将从第2页开始抓取。
uv run main.py --mode hybrid
内容审查
当程序运行在实时监控模式或混合模式时,你可以在 config.toml 中配置通过 WebSocket/Redis 将内容推送到审查服务进行处理。你可以在 examples 目录下找到消费者示例和反序列化示例。
开启推送后,程序会推送完整序列化后的对象,你可以直接获得完整数据,并可通过 tiebameow 提供的反序列化函数反序列化得到完整的 tiebameow DTO 对象。DTO 对象的定义请参考 tiebameow/models/dto.py。
TiebaMeow 提供了一个基于 NoneBot2 的 QQ 机器人 TiebaManageBot,你可以使用它提供的无缝集成来快速配置简单的内容审查服务。你也可以使用任何你喜欢的技术栈来实现审查服务,只要它能够连接到 WebSocket/Redis 并处理消息即可。
Prometheus 监控
TiebaScraper 内置了 Prometheus 监控指标,可在配置文件中启用:
[metrics]
enabled = true
port = 8001
你可以在 examples 目录下找到 Prometheus 和 Grafana 的配置示例。
动态添加/删除贴吧
运行于实时监控模式时,TiebaScraper 支持动态添加或删除监控的贴吧。你可以选择通过 WebSocket 连接或 Redis Stream 命令来实现。动态添加的任何贴吧配置都会被自动持久化到 config.toml 文件中,确保重启后依然有效。
通过 WebSocket
发送以下 JSON 格式的消息:
-
添加贴吧:
{ "type": "add_forum", "fname": "贴吧名", "group": "分组名(可选)" } -
删除贴吧:
{ "type": "remove_forum", "fname": "贴吧名" }
通过 Redis Stream
向配置的请求 Stream(默认 scraper:tieba:cmd:req)添加消息。
-
Input:添加消息字段
payload,值为 JSON 字符串。# Redis 命令行示例 XADD scraper:tieba:cmd:req * payload '{"id": "req_1", "type": "add_forum", "fname": "原神", "group": "game"}'id: (可选) 请求 ID,将回传给响应。type: 指令类型。fname: 贴吧名。group: (可选) 分组名。
-
Output:监听响应 Stream(默认
scraper:tieba:cmd:res)。{ "ref_id": "req_1", "ok": true, "msg": "Added successfully" }
如果不指定分组,动态添加的贴吧将会使用全局默认的调度周期运行。
Docker 部署
使用 docker-compose
-
准备配置文件:
复制 Docker 环境配置文件模板:
# Linux / macOS cp config.docker.example.toml config.toml # Windows (PowerShell) Copy-Item config.docker.example.toml config.toml然后,根据你的需求编辑
config.toml文件。请注意,在 Docker 环境中,应用容器需要通过服务名(postgres和redis)来访问数据库和 Redis,因此请确保主机名配置正确。config.docker.example.toml已预设了正确的主机名。你也可以使用环境变量来传递配置参数,环境变量将会优先于配置文件生效,详情请参考
.env.example中的注释。 -
启动服务:
在项目根目录下运行以下命令:
docker compose up -d该命令会从 Docker Hub 拉取
tiebameow/tiebascraper和timescale/timescaledb:latest-pg17镜像,并启动应用、PostgreSQL(已预装TimescaleDB)和 Redis 服务。 -
查看日志:
docker compose logs -f app -
切换运行模式:
默认情况下,应用以
periodic(实时监控)模式运行。如果你需要切换模式,可以运行以下命令:docker compose run --rm app --mode backfill -
停止服务:
docker compose down
其他注意事项
- 可以根据需要使用已有的 PostgreSQL 和 Redis 实例,修改
config.toml中的连接信息并删除docker-compose.yml中对应的服务定义即可。 - 若需外部访问 WebSocket,请在配置中将
websocket.host设置为0.0.0.0并在docker-compose.yml中映射端口。
项目结构
.
├── examples/ # 示例代码(消费者实现等)
├── src/
│ ├── core/ # 核心架构模块
│ │ ├── config.py # 配置加载与 Pydantic 模型定义
│ │ ├── container.py # 依赖注入容器 (IoC),管理 DB/Redis/Client 生命周期
│ │ ├── datastore.py # 数据持久化逻辑 (PostgreSQL/TimescaleDB)
│ │ ├── initialize.py # 应用初始化流程
│ │ ├── metrics.py # Prometheus 监控指标
│ │ ├── publisher.py # 消息推送 (Redis/WebSocket)
│ │ └── ws_server.py # WebSocket 服务端实现
│ ├── scraper/ # 爬虫业务逻辑
│ │ ├── queue.py # 任务优先级队列
│ │ ├── scheduler.py # 任务调度器 (周期性/回溯模式)
│ │ ├── tasks.py # 任务定义 (Task 数据类)
│ │ └── worker.py # 任务执行器 (Worker)
│ └── utils/ # 通用工具函数
├── tests/ # 测试用例
├── config.toml # 配置文件
├── main.py # 程序入口
└── pyproject.toml # 项目依赖与构建配置