Scrapyd与ScrapydWeb - 分布式爬虫部署与监控平台详解
📂 所属阶段:第六阶段 — 运维与监控(工程化篇)
🔗 相关章节:Scrapy-Redis分布式架构 · Docker容器化爬虫 · 抓取监控看板
当你的爬虫不再只是一两条在终端里手动跑的脚本,而是变成几十上百个需要定时调度、监控状态、随时修改规则的项目时,靠人工盯着命令行早已力不从心。Scrapyd 和 ScrapydWeb 正是为解决这个痛点而生:一个负责后台静默调度,一个提供漂亮的网页界面一站式管理。本文将去繁就简,带你用最短的时间搭起一套生产可用的爬虫运维平台。
目录
- 工具概览
- 快速安装与核心配置
- 10分钟部署你的第一个项目
- 日常运维:调度、查看、取消
- 生产环境加固
- 避坑指南与最佳实践
工具概览
Scrapyd
Scrapyd 是 Scrapy 官方推出的轻量级 HTTP 守护进程,默认监听 6800 端口,并提供一套 RESTful API。它的职责非常专注:
- 管理多个项目和版本,支持随时部署新版本
- 启动、暂停、取消爬虫任务
- 自动维护进程,崩溃后可拉起
- 自动保存爬虫运行日志和元数据
你可以把它想象成一个专门为 Scrapy 打造的“任务调度 + 进程管理器”。
ScrapydWeb
ScrapydWeb 是一个第三方开发的 Web UI 管理面板,能够对接一台甚至多台 Scrapyd 服务器。它的亮点是:
- 图形化地调度爬虫,填写参数像填写表单一样简单
- 实时查看、搜索、过滤爬虫日志
- 多节点集群统一管控,一次操作分发到所有节点
- 支持任务完成或失败后的邮件告警
- 自动解析日志中的统计数据(如 item 数量、请求数等)
两者配合,就像给你的爬虫团队安上了自动化驾驶舱。
快速安装与核心配置
1. Scrapyd 守护进程
安装
建议为 Scrapy 生态单独建立虚拟环境,避免包冲突:
python -m venv scrapy_env
source scrapy_env/bin/activate # Linux / Mac
# .\scrapy_env\Scripts\activate # Windows
pip install scrapyd scrapyd-client
scrapyd-client 提供 scrapyd-deploy 命令,用于打包上传项目。
核心配置
创建配置文件(Linux 生产环境通常放在 /etc/scrapyd/scrapyd.conf,Windows 或测试环境可放在项目目录下):
[scrapyd]
# 绑定地址,生产环境建议先设为 127.0.0.1,后续再由内网或代理访问
bind_address = 0.0.0.0
port = 6800
# 最大同时运行的进程数,设为 CPU 核数或按需求调整
max_proc = 4
# 单个项目最多同时运行的进程数
max_proc_per_host = 2
# 日志保留天数
logs_to_keep = 14
# 任务记录保留数
keep_jobs = 10
# 数据存储路径(请确保该运行用户有读写权限)
eggs_dir = /var/lib/scrapyd/eggs
logs_dir = /var/log/scrapyd
dbs_dir = /var/lib/scrapyd/dbs
# 生产环境关闭调试模式
debug = off
注意:max_proc 是 Scrapyd 同时运行的总进程数,不是爬虫个数。例如你同时调度 4 个爬虫,每个爬虫又开了 2 个子进程,就有可能超出限制,需要根据实际 CPU 调整。
启动
临时测试可以直接前台运行:
scrapyd -c /etc/scrapyd/scrapyd.conf
生产环境推荐使用 systemd 托管,实现开机自启和自动恢复。创建 /etc/systemd/system/scrapyd.service:
[Unit]
Description=Scrapyd Service
After=network.target
[Service]
Type=simple
User=your_user
WorkingDirectory=/var/lib/scrapyd
ExecStart=/path/to/scrapy_env/bin/scrapyd -c /etc/scrapyd/scrapyd.conf
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
随后执行:
sudo systemctl daemon-reload
sudo systemctl enable --now scrapyd
2. ScrapydWeb 管理面板
安装
在同个虚拟环境或新环境中安装:
配置
首次启动后,程序会在当前目录自动生成一份 config.py。你需要重点调整以下几个选项:
import os
# 安全密钥,请换成随机字符串
SECRET_KEY = 'your-random-secret-key-here'
# ScrapydWeb 绑定的地址和端口
SCRAPYDWEB_BIND = '0.0.0.0'
SCRAPYDWEB_PORT = 5000
# 开启登录认证(生产必须打开)
ENABLE_AUTHENTICATION = True
USERNAME = 'admin'
PASSWORD = 'your-strong-password-here'
# 要管理的 Scrapyd 节点列表,支持多台
SCRAPYD_SERVERS = [
'localhost:6800', # 本地
# '192.168.1.100:6800', # 远程节点1
# '192.168.1.101:6800', # 远程节点2
]
# 开启日志自动解析
ENABLE_LOGPARSER = True
# 邮件告警(可选)
ENABLE_EMAIL_ALERT = False
同样可以用 systemd 创建 /etc/systemd/system/scrapydweb.service 来守护进程:
[Unit]
Description=ScrapydWeb Service
After=network.target scrapyd.service
[Service]
Type=simple
User=your_user
WorkingDirectory=/path/to/config/dir
ExecStart=/path/to/scrapy_env/bin/scrapydweb -c /path/to/config.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启动并设置自启:
sudo systemctl daemon-reload
sudo systemctl enable --now scrapydweb
现在打开浏览器访问 http://你的IP:5000,输入用户名密码,就能看到管理界面了。
10分钟部署你的第一个项目
第一步:修改本地项目配置
在你本地的 Scrapy 项目根目录下,打开 scrapy.cfg,添加一个部署目标:
[settings]
default = myproject.settings
[deploy:local]
url = http://localhost:6800/ # 你的 Scrapyd 地址
project = myproject # 项目名称,保持唯一
第二步:提前安装依赖
Scrapyd 不会自动读取你的 requirements.txt,所以需要提前登录到 Scrapyd 服务器,在对应的虚拟环境中手动安装:
source /path/to/scrapy_env/bin/activate
pip install -r /path/to/project/requirements.txt
第三步:打包并上传
回到本地项目目录,运行部署命令:
scrapyd-deploy local -p myproject
如果终端输出 Deployed myproject:v202604101230 之类的信息,就说明部署成功。
日常运维:调度、查看、取消
日常操作强烈推荐使用 ScrapydWeb,它把枯燥的 API 调用变成了点几下鼠标的事:
- 在顶部选择你要操作的 Scrapyd 节点
- 左侧点击「Schedule」,选择项目和爬虫,填写参数,一键启动
- 切换到「Jobs」页面,可以实时看到 Pending(排队中)、Running(运行中)、Finished(已完成)的任务
- 点击任务右侧的「Log」实时查看日志
- 需要中止时,直接点「Cancel」
如果你需要编写自动化脚本,也可以直接调用 Scrapyd 的 HTTP API。下面是最常用的 5 个接口示例:
# 1. 列出已部署的项目
curl http://localhost:6800/listprojects.json
# 2. 查看某个项目下的所有爬虫
curl "http://localhost:6800/listspiders.json?project=myproject"
# 3. 启动爬虫(额外参数用 -d arg_参数名=参数值)
curl -X POST http://localhost:6800/schedule.json \
-d project=myproject \
-d spider=myspider \
-d arg_start_url=https://example.com
# 4. 查看项目下的所有任务
curl "http://localhost:6800/listjobs.json?project=myproject"
# 5. 取消指定任务
curl -X POST http://localhost:6800/cancel.json \
-d project=myproject \
-d job=xxx-your-job-id-xxx
生产环境加固
防火墙策略
- 绝对不要直接把 Scrapyd 的
6800 端口暴露在公网上,因为它本身没有认证机制。
- 只开放 ScrapydWeb 的
5000(或经过 Nginx 代理后的 443)给运维人员或办公 VPN。
- Scrapyd 的
6800 端口只对内网、本机或 ScrapydWeb 所在的服务器开放。
Nginx 反向代理 + HTTPS
通过 Nginx 给 ScrapydWeb 套上 HTTPS,既安全又专业。以下是一个常见的 Nginx 配置示例(假设你已经用 Certbot 获取了证书):
upstream scrapydweb_backend {
server localhost:5000;
}
server {
listen 80;
server_name scrapyd.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name scrapyd.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/scrapyd.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/scrapyd.yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# 基本安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
client_max_body_size 10M;
location / {
proxy_pass http://scrapydweb_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
}
}
Docker 一键部署(可选)
如果你习惯容器化,可以用下面的 docker-compose.yml 快速搭建:
version: '3.8'
services:
scrapyd:
image: python:3.9-slim
container_name: scrapyd-server
volumes:
- ./scrapyd.conf:/etc/scrapyd/scrapyd.conf
- ./logs:/var/log/scrapyd
- ./eggs:/var/lib/scrapyd/eggs
ports:
- "127.0.0.1:6800:6800" # 仅本机访问
command: >
bash -c "
pip install scrapyd scrapyd-client pymongo requests &&
scrapyd -c /etc/scrapyd/scrapyd.conf
"
restart: unless-stopped
scrapydweb:
image: my8100/scrapydweb:latest
container_name: scrapydweb-ui
volumes:
- ./config.py:/app/config.py
- ./data:/app/data
- ./logs:/app/logs
ports:
- "0.0.0.0:5000:5000"
depends_on:
- scrapyd
restart: unless-stopped
避坑指南与最佳实践
⚠️ 避坑指南
max_proc 不是爬虫数:它是全局并发进程上限,配合 max_proc_per_host 控制资源,避免把服务器跑满。
- 依赖忘了装:部署前务必在服务器端执行
pip install,否则爬虫会因为缺少模块直接失败。
- 端口直接暴露:Scrapyd 没有登录认证,千万不要直接把
6800 开到公网,否则任何人都可以调度、取消你的爬虫。
- 路径权限错误:Scrapyd 需要对
eggs_dir、logs_dir 等目录拥有读写权限,初次部署时记得 chown 一下。
✅ 最佳实践
- 为每个项目准备独立的虚拟环境或 Docker 镜像,从根源上杜绝依赖冲突。
- 配置文件分环境管理:开发、测试、生产分别使用不同的
scrapy.cfg 和 config.py,并通过环境变量或部署脚本切换。
- 定期清理旧版本和过期日志:可通过
delversion.json API 删除无用版本,并结合 logs_to_keep 自动轮转日志。
- 监控与告警:启用 ScrapydWeb 的邮件告警,或者用简单的脚本定时请求
http://scrapyd:6800/daemonstatus.json 来监控服务状态。
- 资源规划:根据服务器的 CPU 核心数和实际爬虫负载,合理设置
max_proc 和 max_proc_per_host,留出余量给系统和其他服务。
💡 核心要点:Scrapyd 负责后端调度,ScrapydWeb 负责前端可视化,两者配合可以快速搭建生产级的爬虫运维平台。生产环境只要抓住“防火墙 + 认证 + HTTPS”这三个安全点,就能跑得又稳又放心。