使用scrapy redis實現分布式

2021-08-20 21:49:00 字數 1836 閱讀 4952

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

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

#一、必要配置

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

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

scheduler = "scrapy_redis.scheduler.scheduler"

dupefilter_class = "scrapy_redis.dupefilter.rfpdupefilter"

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

redis_host = '40.121.45.74'

redis_port = 6379

redis_password = 'foobared'

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

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

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

scheduler_queue_class = 'scrapy_redis.queue.priorityqueue'

scheduler_queue_class = 'scrapy_redis.queue.fifoqueue'

scheduler_queue_class = 'scrapy_redis.queue.lifoqueue'

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

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

scheduler_flush_on_start = true
就是在item_pipelines 加上乙個pipeline,這樣就會將爬蟲爬取到的資料儲存到redis中乙份。

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

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

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

如下所示:

......當spider空閒的時候,會嘗試在redis_key這個資料結構中嘗試獲得乙個url,這個資料結構可以是預設的list也可以設定為set,設定為set則需要用redis_start_urls_as_set在settings中進行設定。

如果獲得乙個url就進行一些decode處理,並進行請求,獲取不到就一直等待,通過向redis中push需要爬取的**,來排程爬蟲。

scrapy redis實現分布式爬蟲

redis資料庫 redis是乙個開源的支援網路 可基於記憶體亦可持久化的日誌型 非關係型 key value資料庫,其結構十分靈活。redis是記憶體中的資料結構儲存系統,處理速度快,提供佇列集合等多種儲存結構,方便佇列維護。redis提供了集合資料結構,排程伺服器借助redis結合實現url去重...

scrapy redis實現分布式爬蟲

一 認識與安裝scrapy redis庫 1 認識scrapy redis庫 scrapy redis庫 提供了所需的功能,scrapy redis改寫了scrapy的排程器 佇列等元件,利用這個庫可以方便地實現scrapy分布式架構。2 安裝scrapy redis庫 pip install sc...

scrapy redis實現分布式爬蟲

原來scrapy的scheduler維護的是本機的任務佇列 存放request物件及其 函式等資訊 本機的去重佇列 存放訪問過的url位址 所以實現分布式爬取的關鍵就是,找一台專門的主機上執行乙個共享的佇列比如redis,然後重寫scrapy的scheduler,讓新的scheduler到共享佇列訪...