阿里云CentOS部署Scrapy-Redis分布式爬虫实战指南
Scrapy 在 Python 爬虫生态中属于高效框架,通过少量组件即可完成网页数据抓取。但面对大规模目标页面时,单机部署很快遭遇瓶颈——吞吐量不足、并发请求受限。此时,分布式爬虫架构的优势便凸显出来:多节点协同、横向扩展、资源复用。
Scrapy-Redis 正是基于 Redis 实现的分布式调度组件。其核心逻辑简明:利用 Redis 统一管理爬取请求(Requests),既承担存储职责又负责调度分发,同时将抓取到的 items 暂存在 Redis 中供后续处理。简言之,scrapy-redis 重写了 Scrapy 若干关键模块,让原本单机运行的爬虫可扩展到多台主机协同完成任务。
实操层面,通过 Redis 维护一个 URL 队列。所有爬虫节点连接到该 Redis 实例,从队列中获取 URL;每取走一个,Redis 立即从队列中删除,确保不会重复分配。即使极端并发下两个节点同时抓取到相同 URL,返回结果时 Redis 还会执行二次去重。如此,分布式效果轻松实现——一台主机运行 Redis 队列,其余主机运行爬虫进程。此外,scrapy-redis 与 Redis 保持长连接,即便队列暂空,爬虫也会定期轮询,一有新任务立即开工。
先在主机和从机上分别安装依赖库:
pip3 install requests scrapy scrapy-redis redis
安装 Redis
在主机上部署 Redis:
yum install redis
启动服务:
systemctl start redis
检查版本:
redis-cli --version
配置开机自启:
systemctl enable redis.service
调整 Redis 配置文件 /etc/redis.conf:将保护模式设为 no,注释掉 bind 行以允许远程连接。注意阿里云安全组需放行 6379 端口。修改后务必重启服务:
systemctl restart redis
接着在主机和从机上分别创建爬虫项目:
scrapy startproject myspider
在项目的 spiders 目录下新建 test.py:
导包
import scrapy
import os
from scrapy_redis.spiders import RedisSpider
定义爬虫类
class Test(RedisSpider):
# 爬虫名称,与命令行启动保持一致
name = "test"
# Redis 中存储起始 URL 的 key
redis_key = 'test:start_urls'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36'
}
def parse(self, response):
print(response.url)
pass
然后修改 settings.py,添加以下配置。其中 Redis 地址指向主机的配置:
BOT_NAME = 'myspider'
SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'
# 设置中文编码
FEED_EXPORT_ENCODING = 'utf-8'
# scrapy-redis 主机地址
REDIS_URL = 'redis://root@39.106.228.179:6379'
# 队列调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 不清除缓存
SCHEDULER_PERSIST = True
# 使用 Redis 进行去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 不遵守 robots 协议
ROBOTSTXT_OBEY = False
最后,在两台主机上分别启动 Scrapy 服务。此时服务已运行,但 Redis 队列中无任务,处于等待状态。登录主机 Redis:
redis-cli
向队列中推送任务:
lpush test:start_urls http://baidu.com
lpush test:start_urls http://chouti.com
你会立刻看到两台服务器的爬虫各自领取队列中的 URL 开始抓取。得益于 Redis 的去重机制,URL 不会被重复处理。
爬取完成后,执行 flushdb 命令清除地址指纹,便于再次抓取历史 URL。整个流程简洁高效,分布式爬虫的落地门槛远低于预期。

