将爬虫部署到服务器:Scrapy+Scrapyd 实现定时任务与监控
在数据采集场景中,很多爬虫需要长期、定时运行(比如每日爬取行业数据、实时监控竞品价格等)。本地运行爬虫不仅受限于设备开机状态,还难以实现自动化管理。本文将介绍如何通过 Scrapy(爬虫框架)+ Scrapyd(爬虫部署工具)将爬虫部署到服务器,并实现定时任务与运行监控,让爬虫真正 “无人值守”。
一、核心工具简介
在开始前,先明确几个核心工具的作用:
- Scrapy:Python 生态中成熟的爬虫框架,用于快速开发高性能爬虫,支持自定义解析逻辑、数据存储、反爬策略等。
- Scrapyd:一款用于部署和管理 Scrapy 爬虫的工具,提供 HTTP 接口用于远程部署、启动、停止爬虫,并支持查看爬虫运行状态和日志。
- Scrapyd-Client:本地用于与 Scrapyd 交互的工具,帮助将本地 Scrapy 项目打包并部署到远程 Scrapyd 服务。
- 定时任务工具:如 Linux 自带的
crontab
或可视化工具SpiderKeeper
,用于实现爬虫定时运行。 - 监控工具:Scrapyd 自带的 Web 界面、
SpiderKeeper
或Prometheus+Grafana
,用于监控爬虫运行状态。
二、环境准备
2.1 服务器选择与基础配置
推荐使用云服务器(如阿里云 ECS、腾讯云 CVM),系统选择 Linux(本文以 Ubuntu 20.04 为例)。配置步骤:
服务器初始化:更新系统依赖
bash
sudo apt update && sudo apt upgrade -y
安装 Python 环境(建议 Python 3.8+)
bash
sudo apt install python3 python3-pip python3-venv -y
配置防火墙:开放 Scrapyd 默认端口(8000)和 SSH 端口(22)
bash
sudo ufw allow 22/tcp # 允许SSH连接 sudo ufw allow 8000/tcp # 允许Scrapyd访问 sudo ufw enable # 启用防火墙
2.2 安装核心工具
在服务器上创建虚拟环境并安装依赖:
bash
# 创建虚拟环境
python3 -m venv scrapy-env
source scrapy-env/bin/activate # 激活环境(Windows用 scrapy-env\Scripts\activate)# 安装Scrapy、Scrapyd、Scrapyd-Client
pip install scrapy scrapyd scrapyd-client
- 验证安装:运行
scrapyd --version
和scrapy --version
,若输出版本信息则安装成功。
三、Scrapy 项目准备
假设你已有一个可正常运行的 Scrapy 项目(若没有,可先用scrapy startproject demo
创建测试项目)。需确保:
- 项目在本地可正常运行(
scrapy crawl 爬虫名
无报错)。 - 数据存储配置正确(如 MySQL、MongoDB 或本地文件,若用数据库需确保服务器能访问)。
settings.py
中关闭调试模式(避免日志冗余):python
运行
LOG_LEVEL = 'INFO' # 只输出INFO及以上级别日志 ROBOTSTXT_OBEY = False # 根据需求决定是否遵守robots协议
四、部署 Scrapy 项目到 Scrapyd
4.1 配置 Scrapyd 服务
Scrapyd 默认配置即可启动,但需修改绑定地址以允许远程访问:
找到 Scrapyd 配置文件(默认路径:
/etc/scrapyd/scrapyd.conf
,若不存在则在虚拟环境site-packages/scrapyd/default_scrapyd.conf
复制)。修改配置:
ini
[scrapyd] bind_address = 0.0.0.0 # 允许所有IP访问(仅服务器内访问可设为127.0.0.1) http_port = 8000 # 端口(保持默认即可)
启动 Scrapyd 服务:
bash
scrapyd # 前台启动(测试用) # 后台启动(生产用): nohup scrapyd > scrapyd.log 2>&1 &
验证服务:浏览器访问
http://服务器IP:8000
,若显示 Scrapyd 管理界面则启动成功。
4.2 部署本地项目到 Scrapyd
使用scrapyd-client
工具将本地 Scrapy 项目部署到服务器:
本地项目根目录(含
scrapy.cfg
)中,修改scrapy.cfg
:ini
[deploy:服务器名称] # 自定义名称(如my_server) url = http://服务器IP:8000/ # 服务器Scrapyd地址 project = 项目名 # 与Scrapy项目名一致(如demo)
部署项目:在本地终端(需安装
scrapyd-client
)执行:bash
scrapyd-deploy 服务器名称 -p 项目名
若出现
Deployed zippackage
提示,说明部署成功。此时在服务器 Scrapyd 界面的 “Projects” 中可看到部署的项目。
五、实现定时任务
Scrapyd 本身不支持定时,需结合外部工具实现。推荐两种方案:
5.1 方案 1:Linux crontab(轻量简单)
通过crontab
定时调用 Scrapyd 的 HTTP 接口启动爬虫。
编写启动脚本(
start_spider.sh
):bash
#!/bin/bash # 调用Scrapyd的/schedule.json接口启动爬虫 curl http://服务器IP:8000/schedule.json -d "project=项目名&spider=爬虫名"
给脚本添加执行权限:
bash
chmod +x start_spider.sh
配置定时任务:运行
crontab -e
,添加如下内容(每天凌晨 2 点执行):bash
0 2 * * * /path/to/start_spider.sh # 脚本绝对路径
保存后,
crontab
会自动生效。可通过crontab -l
查看已配置的任务。
5.2 方案 2:SpiderKeeper(可视化管理)
SpiderKeeper
是基于 Web 的 Scrapyd 管理工具,支持可视化配置定时任务,适合非命令行用户。
安装 SpiderKeeper:
bash
pip install spiderkeeper
启动 SpiderKeeper(连接到 Scrapyd 服务):
bash
spiderkeeper --server=http://服务器IP:8000 # 连接到Scrapyd
访问
http://服务器IP:5000
(默认端口),通过 Web 界面:- 在 “Spider” 中选择爬虫,点击 “Schedule” 配置定时规则(支持 Cron 表达式)。
- 可直接查看爬虫运行状态、历史记录和日志。
六、监控爬虫运行状态
实时监控爬虫状态是确保数据稳定采集的关键,推荐以下方式:
6.1 Scrapyd 自带监控
Scrapyd 的 Web 界面(http://服务器IP:8000
)提供基础监控功能:
- Jobs:查看正在运行、已完成或失败的爬虫任务。
- Logs:查看爬虫实时日志(点击任务 ID 即可查看)。
- Projects:管理已部署的项目版本。
6.2 SpiderKeeper 增强监控
SpiderKeeper
在 Scrapyd 基础上增加了更友好的可视化监控:
- 爬虫运行趋势图(成功 / 失败次数统计)。
- 定时任务执行记录。
- 日志搜索与筛选。
6.3 高级监控:Prometheus+Grafana
若需更全面的监控(如服务器资源占用、爬虫性能指标),可结合:
- Prometheus:采集 Scrapyd 和服务器的指标(需安装
prometheus-client
暴露接口)。 - Grafana:可视化指标,配置告警(如爬虫失败时发送邮件)。
步骤可参考:
- 安装 Prometheus 并配置 Scrapyd 指标采集。
- 安装 Grafana,导入 Prometheus 数据源,配置监控面板。
七、注意事项
- 日志管理:爬虫日志会占用磁盘空间,建议通过
logrotate
定期清理(配置/etc/logrotate.d/scrapyd
)。 - 反爬与 IP 代理:服务器固定 IP 易被目标网站封禁,可结合代理池(如
proxy_pool
)动态切换 IP。 - 高可用:若爬虫任务关键,可部署多台 Scrapyd 服务器,通过负载均衡避免单点故障。
- 安全加固:
- 限制 Scrapyd 端口访问(仅允许信任 IP)。
- 给 Scrapyd 添加认证(如用
nginx
反向代理 + Basic Auth)。
八、总结
通过 Scrapy+Scrapyd 的组合,我们可以轻松将爬虫部署到服务器,并通过crontab
或SpiderKeeper
实现定时任务,再配合监控工具确保爬虫稳定运行。这套方案兼顾了灵活性和易用性,适合从个人项目到企业级数据采集场景的需求。
掌握后,你可以将更多精力放在爬虫逻辑优化上,让数据采集真正实现 “自动化、无人化”。