Scrapy-Redis
Scrapy-Redis 是 Scrapy 的一个扩展,主要用于分布式爬虫开发。它通过 Redis 实现多个爬虫实例之间的任务队列共享和数据去重,使得爬虫可以在多个机器上协同工作,提高爬取效率和数据处理能力。
Scrapy-Redis 的主要特点
- 分布式调度:任务队列存储在 Redis 中,多个爬虫实例可以共享任务队列,实现分布式调度。
- 去重功能:使用 Redis 集合存储已爬取的 URL,实现全局 URL 去重。
- 数据存储:爬取的数据可以直接存储到 Redis 中,方便后续处理。
安装 Scrapy-Redis
首先,确保已安装了 Scrapy 和 Redis,然后可以通过以下命令安装 Scrapy-Redis:
pip install scrapy-redis
使用 Scrapy-Redis 创建分布式爬虫
以下是如何配置和使用 Scrapy-Redis 创建分布式爬虫的步骤:
1. 配置项目
在 Scrapy 项目的 settings.py
中添加 Scrapy-Redis 的配置:
# 使用 Scrapy-Redis 的调度器和去重器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 设置 Redis 服务器的地址和端口 REDIS_HOST = 'localhost' REDIS_PORT = 6379 # 保持任务队列,不清空 SCHEDULER_PERSIST = True # 使用 Scrapy-Redis 的 Pipeline 将数据存储到 Redis 中 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } # 可选配置:设置 Redis 数据存储的键名 REDIS_ITEMS_KEY = '%(spider)s:items'
2. 定义 Spider
在定义 Spider 时,继承 scrapy_redis.spiders.RedisSpider
而不是 scrapy.Spider
,并定义一个从 Redis 中读取起始 URL 的键名:
import scrapy from scrapy_redis.spiders import RedisSpider class ExampleSpider(RedisSpider): name = 'example' redis_key = 'example:start_urls' def parse(self, response): # 处理响应数据,提取需要的信息 title = response.xpath('//title/text()').get() yield {'title': title}
3. 启动 Redis 服务器
确保 Redis 服务器正在运行,可以使用以下命令启动 Redis 服务器:
redis-server
4. 将起始 URL 添加到 Redis 中
在 Redis 中添加起始 URL,可以使用 Redis CLI 或者其他 Redis 客户端工具:
redis-server
5. 运行爬虫
启动 Scrapy 爬虫:
scrapy crawl example
Scrapy-Redis 数据存储和去重
-
数据存储:通过 Scrapy-Redis 的 Pipeline,爬取的数据会存储到 Redis 中。可以通过 Redis CLI 或其他客户端工具查看存储的数据:
redis-cli lrange example:items 0 -1
-
URL 去重:Scrapy-Redis 使用 Redis 集合存储已爬取的 URL,实现全局去重。去重信息存储在 Redis 的
dupefilter
集合中,可以通过以下命令查看:redis-cli smembers dupefilter
其他 Scrapy-Redis 功能
- 任务队列持久化:通过设置
SCHEDULER_PERSIST = True
,可以保持任务队列不清空,即使爬虫停止也能保存未完成的任务。 - 优先级队列:Scrapy-Redis 支持优先级任务队列,通过设置不同的优先级,可以控制任务执行的顺序。
- 动态添加任务:可以在爬虫运行过程中动态向 Redis 中添加新的任务,实现更加灵活的任务调度。
通过 Scrapy-Redis,可以轻松实现分布式爬虫,提升爬虫的性能和扩展性,适用于大规模数据爬取和处理的场景。