最近想梳理一下搜索搜索引擎相關的理論與技術,從爬蟲開始,總結一下這方面的問題與解決方案。
不論是分佈式爬蟲還是單體爬蟲、主題爬蟲等,最關鍵的是爬行算法,而作爲爬蟲數據源的互聯網可以抽象的看作是一張有向圖,現對該圖定義如下:
1.將互聯網定義爲圖
2.每個頁面定義爲圖節點
3.頁面中的鏈接定義爲有向邊
簡而言之,爬蟲通過遍歷這張有向圖來爬取相關信息,並使用這些信息創建索引供檢索程序查詢。
圖的遍歷算法有深度優先算法與寬度優先算法,而前者容易使爬蟲陷入黑洞,所以寬度優先算法被用來實現爬蟲的爬行算法,但是有時也不會完全按照寬度優先算法進行爬行,而是做相應的變通,如帶偏好的爬行算法。
首先來看圖的寬度的優先遍歷算法,
圖1爲要遍歷的圖:
圖-1 要遍歷的有向圖
選擇A爲遍歷的根節點,則具體的遍歷過程如下表所示:
操作 | 隊列 |
初始化 | 空 |
A入隊 | A |
A出隊 | 空 |
BCDEF入隊 | BCDEF |
B出隊 | CDEF |
C出隊 | DEF |
D出隊 | EF |
E出隊 | F |
H入隊 | FH |
F出隊 | H |
G入隊 | HG |
H出隊 | G |
I入隊 | GI |
G出隊 | I |
I出隊 | 空 |
表-1 圖遍歷過程
從上表中可以歸納出,圖節點的遍歷過程爲:
A->B->C->D->E->F->H->G->I
爬蟲以寬度優先算法遍歷互聯網
現定於如下:
1).將根URl選定爲圖的起始節點
2).某URL對應的頁面中含有的子URL(對應的頁面)爲該URL的子節點。
3).通過解析->入TODO隊列->入VISITED的隊列這一往復過程實現遍歷。
圖-2 流程圖
寬度優先遍歷算法是爬蟲中採用最爲廣泛的爬行算法,主要有以下幾個原因:
1).重要的網頁一般離種子比較近
2).互聯網的實際深度最多能達到17層,但到達某個網頁總存在一條很短的路徑,而寬度優先遍歷會以最快的速度到達這個網頁。
3).寬度優先遍歷有利於多爬蟲合作抓取,單體爬蟲往往會先抓取站內鏈接,封閉性很強。