其实我们知道Scrapy框架本身并不直接支持分布式爬虫,但是我们可以借助Scrapy-Redis库来实现分布式爬虫。Scrapy-Redis利用Redis数据库作为共享队列,这样就可以允许多个Scrapy爬虫实例协同工作,最终从而实现分布式爬取。

使用Scrapy框架部署分布式爬虫,最主要依赖 Scrapy-Redis 库来实现任务分发和状态共享。以下是详细步骤和代码示例可以供大家参考:
核心原理
利用 Redis 数据库 作为共享队列,实现:
1、统一的任务调度(Scheduler)
2、分布式去重(Dupefilter)
3、数据汇总存储
部署步骤
1. 环境准备
pip install scrapy scrapy-redis redis
确保所有机器可访问 Redis 服务器(需提前安装并运行)。
2. 修改 Scrapy 项目
(1) settings.py
配置
ini
# 启用 Scrapy-Redis 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 启用 Redis 去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 持久化任务队列(爬虫暂停后不丢失)
SCHEDULER_PERSIST = True
# Redis 连接设置
REDIS_HOST = '192.168.1.100' # Redis 服务器 IP
REDIS_PORT = 6379
# REDIS_PASSWORD = 'your_password' # 如果有密码
# 使用 RedisPipeline 存储数据
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,
}
# 可选:爬虫起始键名(自定义)
REDIS_START_URLS_KEY = 'my_spider:start_urls'
(2) 爬虫文件(如 my_spider.py
)
python
from scrapy_redis.spiders import RedisSpider
class MyDistributedSpider(RedisSpider):
name = 'distributed_spider'
redis_key = 'my_spider:start_urls' # 与 settings 中的键一致
def parse(self, response):
# 解析逻辑
yield {
'title': response.css('h1::text').get(),
'url': response.url
}
# 提取新链接并加入队列
for next_page in response.css('a::attr(href)').getall():
yield response.follow(next_page, callback=self.parse)
3. 向 Redis 添加起始 URL
在 Redis 中插入起始 URL(所有爬虫从此处取任务):
arduino
redis-cli lpush my_spider:start_urls https://example.com/page1
redis-cli lpush my_spider:start_urls https://example.com/page2
4. 部署到多台机器
1、将项目代码复制到所有工作节点。
2、确保每台机器:
- 能访问 Redis 服务器
- 安装相同的 Python 依赖
3、在各节点启动爬虫:
scrapy crawl distributed_spider
高级配置
自定义调度队列:
ini
# settings.py
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue' # 默认优先级队列
# 可选:FifoQueue(先进先出), LifoQueue(后进先出)
增量爬取控制 : 设置 SCHEDULER_FLUSH_ON_START = True
启动时清空队列(默认 False)。
数据存储位置 : 爬取结果自动存入 Redis 键 distributed_spider:items
(爬虫名作为前缀)。
监控与管理
1、查看 Redis 队列状态:
shell
redis-cli
> KEYS * # 查看所有键
> LLEN my_spider:start_urls # 查看待爬队列长度
> SMEMBERS distributed_spider:dupefilter # 查看去重指纹集合
2、动态添加新任务:
arduino
redis-cli lpush my_spider:start_urls "https://new-url.com"
常见问题解决
爬虫不工作:
- 检查 Redis 连接(防火墙、密码)。
- 确认
redis_key
名称在爬虫和 Redis 中一致。
去重失效:
- 确保所有爬虫使用相同的
DUPEFILTER_CLASS
。
性能瓶颈:
- 增加 Redis 内存或使用集群。
- 优化爬虫解析逻辑(避免阻塞操作)。
完整架构图
lua
+----------------+ +----------------+ +----------------+
| 爬虫节点 1 | | 爬虫节点 2 | | 爬虫节点 N |
| (运行Scrapy) | | (运行Scrapy) | ... | (运行Scrapy) |
+-------+--------+ +-------+--------+ +-------+--------+
| | |
| 从Redis取任务 | |
+------------+-----------+-----------------------+
|
+------v------+
| Redis |
| (中央调度) |
+------+------+
|
+------v------+
| 数据存储/处理 | (如MySQL、MongoDB、文件)
+-------------+
通过以上步骤,是不是觉得也不是很难,这样就可以让 Scrapy 爬虫即可实现分布式部署,轻松应对大规模数据抓取任务!