Scrapyd与ScrapydWeb - 分布式爬虫部署与监控平台详解
📂 所属阶段:第六阶段 — 运维与监控(工程化篇)
🔗 相关章节:Scrapy-Redis分布式架构 · Docker容器化爬虫 · 抓取监控看板
如果你之前只在本地终端跑单条/几条Scrapy爬虫,现在想批量管理、远程调度、可视化监控成百上千个爬虫,那这对工具绝对是你的首选——Scrapyd负责后端部署调度,ScrapydWeb提供友好的Web操作界面。
本文将聚焦生产实用的核心功能,去掉冗余的代码和配置,带你快速搭建完整的爬虫运维体系。
目录
- 工具概览
- 快速安装与核心配置
- 10分钟部署你的第一个项目
- 日常运维:调度、查看、取消
- 生产环境加固
- 避坑指南与最佳实践
工具概览
Scrapyd
Scrapyd是Scrapy官方开发的轻量级HTTP守护进程,它会监听6800端口,提供RESTful API接口,核心功能包括:
- 多项目、多版本部署
- 控制爬虫的启动、停止、取消
- 自动管理爬虫进程
- 自动存储日志和项目数据
ScrapydWeb
ScrapydWeb是第三方开发的Web UI管理工具,可以对接一台或多台Scrapyd服务器,核心功能包括:
- 可视化的爬虫调度、任务列表
- 实时日志查看与过滤
- 多节点集群统一管理
- 任务完成/失败的Email告警
- 自动日志解析与统计
快速安装与核心配置
Scrapyd(后端守护进程)
1. 安装
# 建议先创建虚拟环境隔离
python -m venv scrapy_env
source scrapy_env/bin/activate # Linux/Mac
# .\scrapy_env\Scripts\activate # Windows
# 安装Scrapyd和部署客户端
pip install scrapyd scrapyd-client
2. 核心配置
创建全局配置文件 /etc/scrapyd/scrapyd.conf(Linux/Mac)或项目目录下的 scrapyd.conf(Windows/临时测试):
[scrapyd]
# 监听地址(0.0.0.0表示允许所有IP访问,生产环境建议先测试再开放)
bind_address = 0.0.0.0
# 监听端口
port = 6800
# 最大并发进程数(0=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
3. 启动服务
临时测试(前台启动):
scrapyd -c /etc/scrapyd/scrapyd.conf
生产环境(Linux 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
sudo systemctl status scrapyd # 检查状态
ScrapydWeb(前端管理界面)
1. 安装
# 在同一虚拟环境或新的虚拟环境安装
pip install scrapydweb
2. 核心配置
第一次启动会自动生成 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', # 本地Scrapyd
# '192.168.1.100:6800', # 远程Scrapyd服务器1
# '192.168.1.101:6800', # 远程Scrapyd服务器2
]
# 开启日志解析
ENABLE_LOGPARSER = True
# 开启Email告警(可选,需要配置SMTP)
ENABLE_EMAIL_ALERT = False
3. 启动服务
临时测试(前台启动):
scrapydweb -c /path/to/config.py
生产环境(Linux 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://your-server-ip:5000 并输入用户名密码,就能看到管理界面了。
10分钟部署你的第一个项目
1. 修改本地Scrapy项目的配置
打开本地Scrapy项目根目录下的 scrapy.cfg,添加部署目标:
[settings]
default = myproject.settings
[deploy:local]
# 本地Scrapyd服务器地址
url = http://localhost:6800/
# 项目名称(必须唯一)
project = myproject
2. 提前在Scrapyd服务器安装项目依赖
Scrapyd不会自动安装项目的第三方依赖(比如 pymongo、requests),需要提前在Scrapyd服务器的虚拟环境中安装:
source /path/to/scrapyd_env/bin/activate
pip install -r /path/to/local/project/requirements.txt
3. 打包并部署
在本地Scrapy项目根目录下执行:
scrapyd-deploy local -p myproject
如果看到 Deployed myproject:vxxxxxx 就说明部署成功了!
日常运维:调度、查看、取消
1. 可视化操作(推荐ScrapydWeb)
登录ScrapydWeb后,操作非常直观:
- 顶部选择Scrapyd节点
- 左侧选择「Schedule」,选中项目、爬虫,填写可选参数,点击「Schedule」启动
- 左侧选择「Jobs」,查看Pending(待启动)、Running(运行中)、Finished(已完成)的任务
- 点击任务的「Log」按钮,实时查看日志
- 点击「Cancel」按钮取消正在运行的任务
2. 核心HTTP API(快速脚本调用)
如果需要用脚本自动化操作,可以直接调用Scrapyd的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
生产环境加固
1. 防火墙限制
生产环境绝对不要直接开放6800端口到公网:
- 只开放ScrapydWeb的5000端口给你的办公IP或VPN
- Scrapyd的6800端口只开放给内网或ScrapydWeb所在的服务器
2. Nginx反向代理+HTTPS
用Nginx反向代理ScrapydWeb,加上HTTPS(用Certbot免费申请),提升安全性:
# /etc/nginx/sites-available/scrapydweb
upstream scrapydweb_backend {
server localhost:5000;
}
server {
listen 80;
server_name scrapyd.yourdomain.com;
# 自动重定向到HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name scrapyd.yourdomain.com;
# Certbot生成的SSL证书
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;
}
}
3. 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" # 只暴露给本机Docker
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是Scrapyd能同时运行的总进程数(不是爬虫数),0表示使用CPU核心数
- 依赖要提前装:Scrapyd不会自动安装项目的第三方依赖
- 不要开放6800到公网:Scrapyd没有认证,开放到公网会被恶意利用
- 路径权限问题:确保Scrapyd的运行用户对
eggs_dir、logs_dir 有读写权限
最佳实践
- 环境隔离:用venv或Docker隔离不同项目的依赖
- 配置分离:不同环境(开发/测试/生产)用不同的
scrapy.cfg 和 config.py
- 定期清理:用Scrapyd的
delversion.json 清理旧版本,设置合理的 logs_to_keep
- 监控告警:开启ScrapydWeb的Email告警,或者用简单的脚本定时检查
daemonstatus.json
- 资源限制:根据硬件资源合理设置
max_proc 和 max_proc_per_host,避免服务器过载
💡 核心要点:Scrapyd负责后端调度,ScrapydWeb负责前端可视化,两者配合可以快速搭建生产级的爬虫运维体系。生产环境一定要注意防火墙、认证、HTTPS这三个安全问题。