以前用过 Gerapy 来分布式管理 Scrapy 爬虫,但会碰到一些小 BUG 无法解决,也找不到相关参考资料,碰巧看到有网友推荐 Crawlab,于是在测试环境部署看看咋样。本文简要记录安装配置过程中碰到的问题。
官方称 Crawlab 是一个使用 Golang 开发的分布式爬虫管理平台,支持 Python、NodeJS、Go、Java、PHP 等多种编程语言以及多种爬虫框架。
Crawlab 支持多种部署方式,这里用官方推荐的 docker-compose 来部署。
一键部署 Crawlab
1、先到 Crawlab 的 GitHub 上复制一份 docker-compose.yml 文件到本地目录。配置文件中可以看到默认会启动 crawlab 、mongo、redis 三个容器。
2、确认已安装了 docker-compose,否则 pip install docker-compose 安装。
3、先启动看是否正常:docker-compose up,加 -d 参数会后台执行。等待所有镜像拉取完成并启动。
4、在浏览器中输入 http://服务器IP:8080 即可看到 Crawlab 控制面板,默认登陆账号密码均为 admin。
自定义 MongoDB 和 Redis 部署 Crawlab
Crawlab 会默认拉取启动 mongo 和 redis 容器。如果我们已经单独安装过 MongoDB 和 Redis,则可修改配置文件来指定服务器地址。
编辑 docker-compose.yml 文件的 environment 信息,添加对应的数据库地址、端口、用户名、密码等,master 和 worker 的 environment 中都要添加。注意:如果 MongoDB 和 Redis 是在宿主机本机安装,CRAWLAB_MONGO_HOST 和 CRAWLAB_REDIS_ADDRESS 要填写容器绑定的即 docker0 虚拟网卡的IP,一般是 172 开头的,如 "172.17.0.1",而不能是 localhost 或 127.0.0.1。再将下面的 mongo 和 redis 容器依赖删掉即可。完整的 docker-compose.yml 类似这样:
version: '3.3'
services:
master:
image: tikazyq/crawlab:latest
container_name: master
environment:
CRAWLAB_SERVER_MASTER: "Y"
CRAWLAB_MONGO_HOST: "172.17.0.1"
CRAWLAB_MONGO_PORT: "27017"
CRAWLAB_MONGO_DB: "crawlab_test"
CRAWLAB_MONGO_USERNAME: "admin"
CRAWLAB_MONGO_PASSWORD: "password"
CRAWLAB_MONGO_AUTHSOURCE: "admin"
CRAWLAB_REDIS_ADDRESS: "172.17.0.1"
CRAWLAB_REDIS_PORT: "6379"
CRAWLAB_REDIS_DATABASE: "1"
CRAWLAB_REDIS_PASSWORD: "password"
ports:
- "8080:8080"
worker:
image: tikazyq/crawlab:latest
container_name: worker
environment:
CRAWLAB_SERVER_MASTER: "N"
CRAWLAB_MONGO_HOST: "172.17.0.1"
CRAWLAB_MONGO_PORT: "27017"
CRAWLAB_MONGO_DB: "crawlab_test"
CRAWLAB_MONGO_USERNAME: "admin"
CRAWLAB_MONGO_PASSWORD: "password"
CRAWLAB_MONGO_AUTHSOURCE: "admin"
CRAWLAB_REDIS_ADDRESS: "172.17.0.1"
CRAWLAB_REDIS_PORT: "6379"
CRAWLAB_REDIS_DATABASE: "1"
CRAWLAB_REDIS_PASSWORD: "password"
多节点部署 Crawlab
多节点部署 Crawlab 时,我们用一台服务器来作为 master 主节点运行、监控、操作爬虫 。其他服务器上部署 worker 子节点,主要用来抓数据。同样是 Docker 部署。
主节点的 docker-compose.yml ,其中 CRAWLAB_SERVER_MASTER 设置为 Y
version: '3.3'
services:
master:
image: tikazyq/crawlab:latest
container_name: master
environment:
CRAWLAB_SERVER_MASTER: "Y"
CRAWLAB_MONGO_HOST: "172.17.0.1"
CRAWLAB_MONGO_PORT: "27017"
CRAWLAB_MONGO_DB: "crawlab_test"
CRAWLAB_MONGO_USERNAME: "admin"
CRAWLAB_MONGO_PASSWORD: "password"
CRAWLAB_MONGO_AUTHSOURCE: "admin"
CRAWLAB_REDIS_ADDRESS: "172.17.0.1"
CRAWLAB_REDIS_PORT: "6379"
CRAWLAB_REDIS_DATABASE: "1"
CRAWLAB_REDIS_PASSWORD: "password"
CRAWLAB_SERVER_REGISTER_TYPE: "ip"
CRAWLAB_SERVER_REGISTER_IP: "172.19.0.1"
ports:
- "8080:8080"
子节点的 docker-compose.yml ,其中 CRAWLAB_SERVER_MASTER 设置为 N
version: '3.3'
services:
worker:
image: tikazyq/crawlab:latest
container_name: worker
environment:
CRAWLAB_SERVER_MASTER: "N"
CRAWLAB_MONGO_HOST: "172.17.0.1" #应为MongoDB服务器外网IP
CRAWLAB_MONGO_PORT: "27017"
CRAWLAB_MONGO_DB: "crawlab_test"
CRAWLAB_MONGO_USERNAME: "admin"
CRAWLAB_MONGO_PASSWORD: "password"
CRAWLAB_MONGO_AUTHSOURCE: "admin"
CRAWLAB_REDIS_ADDRESS: "172.17.0.1" #应为Redis服务器外网IP
CRAWLAB_REDIS_PORT: "6379"
CRAWLAB_REDIS_DATABASE: "1"
CRAWLAB_REDIS_PASSWORD: "password"
CRAWLAB_SERVER_REGISTER_TYPE: "ip"
CRAWLAB_SERVER_REGISTER_IP: "172.19.0.2"
此处要注意:Crawlab 默认的 CRAWLAB_SERVER_REGISTER_TYPE 为 mac,但多个子节点启动 docker 容器时可能会出现 mac 地址相同的情况,这也会导致在 Crawlab 管理面板的节点列表中找不到 mac 冲突的子节点,所以这里建议设置 CRAWLAB_SERVER_REGISTER_TYPE 为 ip 或 hostname 等不重复的注册类别。
配置完后 docker-compose up -d 启动即可。
未完待续
参考资料:
Docker容器访问宿主机网络
Docker容器访问宿主机
Crawlab 文档