Docker Compose一键搭建pyspider容器化爬虫集群:从单机到多副本部署实践
【免费下载链接】pyspiderA Powerful Spider(Web Crawler) System in Python.项目地址: https://gitcode.com/gh_mirrors/py/pyspider
pyspider 是一款用 Python 编写的功能强大的分布式爬虫(Web Crawler)系统。本文带你用Docker Compose一键搭建 pyspider 容器化爬虫集群,讲清它的镜像结构、各组件如何协同,以及如何从单台机器横向扩展到多副本,最终跑起一个可弹性伸缩的生产级爬虫服务。
先理解:pyspider 容器化部署的六大核心组件
pyspider 采用组件化架构,每个组件都运行在独立进程中,通过消息队列(RabbitMQ/Redis)互相连接、彼此可替换、可独立扩容(见 docs/Architecture.md)。容器化部署时,就是把每个组件跑进各自的容器:
| 组件 | 职责 | 能否多副本 |
|---|---|---|
| Scheduler | 任务调度、优先级排序、流量控制、定时与重试 | ❌ 全局仅一个 |
| Fetcher | 发起 HTTP 请求抓取网页 | ✅ 可多副本 |
| Phantomjs | 渲染 JS 动态页面并回传 HTML | ✅ 可多副本 |
| Processor | 运行用户脚本,解析与抽取数据(CPU 密集) | ✅ 建议按 CPU 核数扩容 |
| Result Worker | 接收结果并写入数据库 | ✅ 可多副本 |
| WebUI | 脚本编辑、调试、项目与结果管理的前端界面 | ✅ 可多副本 |
理解「谁可以扩容、谁必须唯一」,是你决定开几个副本的关键。Scheduler 有且仅有一个,而 Fetcher / Processor / Phantomjs / WebUI 越多越快。
一键搭建第一步:认识 Dockerfile 与镜像
打开仓库根目录的 Dockerfile,可以看到官方镜像pyspider:latest的构建逻辑:
- 基础环境:基于
python:3.6,内置 Phantomjs 与 Node.js(用于 JS 渲染); - 依赖安装:自动
pip install -e .[all]装齐全部组件依赖; - 对外端口:
EXPOSE 5000 23333 24444 25555 22222,分别对应 WebUI、Scheduler、Fetcher、Phantomjs 等 RPC 与 Web 端口; - 启动入口:
ENTRYPOINT ["pyspider"],因此后续用command就能直接指定要跑哪个子命令。
💡 核心设计:一个镜像、多种
command。同一个pyspider:latest镜像,靠不同的启动参数分别变成 scheduler、fetcher、processor……这也是 Docker Compose 能优雅编排的前提。
一键启动:docker-compose.yaml 服务编排解析
仓库提供了现成的 docker-compose.yaml,把一整套集群声明成 YAML。它定义了如下服务:
- 基础设施:
rabbitmq(消息队列)+mysql(数据库),供全部组件共享; - 爬虫组件:
phantomjs、result、processor、fetcher、scheduler、webui; - 共享网络:所有服务挂到同一个
pyspider网络,组件间用容器名直接互访。
每个爬虫容器都通过只读挂载同一份配置进入容器:
- ./config_example.json:/opt/pyspider/config.json并指定command: -c config.json <组件名>。配置内容参考 config_example.json:用taskdb / projectdb / resultdb三个连接串指向数据库,message_queue指向消息队列,webui里再声明scheduler-rpc、fetcher-rpc让前端能跨容器调用后端。
唯一对外暴露的端口是 WebUI:"5050:5000"。也就是启动后浏览器访问http://localhost:5050即可进入管理界面。
启动只需一条命令:
docker compose up -d⚠️注意:compose 文件顶部明确提醒——RabbitMQ 和数据库(此处为 CouchDB/MySQL)冷启动较慢,启动初期部分 pyspider 服务可能报「连接被拒绝」而自动重启,等基础设施就绪后便会恢复正常。这是预期现象,无需处理。
从单机到多副本:横向扩容让爬虫更快
pyspider 架构的最大红利就是横向扩容。单机验证通过后,你可以按组件瓶颈增加副本数:
- CPU 瓶颈(解析慢)→ 加
processor。官方经验值:副本数约等于 CPU 核数 + 1~2; - 请求瓶颈(抓取慢)→ 加
fetcher/phantomjs; - Web 访问并发高→ 加
webui。
官方线上站点 demo.pyspider.org 就是跨三台 VPS、全部容器化的真实多副本案例,部署细节可参考 docs/Deployment-demo.pyspider.org.md 与 docs/Deployment.md。扩容方式极其简单,例如把 phantomjs、processor、webui 分别扩到 2、2、4 个副本:
docker compose up -d --scale processor=4 --scale webui=2若跨机器部署,再把 Scheduler 靠近数据库、为 Fetcher/Phantomjs/WebUI 各配一层负载均衡即可平滑演进成真正的分布式爬虫集群(详见 docs/Running-pyspider-with-Docker.md)。
常见运维技巧与排错清单
- 只想快速试跑:可只起
scheduler + processor + fetcher + webui与 MySQL、RabbitMQ,先验证脚本跑通,再按需加 Phantomjs; - 端口冲突:确认宿主机
5050未被占用,或修改 compose 中webui的ports映射; - 配置变更不生效:
config_example.json是挂载进去的,改完文件后需docker compose restart对应服务; - 内存保护:Phantomjs 有内存泄漏倾向,生产环境建议限制其内存并周期性重启,避免拖垮整机。
小结
借助 Dockerfile 构建的统一镜像与 docker-compose.yaml 的声明式编排,你只需一次docker compose up -d,就能把 pyspider 的调度、抓取、渲染、解析、结果与 WebUI 六个组件全部容器化跑起来;再依据组件瓶颈用--scale横向扩容,即可从单机原型平滑过渡到多副本的容器化爬虫集群。掌握这套「组件化 + 消息队列 + 多副本」的部署思路,你就拥有了一个可弹性伸缩、可上生产的生产级 Python 爬虫系统。
【免费下载链接】pyspiderA Powerful Spider(Web Crawler) System in Python.项目地址: https://gitcode.com/gh_mirrors/py/pyspider
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考