1. 程式人生 > >scrapy-redis實現scrapy分散式爬取分析

scrapy-redis實現scrapy分散式爬取分析

(1)在“http://www.zhihu.com/question/20899988”中,提到的:

“那麼,假設你現在有100臺機器可以用,怎麼用python實現一個分散式的爬取演算法呢?

我們把這100臺中的99臺運算能力較小的機器叫作slave,另外一臺較大的機器叫作master,那麼回顧上面程式碼中的url_queue,如果我們能把這個queue放到這臺master機器上,所有的slave都可以通過網路跟master聯通,每當一個slave完成下載一個網頁,就向master請求一個新的網頁來抓取。而每次slave新抓到一個網頁,就把這個網頁上所有的連結送到master的queue裡去。同樣,bloom filter也放到master上,但是現在master只發送確定沒有被訪問過的url給slave。Bloom Filter放到master的記憶體裡,而被訪問過的url放到執行在master上的Redis裡,這樣保證所有操作都是O(1)。(至少平攤是O(1),Redis的訪問效率見:LINSERT – Redis)”

其中的分散式體現在多臺機器上的spider同時爬取(這裡沒有直接說明每臺上的執行的spider數量,但分析好像是一個),並且這種分散式是通過scrapy-redis實現的,這裡的queue指的就是redis queue。那麼實現的就是使用redis儲存url(分為沒訪問過的url_no和訪問過的url_yes,他這裡通過url_yes+bloom filter實現訪問去重),這就是redis在分散式爬取中的作用。

(2)在“http://www.douban.com/group/topic/38363928/”中所述的:
“分散式使用redis實現,redis中儲存了工程的request,stats資訊,能夠對各個機器上的爬蟲實現集中管理,這樣可以 解決爬蟲的效能瓶頸,利用redis的高效和易於擴充套件能夠輕鬆實現高效率下載:當redis儲存或者訪問速度遇到瓶頸時,可以 通過增大redis叢集數和爬蟲叢集數量改善。 ”

同樣是這個道理,但在這裡指明的是在redis中儲存的是request,這和scrapy-redis中的example很相似,當然在example中也實現了可以在redis中讀取url的爬蟲(younghz:這不就是(1)中分析的嗎,對的,對的)。

所以上面兩種方式就是redis在scrapy中的分散式爬蟲的應用。本質上說,就是大家(所有機器,所有爬蟲)把拿到的東西(url,request)放在一起(request queue)去排程。