http://www.michaelnielsen.org/ddi/how-to-crawl-a-quarter-billion-webpages-in-40-hours/html
一個大規模爬蟲的抓取實例python
本文是一篇大規模爬蟲的文章的閱讀筆記,記錄了一個做者利用amazon集羣在40個小時的時間裏爬取2.5億個網頁的過程。web
相關參數redis
page:2.5億網絡
cost:580 dollar多線程
time:40 hours異步
machine:20 Amazon EC2分佈式
storage:總共抓取了1.69 TB函數
目的:網站
找到一個有用的網絡子集,實踐爬蟲和分佈式計算
技術實現:
分佈式爬蟲
節點:Amazon EC2
集羣控制:Fabric
語言:Python
爬取方式:
1)每一個集羣141個爬蟲線程,從Alexa白名單[1]獲得初始域名
選擇141個是根據實驗效果達到飽和肯定的
2) 任務分配:哈希分配機器、哈希分配線程;
3)
從alexa開始,對每一個網頁抓取;
捨棄抓取的external link,其餘的加入url frontier;
在url frontier中取出url,繼續抓取;
log記錄
問題:
1.url去重:大規模爬蟲遇到的常見問題,能夠用Bloom Filter(布隆過濾器)的庫pybloomfiltermmap和redis,可是可能形成錯誤判斷而捨棄應該抓取的url;redis的做用是存儲爲url設置的鍵值,其鍵-值爲(url-下一次應抓取時間),這是爲了遵循爲了抓取的道德準則,避免對網站形成壓力
2. 1)可預見的bug和不可預見的bug,如不規範的html。通常捨棄。解析頁面通常用python的lxml庫。
2)去除外鏈會致使一些不規則的子域名不能被加入爬取的流程,group.barclays.com
barclays.com的子域名;解決方法是tldextract library;
3. 同時抽取多個域名加入列表會致使流量負擔,姑且稱做clump problem;
解決方法是用單機的url frontier來代替全局的url frontier
4. url的存儲方式遇到去重的問題,每一個線程會消耗大量空間;
5. 分配線程跟機器的hash要用兩個獨立的函數或者用一個
6. 截斷:由於有些html頁面太大,須要截斷。能夠用網絡的頁面平均大小來估計應該截斷的合理值,最後肯定是200kb。
其餘
進行爬取用到的相關價格:價格:512 dollars,節點 EC2,500 gigabytes,
Spot-instance:競價實例是亞馬遜出賣本身閒置資源的一種方式,出價高的擁有實例,價格比較划算。它多是一樣計算能力的實例價格的1/10。這是一個讓人驚訝的數字。它的實體在13年末就估計達到了300萬臺。可是競價實例能夠隨時被亞馬遜回收。
threaded architecture和evented architecture是有區別的。本文采用的是threaded architecture。即:多線程爬蟲跟異步爬蟲的區別。
注:
[1] Alexa是一個亞馬遜的子公司,用來發佈網站的世界排名。能夠經過該網站找到前100萬的網址。
[2] 該爬蟲可能會給單一站點帶來很大的流量負擔,因此爲了防止被一些人輕率地濫用,做者無限期推遲發佈代碼(也即不發佈)。