1. 程式人生 > >Python爬蟲【五】Scrapy分布式原理筆記

Python爬蟲【五】Scrapy分布式原理筆記

啟動 size inf p s 集合 內存 運行 請求 max

Scrapy單機架構

技術分享圖片

在這裏scrapy的核心是scrapy引擎,它通過裏面的一個調度器來調度一個request的隊列,將request發給downloader,然後來執行request請求

但是這些request隊列都是維持在本機上的,因此如果要多臺主機協同爬取,需要一個request共享的機制——requests隊列,在本機維護一個爬取隊列,Scheduler進行調度,而要實現多態服務器共同爬取數據關鍵就是共享爬取隊列。

單主機爬蟲架構

技術分享圖片

調度器負責從隊列中調度requests進行爬取,而每臺主機分別維護requests隊列

分布式爬蟲架構

技術分享圖片

技術分享圖片

隊列用什麽維護?
這裏一般我們通過Redis為維護,Redis,非關系型數據庫,Key-Value形式存儲,結構靈活。
是內存中的數據結構存儲系統,處理速度快,性能好。提供隊列、集合等多種存儲結構,方便隊列維護。

如何去重?——Redis集合

redis提供集合數據結構,在redis集合中存儲每個request的指紋。

在向request隊列中加入Request前先驗證這個Request的指紋是否已經加入集合中。

如果已經存在則不添加到request隊列中,如果不存在,則將request加入到隊列並將指紋加入集合。

如何防止中斷?——啟動判斷

在每臺slave的Scrapy啟動的時候都會判斷當前redis request隊列是否為空
如果不為空,則從隊列中獲取下一個request執行爬取。如果為空則重新開始爬取,第一臺叢集執行爬取向隊列中添加request。

如何實現分布式架構?——scrapy-redis庫

scrapy-redis改寫了Scrapy的調度器,隊列等組件,利用它可以方便的實現Scrapy分布式架構
關於scrapy-redis的地址:https://github.com/rolando/scrapy-redis

1.新建分支distributed
2.在settings裏,將SCHEDULER改為scrapy的調度器,SCHEDULER = "scrapy_redis.scheduler.Scheduler",即將scrapy中的核心調度器替換
3.添加去重的class
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
4.引入pipeline,並更改優先級
‘scrapy_redis.pipelines.RedisPipeline‘: 301
5.共享的爬取隊列,指定Redis數據庫的連接信息,直接把Redis的url拿過來 
這裏的user:pass表示用戶名和密碼,如果沒有則為空就可以
REDIS_URL = ‘redis://user:pass@hostname:9001‘
6.設置為為True則不會清空redis裏的dupefilter和requests隊列
這樣設置後指紋和請求隊列則會一直保存在redis數據庫中,默認為False,一般不進行設置

SCHEDULER_PERSIST = True
7.設置重啟爬蟲時是否清空爬取隊列
這樣每次重啟爬蟲都會清空指紋和請求隊列,一般設置為False
SCHEDULER_FLUSH_ON_START=True
8.分布式
將上述更改後的代碼拷貝的各個服務器,當然關於數據庫這裏可以在每個服務器上都安裝數據,也可以共用一個數據,所有的服務器都要安裝scrapy,scrapy_redis,pymongo
這樣運行各個爬蟲程序啟動後,在redis數據庫就可以看到如下內容,dupefilter是指紋隊列,requests是請求隊列

  

Python爬蟲【五】Scrapy分布式原理筆記