現(xiàn)在人們說(shuō)的 python 寫(xiě)爬蟲(chóng)啊之類的,爬蟲(chóng)當(dāng)然不是普通的那個(gè)爬蟲(chóng),而是指按照一定的規(guī)則獲取網(wǎng)絡(luò)上信息的程序,因?yàn)樗讷@取一個(gè)網(wǎng)頁(yè)信息的同時(shí)會(huì)從這個(gè)網(wǎng)頁(yè)上獲得url然后再對(duì)這個(gè)url獲取信息,所以稱為爬蟲(chóng)。
爬蟲(chóng)之間也有不同,不過(guò)大致可以分為以下幾類
這類爬蟲(chóng)的目標(biāo)從幾個(gè)URL擴(kuò)展到整個(gè)網(wǎng)絡(luò),一般用于為搜索引擎和Web服務(wù)提供商采集數(shù)據(jù)。這類爬蟲(chóng)不太看重頁(yè)面間的聯(lián)系,而看重獲得頁(yè)面的數(shù)量,因此對(duì)存儲(chǔ)空間有一定要求。
這類爬蟲(chóng)主要根據(jù)選定好的主題來(lái)搜索頁(yè)面,主要來(lái)滿足對(duì)特定領(lǐng)域信息的需求,保存的頁(yè)面數(shù)量不多,可以節(jié)省網(wǎng)絡(luò)資源與存儲(chǔ)空間。
這類爬蟲(chóng)主要是對(duì)新產(chǎn)生或是發(fā)生變化的網(wǎng)頁(yè)來(lái)搜尋的爬蟲(chóng),雖然這樣也可以避免重復(fù)爬行造成空間與網(wǎng)絡(luò)資源浪費(fèi),但是所需要的算法比其他爬蟲(chóng)更復(fù)雜。
這些爬蟲(chóng)主要對(duì)不能夠通過(guò)鏈接進(jìn)入的頁(yè)面進(jìn)行搜索,比如說(shuō)注冊(cè)后可見(jiàn)的頁(yè)面等等。這類爬蟲(chóng)通常需要一個(gè)附帶具有填寫(xiě)表單的能力之類的輔助模塊來(lái)幫助進(jìn)入之后的頁(yè)面。
IP 地址搜索策略是先給爬蟲(chóng)一個(gè)起始的 IP 地址,然后根據(jù) IP 地址以遞增的方式搜索本 IP 地址段后的每一個(gè)地址中的文檔,它完全不考慮各文檔中指向其它 Web 站點(diǎn)的超級(jí)鏈接地址。這種搜索策略的優(yōu)點(diǎn)是搜索比較全面,因此能夠發(fā)現(xiàn)那些沒(méi)被其它文檔引用的新文檔的信息源;但是缺點(diǎn)是不適合大規(guī)模搜索。
深度優(yōu)先搜索是一種在開(kāi)發(fā)爬蟲(chóng)早期使用較多的方法。它的目的是要達(dá)到被搜索結(jié)構(gòu)的葉結(jié)點(diǎn)(即那些不包含任何超鏈的 html 文件)。例如,在一個(gè) HTML 文件中,當(dāng)一個(gè)超鏈被選擇后,被鏈接的 HTML 文件將執(zhí)行深度優(yōu)先搜索,也就是說(shuō)在搜索其余的超鏈結(jié)果之前必須先完整地搜索單獨(dú)的一條鏈。深度優(yōu)先搜索沿著 HTML 文件上的超鏈走到不能再深入為止,然后返回到某一個(gè) HTML 文件,再繼續(xù)選擇該 HTML 文件中的其他超鏈。當(dāng)不再有其他超鏈可選擇時(shí),說(shuō)明搜索已經(jīng)結(jié)束。
寬度優(yōu)先搜索的過(guò)程是先搜索完一個(gè) Web 頁(yè)面中所有的超級(jí)鏈接,然后再繼續(xù)搜索下一層,直到底層為止。例如,一個(gè) HTML 文件中有三個(gè)超鏈,選擇其中之一并處理相應(yīng)的HTML文件,然后不再選擇第二個(gè) HTML 文件中的任何超鏈,而是返回并選擇第二個(gè)超鏈,處理相應(yīng)的 HTML 文件,再返回,選擇第三個(gè)超鏈并處理相應(yīng)的 HTML 文件。當(dāng)一層上的所有超鏈都已被選擇過(guò),就可以開(kāi)始在剛才處理過(guò)的 HIML 文件中搜索其余的超鏈。
寬度優(yōu)先搜索的優(yōu)點(diǎn):一個(gè)是保證了對(duì)淺層的優(yōu)先處理,當(dāng)遇到一個(gè)無(wú)窮盡的深層分支時(shí),不會(huì)導(dǎo)致陷進(jìn)深層文檔中出現(xiàn)出不來(lái)的情況發(fā)生;另一個(gè)是它能在兩個(gè) HTML 文件之間找到最短路徑。
寬度優(yōu)先搜索策略通常是實(shí)現(xiàn)爬蟲(chóng)的最佳策略,因?yàn)樗菀讓?shí)現(xiàn),而且具備大多數(shù)期望的功能。但是如果要遍歷一個(gè)指定的站點(diǎn)或者深層嵌套的 HTML 文件集,用寬度優(yōu)先搜索策略則需要花費(fèi)比較長(zhǎng)的時(shí)間才能到達(dá)深層的 HTML 文件。
截止到 2007 年底,Internet 上網(wǎng)頁(yè)數(shù)量超出 160 億個(gè),研究表明接近 30%的頁(yè)面是重復(fù)的;動(dòng)態(tài)頁(yè)面的存在:客戶端、服務(wù)器端腳本語(yǔ)言的應(yīng)用使得指向相同 Web 信息的 URL 數(shù)量呈指數(shù)級(jí)增長(zhǎng)。 上述特征使得網(wǎng)絡(luò)爬蟲(chóng)面臨一定的困難,主要體現(xiàn)在 Web 信息的巨大容量使得爬蟲(chóng)在給定時(shí)間內(nèi)只能下載少量網(wǎng)頁(yè)。 Lawrence 和 Giles 的研究表明沒(méi)有哪個(gè)搜索引擎能夠索引超出 16%的 Internet 上 Web 頁(yè)面,即使能夠提取全部頁(yè)面,也沒(méi)有足夠的空間來(lái)存儲(chǔ)。
為提高爬行效率,爬蟲(chóng)需要在單位時(shí)間內(nèi)盡可能多的獲取高質(zhì)量頁(yè)面,這也是是它面臨的難題之一。 當(dāng)前有五種表示頁(yè)面質(zhì)量高低的方式:Similarity(頁(yè)面與爬行主題之間的相似度)、Backlink(頁(yè)面在 Web 圖中的入度大小)、PageRank(指向它的所有頁(yè)面平均權(quán)值之和)、Forwardlink(頁(yè)面在 Web 圖中的出度大小)、location(頁(yè)面的信息位置)。
Parallel(并行性問(wèn)題):為了提高爬行速度,網(wǎng)絡(luò)通常會(huì)采取并行爬行的工作方式,隨之引入了新的問(wèn)題:
重復(fù)性:并行運(yùn)行的爬蟲(chóng)或爬行線程同時(shí)運(yùn)行時(shí)增加了重復(fù)頁(yè)面
質(zhì)量問(wèn)題:并行運(yùn)行時(shí),每個(gè)爬蟲(chóng)或爬行線程只能獲取部分頁(yè)面,導(dǎo)致頁(yè)面質(zhì)量下降
通信帶寬代價(jià):并行運(yùn)行時(shí),各個(gè)爬蟲(chóng)或爬行線程之間不可避免要進(jìn)行一些通信
并行運(yùn)行時(shí),網(wǎng)絡(luò)爬蟲(chóng)通常采用三種方式:獨(dú)立方式(各個(gè)爬蟲(chóng)獨(dú)立爬行頁(yè)面,互不通信)、動(dòng)態(tài)分配方式(由一個(gè)中央?yún)f(xié)調(diào)器動(dòng)態(tài)協(xié)調(diào)分配 URL 給各個(gè)爬蟲(chóng))、靜態(tài)分配方式(URL 事先劃分給各個(gè)爬蟲(chóng))。