Scrapy-Redis

JJJhr發表於2024-07-05

Scrapy-Redis 是 Scrapy 的一個擴充套件,主要用於分散式爬蟲開發。它透過 Redis 實現多個爬蟲例項之間的任務佇列共享和資料去重,使得爬蟲可以在多個機器上協同工作,提高爬取效率和資料處理能力。

Scrapy-Redis 的主要特點

  1. 分散式排程:任務佇列儲存在 Redis 中,多個爬蟲例項可以共享任務佇列,實現分散式排程。
  2. 去重功能:使用 Redis 集合儲存已爬取的 URL,實現全域性 URL 去重。
  3. 資料儲存:爬取的資料可以直接儲存到 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,可以輕鬆實現分散式爬蟲,提升爬蟲的效能和擴充套件性,適用於大規模資料爬取和處理的場景。