1. 程式人生 > >使用scrapy-redis實現分散式

使用scrapy-redis實現分散式

  要實現分散式,主機之間需要共享爬取佇列和去衝擊和,scrapy_redis就是將request排程佇列、請求佇列和獲取的item放在了一個多臺主機可以同時訪問的Redis資料庫中。

  剖析原始碼的工作請根據需要自行學習,直接給出settings中的配置。

一、必要配置

以下配置是scrapy_redis實現分散式的核心

1. 配置排程器和去重類

這個選項是必須要進行配置的

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

2. 配置Redis

同樣redis的連線也是必須進行配置的

REDIS_HOST = '40.121.45.74'
REDIS_PORT = 6379
REDIS_PASSWORD = 'foobared'

如果沒有設定密碼,REDIS_PASSWORD 可以不宣告

二、可選配置

以下根據自己的需要進行配置

1. 排程佇列

  排程佇列就是排程時執行的順序,以下三種任選其一,預設為PriorityQueue。

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

2. 持久化

  預設為False,會在爬取完成後清空爬取佇列和去重指紋集合。如果不想清空它們,就設定為True:

SCHEDULER_PERSIST = True

3. 重爬

  此配置預設為False。如果配置了持久化或者強制中斷了爬蟲,name爬取佇列和指紋集合不會被清空,爬蟲重新啟動之後就會接著上次爬取。想重新爬取就配置為True:

SCHEDULER_FLUSH_ON_START = True

4. 將資料儲存到redis中

  就是在ITEM_PIPELINES 加上一個pipeline,這樣就會將爬蟲爬取到的資料儲存到redis中一份。

ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 50,
     ...
     ...
}

一般不會這麼做,因為redis是基於記憶體的,如果資料量龐大會佔用記憶體空間,我們只是利用它的快速。

三、儲存

  多臺主機爬取之後的資料應當儲存在一臺主機中,因此必要的連線都應該是儲存主機上的資料庫服務。

四、配置redis_key

  可以不進行配置,但是配置了會更加方便排程程式,使用scrapy_redis的RedisSpider類來替換原來的scrapy.Spider,並且不在使用原來的start_urls ,而是使用redis_key。
如下所示:

from scrapy_redis.spiders import RedisSpider

class TestSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['www.baidu.com']
    # start_urls = ['http://www.baidu.com']
    redis_key = 'test_redis:start_urls'
    ...
    ...

  當spider空閒的時候,會嘗試在redis_key這個資料結構中嘗試獲得一個url,這個資料結構可以是預設的list也可以設定為set,設定為set則需要用REDIS_START_URLS_AS_SET在settings中進行設定。
如果獲得一個url就進行一些decode處理,並進行請求,獲取不到就一直等待,通過向redis中push需要爬取的網址,來排程爬蟲。