使用scrapy爬蟲的時候,記錄一下如何分布式爬蟲問題:
關鍵在於多台主機協作的關鍵:共享爬蟲佇列
主機:維護爬取佇列
從機:負責資料抓取,資料處理,資料儲存
佇列如何維護:redis佇列
redis 非關係型資料庫,key-value形式儲存,結構靈活。是記憶體中的資料結構儲存系統,處理速度快,效能好
提供佇列,集合等多種儲存結構,方便佇列維護
怎麼去重
redis集合:redis提供集合資料結構,在redis集合中儲存每個request的指紋,在向request佇列中加入request前首先
驗證這個request的指紋是否已經加入集合中,如果已存在,則不新增到request佇列,如果不存在,則將request新增到佇列
並將指紋新增到集合。
(之前很多框架說利用bloom過濾器來實現去重,但是bloom過濾器有個假陽性的問題,即可能不存在集合的問題,bloom過濾器錯誤地判斷為在集合中。)
怎麼防止中斷:
啟動判斷,在每台從機scrapy啟動時首先判斷當前的redis request佇列
是否為空,如果不為空,則從佇列中取得下乙個request進行爬取。
如果為空,則重新開始爬取,第一台從機執行爬取向佇列中新增request
如何實現這樣的架構
庫:scrapy-redis:實現了維護爬取佇列、去重、中斷、redis介面
改寫了scrapy的排程器、佇列等元件,利用它可以實現分布式架構
scrapy 分布式爬蟲
scrapy redis元件作用 修改配置檔案settings 使用scrapy redis元件自己的排程器 配置排程器是否要持久化,也就是當爬蟲結束了,要不要清空redis中請求佇列和去重指紋的set。如果是true,就表示要持久化儲存,就不清空資料,否則清空資料 redis port 6379 ...
scrapy框架之分布式爬蟲
scrapy redis元件作用 實現流程 修改配置檔案settings 結合著配置檔案開啟redis服務 啟動客戶端 執行工程 進入到spiders目錄下 向排程器的佇列中放入乙個起始url 爬取到的資料儲存在了redis的proname items這個資料結構中 其實分布式的 並不難,主要是配置...
scrapy redis實現分布式爬蟲
redis資料庫 redis是乙個開源的支援網路 可基於記憶體亦可持久化的日誌型 非關係型 key value資料庫,其結構十分靈活。redis是記憶體中的資料結構儲存系統,處理速度快,提供佇列集合等多種儲存結構,方便佇列維護。redis提供了集合資料結構,排程伺服器借助redis結合實現url去重...