一個大規模爬蟲的抓取實例

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]    該爬蟲可能會給單一站點帶來很大的流量負擔,因此爲了防止被一些人輕率地濫用,做者無限期推遲發佈代碼(也即不發佈)。

相關文章
相關標籤/搜索