爬蟲(十七):scrapy分佈式原理

一:scrapy工做流程git

scrapy單機架構:github

單主機爬蟲架構:redis

分佈式爬蟲架構:mongodb

這裏重要的就是個人隊列經過什麼維護?
這裏通常咱們經過Redis爲維護,Redis,非關係型數據庫,Key-Value形式存儲,結構靈活。
而且redis是內存中的數據結構存儲系統,處理速度快,提供隊列集合等多種存儲結構,方便隊列維護數據庫

如何去重?
這裏藉助redis的集合,redis提供集合數據結構,在redis集合中存儲每一個request的指紋
在向request隊列中加入Request前先驗證這個Request的指紋是否已經加入集合中。若是已經存在則不添加到request隊列中,若是不存在,則將request加入到隊列並將指紋加入集合服務器

如何防止中斷?若是某個slave由於特殊緣由宕機,如何解決?
這裏是作了啓動判斷,在每臺slave的Scrapy啓動的時候都會判斷當前redis request隊列是否爲空
若是不爲空,則從隊列中獲取下一個request執行爬取。若是爲空則從新開始爬取,第一臺叢集執行爬取向隊列中添加request數據結構

如何實現上述這種架構?
這裏有一個scrapy-redis的庫,爲咱們提供了上述的這些功能
scrapy-redis改寫了Scrapy的調度器,隊列等組件,利用他能夠方便的實現Scrapy分佈式架構
關於scrapy-redis的地址--》scrapy-redis GitHub地址架構

 

二:搭建分佈式爬蟲scrapy

參考--》官網地址分佈式

前提是要安裝scrapy_redis模塊:pip install scrapy_redis
這裏的爬蟲代碼是用的以前寫過的爬取知乎用戶信息的爬蟲

修改該settings中的配置信息:

替換scrapy調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

添加去重的class
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

添加pipeline
若是添加這行配置,每次爬取的數據也都會入到redis數據庫中,因此通常這裏不作這個配置
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}

共享的爬取隊列,這裏用須要redis的鏈接信息
這裏的user:pass表示用戶名和密碼,若是沒有則爲空就能夠
REDIS_URL = 'redis://user:pass@hostname:9001'

設置爲爲True則不會清空redis裏的dupefilter和requests隊列
這樣設置後指紋和請求隊列則會一直保存在redis數據庫中,默認爲False,通常不進行設置

SCHEDULER_PERSIST = True

設置重啓爬蟲時是否清空爬取隊列
這樣每次重啓爬蟲都會清空指紋和請求隊列,通常設置爲False
SCHEDULER_FLUSH_ON_START=True

分佈式

將上述更改後的代碼拷貝的各個服務器,固然關於數據庫這裏能夠在每一個服務器上都安裝數據,也能夠共用一個數據,我這裏方面是鏈接的同一個mongodb數據庫,固然各個服務器上也不能忘記:
全部的服務器都要安裝scrapy,scrapy_redis,pymongo

這樣運行各個爬蟲程序啓動後,在redis數據庫就能夠看到以下內容,dupefilter是指紋隊列,requests是請求隊列

項目代碼GitHub地址--》分佈式爬取知乎

相關文章
相關標籤/搜索