標籤:scrapy scrapy-redis 源碼 分析
原創文章,連結:http://blog.csdn.net/u012150179/article/details/38226253
+
(I) connection.py負責根據setting中配置執行個體化redis串連。被dupefilter和scheduler調用,總之涉及到redis存取的都要使用到這個模組。
(II) dupefilter.py負責執行requst的去重,實現的很有技巧性,使用redis的set資料結構。但是注意scheduler並不使用其中用於在這個模組中實現的dupefilter鍵做request的調度,而是使用queue.py模組中實現的queue。
當request不重複時,將其存入到queue中,調度時將其彈出。
(III)queue.py其作用如II所述,但是這裡實現了三種方式的queue:
FIFO的SpiderQueue,SpiderPriorityQueue,以及LIFI的SpiderStack。預設使用的是第二中,這也就是出現之前文章中所分析情況的原因(連結:)。
(IV)pipelines.py這是是用來實現分散式處理的作用。它將Item儲存在redis中以實現分散式處理。
另外可以發現,同樣是編寫pipelines,在這裡的編碼實現不同於文章(連結:)中所分析的情況,由於在這裡需要讀取配置,所以就用到了from_crawler()函數。
(V)scheduler.py此擴充是對scrapy中內建的scheduler的替代(在settings的SCHEDULER變數中指出),正是利用此擴充實現crawler的分布式調度。其利用的資料結構來自於queue中實現的資料結構。
scrapy-redis所實現的兩種分布式:爬蟲分布式以及item處理分布式就是由模組scheduler和模組pipelines實現。上述其它模組作為為二者輔助的功能模組。
(VI)spider.py設計的這個spider從redis中讀取要爬的url,然後執行爬取,若爬取過程中返回更多的url,那麼繼續進行直至所有的request完成。之後繼續從redis中讀取url,迴圈這個過程。
分析:在這個spider中通過connect signals.spider_idle訊號實現對crawler狀態的監視。當idle時,返回新的make_requests_from_url(url)給引擎,進而交給調度器調度。
關於代碼中的注釋,可以查看:https://github.com/younghz/scrapy-redis
原創文章,連結:http://blog.csdn.net/u012150179/article/details/38226253