如何用Python寫一個分散式爬蟲?

之前用Python寫過單進程的爬蟲,來下載一些歌曲。
看到這個問題 如何入門 Python 爬蟲? - 爬蟲(計算機網路) 下的答案,覺得如果能手工寫一個分散式爬蟲來抓取類似知乎,豆瓣,果殼之類的網站一定很有成就感。
假設統計豆瓣所有電影的評分(如果可以實現),那麼
1.編寫這樣的分散式爬蟲還需要哪些基礎知識的儲備?
2.需要用到哪些演算法?
3.對於周圍沒有資源(比如高速網路,數十台PC)的環境,如何測試分散式爬蟲的正確性?


你都沒想明白為什麼要分散式
========================
我還是認真答一下吧,爬蟲這種東西在大批量抓去時主要有下面幾個量變引發質變的挑戰:
1. 出口IP數量,主要是考慮防止被封禁,帶寬反而不是大問題,這個問題可以通過搭建NAT出口集群,或者單機多IP的方式實現
2. 本地埠號耗盡,由於爬蟲是服務端編程不太常見的主動發起連接的應用,在普通只有一個IP綁定的機器上會受到65535的限制(一般在50000多就會受到限制)
3. 大容量存儲的需求,一般都是通過開源或者自己研發的分散式存儲系統來實現,像谷歌(GFS)和百度(百靈)都是自研,這裡就不展開說了
4. 動態網頁的支持,像京東這種網站,內容都是通過類似Facebook的bigpipe一樣動態載入的,直接像curl這樣抓取看到的頁面幾乎是空白的,這就要求爬蟲能模擬JS的運行,這方面有很多基於v8引擎的開源項目:
CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS
PhantomJS | PhantomJS
由於這個需求,爬蟲成了CPU密集型的應用了,分散式的需求也就有了

單機爬蟲的主要難點在的非同步非阻塞網路編程,老生常談了。先暫時寫這麼多吧


binux/pyspider · GitHub


我覺得題主不一定是想要分散式,而是並發的爬蟲。樓主不防研究一下asycio,requests以及beatifulsoup。scrapy還沒用過,看介紹很強大


抓肉雞


樓主可以看一下cola分散式爬蟲
Cola:一個分散式爬蟲框架
Cola首頁、文檔和下載
另外,還有scrapy,這個可以參考豆瓣小組的使用scrapy,redis,mongodb實現的一個分散式網路爬蟲
這方面內容其實還是挺多的,多去找,最重要的是去練系,動手寫


說說應對js生成網頁的情況吧。
要學會selenium自動測試網頁框架。這個框架要使用瀏覽器驅動來啟動,就是實實在在的打開瀏覽器來模擬用戶的各種操作,所有操作步驟都可以肉眼看到,這樣也不存在問題3的驗證問題。一旦完成整個流程的設計,可以啟動「無界面模式」來執行腳本(chrome 59以上版本搭配chromedriver 2.29以上版本使用headless啟動可以實現無界面模式,或者直接用phantomjs瀏覽器貌似不怎麼更新了,而且這個和其他瀏覽器不大一樣,就是說使用其他瀏覽器在有界面模式下調試好了以後,直接更換成phantomjs居然不能直接用,挺多問題)。以這種方式進行頁面爬取最萬能,但存在效率問題,那麼就要考慮分散式進行爬取了。使用selenium grid可以實現分散式網頁自動化測試,爬取頁面的核心代碼一樣,只是啟動的方式換了。現在只需在一台機器上部署,就有很多太機器幫忙幹活了。


我們閑來無事,開發了一個企業級的分散式socks代理系統,專註於解決分散式結構的連接層傳輸效率問題,可用於網路爬蟲,你只需寫邏輯層,連接層由我們解決。是開源的。


scrapy可以滿足這個需求,自己曾經也做過。不過就「good,fast,cheap」三個原則來說,我更推薦用go語言來做,開發、迭代和效率都非常滿足上規模的需求。


推薦閱讀:

為什麼網關與主機可以不在同一個網段?
ip地址是否可以取代mac地址,Fibre Channel over IP是否只使用ip地址進行通信?
TCP協議自2000年後有什麼變化?
tcp滑動窗口的發送窗口和接收窗口的說法正確嗎?
網路是從來哪來的?源頭是哪裡?

TAG:Python | 伺服器 | 計算機網路 | 爬蟲計算機網路 | 分散式 |