scrapy-redis

scrapy-redis的源碼並不多,因爲它是利用Redis數據庫重新實現了scrapy中的某些組件

 

對於一個分佈式爬蟲框架:

  1、分配爬取的任務,爲每個爬蟲分配不重複的爬取任務

  2、彙總爬取的數據,將所有爬取到的數據彙總到一個地方

 

scrapy-redis爲多個爬蟲分配爬取任務的方式是:讓所有爬蟲共享一個存在在Redis數據庫中的請求隊列(替代各個爬蟲獨立的請求隊列),每個爬蟲從請求隊列中獲得請求,下載並解析頁面之後,將解析出來的新的請求再次添加到請求隊列中,因此每個爬蟲既是下載任務的生產者,有是消費者

爲了實現多個爬蟲的任務的分配,scrapy-redis重新實現了下面的組件:

  基於redis的請求隊列(優先隊列、FIFO、LIFO)

  基於redis的請求去重過濾器(過濾掉重複的請求)

  基於以上兩個組件的調度器

 

1、調度器的實現

  調度器中最核心的兩個方法是enqueue_request和next_request,它們分別對應請求的入隊和出隊操作。spider提交的request對象最終由scrapy引擎用enqueue_request添加到請求隊列中,scrapy引擎同時也調用next_request從請求隊列中取出請求,送給下載器進行下載。

  self.queue和self.df分別是請求隊列和去重過濾器對象。在enqueue_request方法中,使用去重過濾器的request_seen方法來判斷request是否重複了,也就是request對應的頁面是否已經抓取過了,如果用戶沒有強制忽略過濾,並且request是重複的,就應該拋棄這個request,並且直接返回False,否則就調用self.queue的push方法將request加入到隊列中等待被調用,並返回True。在next_request方法中,調用self.queue的pop方法出隊一個request並返回

 

2、請求隊列的實現:

  基於redis實現的請求隊列:

    ProorityQueue優先級隊列(默認)

    FifoQueue先進先出隊列

      self.server是redis數據庫的連接對象,該連接對象是在Scheduler的from_settings方法中創建的,在創建請求對象的時候被傳遞給請求隊列累的構造器

      

    LifoQueue後進先出隊列

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章