Scrapyd与ScrapydWeb - 分布式爬虫部署与监控平台详解

📂 所属阶段:第六阶段 — 运维与监控(工程化篇)
🔗 相关章节:Scrapy-Redis分布式架构 · Docker容器化爬虫 · 抓取监控看板

如果你之前只在本地终端跑单条/几条Scrapy爬虫,现在想批量管理、远程调度、可视化监控成百上千个爬虫,那这对工具绝对是你的首选——Scrapyd负责后端部署调度,ScrapydWeb提供友好的Web操作界面

本文将聚焦生产实用的核心功能,去掉冗余的代码和配置,带你快速搭建完整的爬虫运维体系。


目录

  1. 工具概览
  2. 快速安装与核心配置
  3. 10分钟部署你的第一个项目
  4. 日常运维:调度、查看、取消
  5. 生产环境加固
  6. 避坑指南与最佳实践

工具概览

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不会自动安装项目的第三方依赖(比如 pymongorequests),需要提前在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后,操作非常直观:

  1. 顶部选择Scrapyd节点
  2. 左侧选择「Schedule」,选中项目、爬虫,填写可选参数,点击「Schedule」启动
  3. 左侧选择「Jobs」,查看Pending(待启动)、Running(运行中)、Finished(已完成)的任务
  4. 点击任务的「Log」按钮,实时查看日志
  5. 点击「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

避坑指南与最佳实践

避坑指南

  1. max_proc的误解max_proc是Scrapyd能同时运行的总进程数(不是爬虫数),0表示使用CPU核心数
  2. 依赖要提前装:Scrapyd不会自动安装项目的第三方依赖
  3. 不要开放6800到公网:Scrapyd没有认证,开放到公网会被恶意利用
  4. 路径权限问题:确保Scrapyd的运行用户对 eggs_dirlogs_dir 有读写权限

最佳实践

  1. 环境隔离:用venv或Docker隔离不同项目的依赖
  2. 配置分离:不同环境(开发/测试/生产)用不同的 scrapy.cfgconfig.py
  3. 定期清理:用Scrapyd的 delversion.json 清理旧版本,设置合理的 logs_to_keep
  4. 监控告警:开启ScrapydWeb的Email告警,或者用简单的脚本定时检查 daemonstatus.json
  5. 资源限制:根据硬件资源合理设置 max_procmax_proc_per_host,避免服务器过载

💡 核心要点:Scrapyd负责后端调度,ScrapydWeb负责前端可视化,两者配合可以快速搭建生产级的爬虫运维体系。生产环境一定要注意防火墙、认证、HTTPS这三个安全问题。