當前位置:
首頁 > 知識 > Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

關於Scrapy工作流程回顧

Scrapy單機架構

Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

上圖的架構其實就是一種單機架構,只在本機維護一個爬取隊列,Scheduler進行調度,而要實現多態伺服器共同爬取數據關鍵就是共享爬取隊列。

Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

分散式架構

Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

我將上圖進行再次更改

Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

這裡重要的就是我的隊列通過什麼維護?

這裡一般我們通過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模塊: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是請求隊列

Python爬蟲從入門到放棄(二十)之 Scrapy分散式原理

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

Git版本控制系統之基本使用
設計模式之單例模式
RabbitMQ入門-Routing直連模式

TAG:科技優家 |

您可能感興趣

分散式爬蟲的部署之Scrapyd對接Docker
Python分散式爬蟲詳解(二)
Python分散式爬蟲詳解(一)
Python爬蟲學習Scrapy之Spiders
Python爬蟲框架之pyspider
如何通過 Scrapyd + ScrapydWeb 簡單高效地部署和監控分散式爬蟲
Python爬蟲:把爬取到的數據插入到execl中
零基礎入門Python爬蟲(一)
Python爬蟲之模擬登錄wechat
websocket與爬蟲
網路爬蟲框架Scrapy詳解之Request
Python 爬蟲闖關
免費微課:Python爬蟲從入門到實戰(送PPT)
Python爬蟲之基本原理
Docker安裝,阿里雲加速配置,splash 安裝python 爬蟲
Python爬蟲系列:使用selenium+Edge查詢指定城市天氣情況
Python爬蟲利器:Requests庫的使用
Python爬蟲的債市小試(二)
分散式爬蟲的部署之Scrapyd分散式部署
使用 shell 構建多進程的 CommandlineFu 爬蟲