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,可以輕鬆實現分散式爬蟲,提升爬蟲的效能和擴充套件性,適用於大規模資料爬取和處理的場景。