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

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

当你的爬虫不再只是一两条在终端里手动跑的脚本,而是变成几十上百个需要定时调度、监控状态、随时修改规则的项目时,靠人工盯着命令行早已力不从心。ScrapydScrapydWeb 正是为解决这个痛点而生:一个负责后台静默调度,一个提供漂亮的网页界面一站式管理。本文将去繁就简,带你用最短的时间搭起一套生产可用的爬虫运维平台。

目录

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

工具概览

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 管理面板

安装

在同个虚拟环境或新环境中安装:

pip install 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 调用变成了点几下鼠标的事:

  1. 在顶部选择你要操作的 Scrapyd 节点
  2. 左侧点击「Schedule」,选择项目和爬虫,填写参数,一键启动
  3. 切换到「Jobs」页面,可以实时看到 Pending(排队中)、Running(运行中)、Finished(已完成)的任务
  4. 点击任务右侧的「Log」实时查看日志
  5. 需要中止时,直接点「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

避坑指南与最佳实践

⚠️ 避坑指南

  1. max_proc 不是爬虫数:它是全局并发进程上限,配合 max_proc_per_host 控制资源,避免把服务器跑满。
  2. 依赖忘了装:部署前务必在服务器端执行 pip install,否则爬虫会因为缺少模块直接失败。
  3. 端口直接暴露:Scrapyd 没有登录认证,千万不要直接把 6800 开到公网,否则任何人都可以调度、取消你的爬虫。
  4. 路径权限错误:Scrapyd 需要对 eggs_dirlogs_dir 等目录拥有读写权限,初次部署时记得 chown 一下。

✅ 最佳实践

  1. 为每个项目准备独立的虚拟环境或 Docker 镜像,从根源上杜绝依赖冲突。
  2. 配置文件分环境管理:开发、测试、生产分别使用不同的 scrapy.cfgconfig.py,并通过环境变量或部署脚本切换。
  3. 定期清理旧版本和过期日志:可通过 delversion.json API 删除无用版本,并结合 logs_to_keep 自动轮转日志。
  4. 监控与告警:启用 ScrapydWeb 的邮件告警,或者用简单的脚本定时请求 http://scrapyd:6800/daemonstatus.json 来监控服务状态。
  5. 资源规划:根据服务器的 CPU 核心数和实际爬虫负载,合理设置 max_procmax_proc_per_host,留出余量给系统和其他服务。

💡 核心要点:Scrapyd 负责后端调度,ScrapydWeb 负责前端可视化,两者配合可以快速搭建生产级的爬虫运维平台。生产环境只要抓住“防火墙 + 认证 + HTTPS”这三个安全点,就能跑得又稳又放心。