scrapy分布式的幾個重點問題



我們之前的爬蟲都是在同一台機器運行的,叫做單機爬蟲。
scrapy的經典架構圖也是描述的單機架構。

那么分布式爬蟲架構實際上就是:
由一台主機維護所有的爬取隊列,每台從機的sheduler共享該隊列,協同存儲與提取。
分布式爬蟲的多台協作的關鍵是共享爬取隊列。

隊列用什么維護呢?
推薦redis隊列
redis是非關系型數據庫,用key-value形式存儲,結構靈活,他不像關系型數據庫必須要由一定的結構才能存儲。
key-value可以是多種數據,非常靈活。
另外,redis是內存中的數據結構存儲系統,處理速度快,性能好。
提供了隊列,集合多種存儲結構,方便隊列維護和去重操作。

怎樣來去重?
如果多台機器不僅往請求隊列存,還同時從里面取,那么如何保證每台機子請求和存儲的隊列是不重復的呢?
借助redis集合
redis提供集合數據結構,我們知道集合里面的元素是不重復的
首先,在redis中存儲每隔request的指紋。
在向request隊列中加入request前首先驗證這個request的指紋是否已經加入到集合中。
如果已存在,則不添加requets到隊列,
如果不存在,則將request添加入隊列並將指紋加入集合。

怎樣防止中斷?
在爬取的過程中,難免會有某台機子卡掉了,這時怎么辦?
在每台從機scrapy啟動時都會首先判斷當前redis request隊列是否為空。
如果不為空,則從隊列中取得下一個request執行爬取。
如果為空,則重新開始開始爬取,第一台從機執行爬取想隊列中添加request。

怎樣實現該架構?
要做到:
維護request隊列
對台從機調度reuqest
設置去重
鏈接redis

已經有了比較成熟的庫scrapy-redis

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM