爬蟲系統(tǒng)的誕生
通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁草穆,目前互聯(lián)網(wǎng)網(wǎng)頁的數(shù)量已達百億灌灾,所以搜索引擎首先面臨的問題是:如何能夠設(shè)計出高效的下載系統(tǒng),以將如此海量的網(wǎng)頁數(shù)據(jù)傳送到本地悲柱,在本地形成互聯(lián)網(wǎng)網(wǎng)頁的鏡像備份锋喜。
網(wǎng)絡(luò)爬蟲能夠起到這樣的作用,完成此項艱巨的任務(wù),它是搜索引擎系統(tǒng)中很關(guān)鍵也很基礎(chǔ)的構(gòu)件嘿般。本文主要介紹與網(wǎng)絡(luò)爬蟲相關(guān)的技術(shù)段标,盡管爬蟲經(jīng)過幾十年的發(fā)展,從整體框架上來看已經(jīng)相對成熟炉奴,但隨著互聯(lián)網(wǎng)的不斷發(fā)展逼庞,也面臨著一些新的挑戰(zhàn)。
通用爬蟲技術(shù)框架
爬蟲系統(tǒng)首先從互聯(lián)網(wǎng)頁面中精心選擇一部分網(wǎng)頁盆佣,以這些網(wǎng)頁的鏈接地址作為種子URL往堡,將這些種子放入待抓取URL隊列中,爬蟲從待抓取URL隊列依次讀取共耍,并將URL通過DNS解析,把鏈接地址轉(zhuǎn)換為網(wǎng)站服務(wù)器對應(yīng)的IP地址吨瞎。然后將其和網(wǎng)頁相對路徑名稱交給網(wǎng)頁下載器痹兜,網(wǎng)頁下載器負(fù)責(zé)頁面的下載。對于下載到本地的網(wǎng)頁颤诀,一方面將其存儲到頁面庫中字旭,等待建立索引等后續(xù)處理;另一方面將下載網(wǎng)頁的URL放入已抓取隊列中崖叫,這個隊列記錄了爬蟲系統(tǒng)已經(jīng)下載過的網(wǎng)頁URL遗淳,以避免系統(tǒng)的重復(fù)抓取。對于剛下載的網(wǎng)頁心傀,從中抽取出包含的所有鏈接信息屈暗,并在已下載的URL隊列中進行檢查,如果發(fā)現(xiàn)鏈接還沒有被抓取過脂男,則放到待抓取URL隊列的末尾养叛,在之后的抓取調(diào)度中會下載這個URL對應(yīng)的網(wǎng)頁。如此這般宰翅,形成循環(huán)弃甥,直到待抓取URL隊列為空,這代表著爬蟲系統(tǒng)將能夠抓取的網(wǎng)頁已經(jīng)悉數(shù)抓完汁讼,此時完成了一輪完整的抓取過程淆攻。
上述是一個通用爬蟲的整體流程,如果從更加宏觀的角度考慮嘿架,處于動態(tài)抓取過程中的爬蟲和互聯(lián)網(wǎng)所有網(wǎng)頁之間的關(guān)系瓶珊,可以概括為以下5個部分:
已下載網(wǎng)頁結(jié)合:爬蟲已經(jīng)從互聯(lián)網(wǎng)下載到本地進行索引的網(wǎng)頁集合。
已過期網(wǎng)頁結(jié)合:由于網(wǎng)頁數(shù)量龐大眶明,爬蟲完整抓取一輪需要較長時間艰毒,在抓取過程中,很多已下載的網(wǎng)頁可能已經(jīng)更新了搜囱,從而導(dǎo)致過期丑瞧。之所以如此柑土,是因為互聯(lián)網(wǎng)網(wǎng)頁處于不斷的動態(tài)變化過程中,所以易產(chǎn)生本地網(wǎng)頁內(nèi)容和真實互聯(lián)網(wǎng)不一致的情況绊汹。
待下載網(wǎng)頁集合:處于待抓取URL隊列中的網(wǎng)頁稽屏,這些網(wǎng)頁即將被爬蟲下載。
可知網(wǎng)頁集合:這些網(wǎng)頁還沒有被爬蟲下載西乖,也沒有出現(xiàn)在待抓取URL隊列中狐榔,通過已經(jīng)抓取的網(wǎng)頁或者在待抓取URL隊列中的網(wǎng)頁,總是能夠通過鏈接關(guān)系發(fā)現(xiàn)它們获雕,稍晚時候會被爬蟲抓取并索引薄腻。
未知網(wǎng)頁集合:有些網(wǎng)頁對于爬蟲是無法抓取到的,這部分網(wǎng)頁構(gòu)成了未知網(wǎng)頁結(jié)合届案。事實上庵楷,這部分網(wǎng)頁所占的比例很高。
從理解爬蟲的角度看楣颠,對互聯(lián)網(wǎng)網(wǎng)頁給出如上劃分有助于深入理解搜索引擎爬蟲所面臨的主要任務(wù)和挑戰(zhàn)尽纽。絕大多數(shù)爬蟲系統(tǒng)遵循上文的流程,但是并非所有的爬蟲系統(tǒng)都如此一致童漩。根據(jù)具體應(yīng)用的不同弄贿,爬蟲系統(tǒng)在許多方面存在差異,大體而已矫膨,可以將爬蟲系統(tǒng)分為如下3種類型差凹。
批量型爬蟲:批量型爬蟲有比較明確的抓取范圍和目標(biāo),當(dāng)爬蟲達到這個設(shè)定的目標(biāo)后豆拨,即停止抓取過程直奋。至于具體目標(biāo)可能各異,也許是設(shè)定抓取一定數(shù)量的網(wǎng)頁即可施禾,也許是設(shè)定抓取的時間等脚线,各不一樣。
增量型爬蟲:增量型爬蟲與批量型爬蟲不同弥搞,會保持持續(xù)不斷的抓取邮绿,對于抓取到的網(wǎng)頁,要定期更新攀例,因為互聯(lián)網(wǎng)網(wǎng)頁處于不斷變化中船逮,新增網(wǎng)頁、網(wǎng)頁被刪除或者網(wǎng)頁內(nèi)容更改都很常見粤铭,而增量型爬蟲需要及時反映這種變化挖胃,所以處于持續(xù)不斷的抓取過程中,不是在抓取新網(wǎng)頁,就是在更新已有網(wǎng)頁酱鸭。通用的商業(yè)搜索引擎爬蟲基本都屬此類吗垮。
垂直型爬蟲:垂直型爬蟲關(guān)注特定主題內(nèi)容或者屬于特定行業(yè)的網(wǎng)頁,比如對于健康網(wǎng)站來說凹髓,只需要從互聯(lián)網(wǎng)頁面里找到與健康相關(guān)的頁面內(nèi)容即可烁登,其他行業(yè)的內(nèi)容不在考慮范圍。垂直型爬蟲一個最大的特點和難點就是:如何識別網(wǎng)頁內(nèi)容是否屬于指定行業(yè)或主題蔚舀。從節(jié)省系統(tǒng)資源的角度來講饵沧,不可能把所有互聯(lián)網(wǎng)頁面下載之后在進行篩選,這樣會造成資源過度浪費赌躺,往往需要爬蟲在抓取階段就能夠動態(tài)識別某個網(wǎng)址是否與主題相關(guān)狼牺,并盡量不去抓取無關(guān)頁面,以達到節(jié)省資源的目的寿谴。垂直搜索網(wǎng)站或者垂直行業(yè)網(wǎng)站往往需要此種類型的爬蟲锁右。
優(yōu)秀爬蟲的特性
優(yōu)秀爬蟲的特性對于不同的應(yīng)用來說,可能實現(xiàn)的方式各有差異讶泰,但是實用的爬蟲都應(yīng)該具備以下特性。
01高性能
互聯(lián)網(wǎng)的網(wǎng)頁數(shù)量是海量的拂到。所以爬蟲的性能至關(guān)重要痪署,這里的性能主要是指爬蟲下載網(wǎng)頁的抓取速度,常見的評價方式是以爬蟲每秒能夠下載的網(wǎng)頁數(shù)量作為性能指標(biāo)兄旬,單位時間能夠下載的網(wǎng)頁數(shù)量越多狼犯,爬蟲的性能越高。
要提高爬蟲的性能领铐,在設(shè)計時程序訪問磁盤的操作方法及具體實現(xiàn)時數(shù)據(jù)結(jié)構(gòu)的選擇很關(guān)鍵悯森,比如對于待抓取URL隊列和已抓取URL隊列,因為URL數(shù)量非常大绪撵,不同實現(xiàn)方式性能表現(xiàn)迥異瓢姻,所以高效的數(shù)據(jù)結(jié)構(gòu)對于爬蟲性能影響很大。
02可擴展性
即使單個爬蟲的性能很高音诈,要將所有網(wǎng)頁都下載到本地幻碱,仍然需要相當(dāng)長的時間周期,為了能夠盡可能縮短抓取周期细溅,爬蟲系統(tǒng)應(yīng)該有很好地可擴展性褥傍,即很容易通過增加抓取服務(wù)器和爬蟲數(shù)量來達到此目的。
目前實用的大型網(wǎng)絡(luò)爬蟲一定是分布式運行的喇聊,即多臺服務(wù)器專做抓取恍风,每臺服務(wù)器部署多個爬蟲,每個爬蟲多線程運行,通過多種方式增加并發(fā)性朋贬。對于巨型的搜索引擎服務(wù)商來說凯楔,可能還要在全球范圍、不同地域分別部署數(shù)據(jù)中心兄世,爬蟲也被分配到不同的數(shù)據(jù)中心啼辣,這樣對于提高爬蟲系統(tǒng)的整體性能是很有幫助的。
03健壯性
爬蟲要訪問各種類型的網(wǎng)站服務(wù)器御滩,可能會遇到很多種非正常情況鸥拧,比如網(wǎng)頁HTML編碼不規(guī)范, 被抓取服務(wù)器突然死機削解,甚至爬蟲陷阱等富弦。爬蟲對各種異常情況能否正確處理非常重要,否則可能會不定期停止工作氛驮,這是無法忍受的腕柜。
從另外一個角度來講,假設(shè)爬蟲程序在抓取過程中死掉矫废,或者爬蟲所在的服務(wù)器宕機盏缤,健壯的爬蟲應(yīng)能做到,再次啟動爬蟲時蓖扑,能夠恢復(fù)之前抓取的內(nèi)容和數(shù)據(jù)結(jié)構(gòu)唉铜,而不是每次都需要把所有工作完全從頭做起,這也是爬蟲健壯性的一種體現(xiàn)律杠。
04友好性
爬蟲的友好性包含兩方面的含義:一是保護網(wǎng)站的部分私密性潭流,另一是減少被抓取網(wǎng)站的網(wǎng)絡(luò)負(fù)載。爬蟲抓取的對象是各類型的網(wǎng)站柜去,對于網(wǎng)站所有者來說灰嫉,有些內(nèi)容并不希望被所有人搜到,所以需要設(shè)定協(xié)議嗓奢,來告知爬蟲哪些內(nèi)容是不允許抓取的讼撒。目前有兩種主流的方法可達到此目的:爬蟲禁抓協(xié)議和網(wǎng)頁禁抓標(biāo)記。
爬蟲禁抓協(xié)議指的是由網(wǎng)站所有者生成一個指定的文件robot.txt蔓罚,并放在網(wǎng)站服務(wù)器的根目錄下椿肩,這個文件指明了網(wǎng)站中哪些目錄下的網(wǎng)頁是不允許爬蟲抓取的。具有友好性的爬蟲在抓取該網(wǎng)站的網(wǎng)頁前豺谈,首先要讀取robot.txt文件郑象,對于禁止抓取的網(wǎng)頁不進行下載。
網(wǎng)頁禁抓標(biāo)記一般在網(wǎng)頁的HTML代碼里加入meta name="robots”標(biāo)記茬末,content字段指出允許或者不允許爬蟲的哪些行為厂榛「墙茫可以分為兩種情形,一種是告知爬蟲不要索引該網(wǎng)頁內(nèi)容击奶,以noindex作為標(biāo)記辈双;另外一種情形是告知爬蟲不要抓取網(wǎng)頁所包含的鏈接,以nofollow作為標(biāo)記柜砾。通過這種方式湃望,可以達到對網(wǎng)頁內(nèi)容的一種隱私保護。
遵循以上協(xié)議的爬蟲可以被認(rèn)為是友好的痰驱,這是從保護私密性的角度來考慮的证芭。另外一種友好性則是,希望爬蟲對某網(wǎng)站的訪問造成的網(wǎng)路負(fù)載較低担映。爬蟲一般會根據(jù)網(wǎng)頁的鏈接連續(xù)獲取某網(wǎng)站的網(wǎng)頁废士,如果爬蟲訪問網(wǎng)站頻率過高,會給網(wǎng)站服務(wù)器造成很大的訪問壓力蝇完,有時候甚至?xí)绊懢W(wǎng)站的正常訪問殊霞,造成類似DOS攻擊的效果密强,為了減少網(wǎng)站的網(wǎng)絡(luò)負(fù)載阀趴,友好性的爬蟲應(yīng)該在抓取策略部署時考慮每個被抓取網(wǎng)站的負(fù)載碌尔,在盡可能不影響爬蟲性能的情況下,減少對單一站點短期內(nèi)的高頻訪問朋魔。
爬蟲質(zhì)量的評價標(biāo)準(zhǔn)
如果從搜索引擎用戶體驗的角度考慮达箍,對爬蟲的工作效果有不同的評價標(biāo)準(zhǔn),其中最主要的3個標(biāo)準(zhǔn)是:抓取網(wǎng)頁的覆蓋率铺厨、抓取網(wǎng)頁時新性及抓取網(wǎng)頁重要性。如果這3方面做得好硬纤,則搜索引擎用戶體驗必定好解滓。
對于現(xiàn)有的搜索引擎來說,還不存在哪個搜索引擎有能力將互聯(lián)網(wǎng)上出現(xiàn)的所有網(wǎng)頁都下載并建立索引筝家,所有搜索引擎只能索引互聯(lián)網(wǎng)的一部分洼裤,而所謂的抓取覆蓋率指的是爬蟲抓取網(wǎng)頁的數(shù)量占互聯(lián)網(wǎng)所有網(wǎng)頁數(shù)量的比例,覆蓋率越高溪王,等價于搜索引擎的召回率越高腮鞍,用戶體驗越好。
抓取到本地的網(wǎng)頁莹菱,很有可能已經(jīng)發(fā)生變化移国,或者被刪除,或者內(nèi)容被更改道伟,因為爬蟲抓取完一輪需要較長的時間周期迹缀,所以抓取到的網(wǎng)頁當(dāng)中必然會有一部分是過期的數(shù)據(jù)使碾,即不能在網(wǎng)頁變化后第一時間反應(yīng)到網(wǎng)頁庫中,所以網(wǎng)頁庫中過期的數(shù)據(jù)越少祝懂,則網(wǎng)頁的時新性越好票摇,這對用戶體驗的改善大有裨益。如果時新性不好砚蓬,搜索到的都是過期數(shù)據(jù)矢门,或者網(wǎng)頁被刪除,用戶的內(nèi)心感受可想而知灰蛙。
互聯(lián)網(wǎng)盡管網(wǎng)頁繁多祟剔,但是每個網(wǎng)頁的差異性都很大,比如來自騰訊缕允、網(wǎng)易新聞的網(wǎng)頁和某個作弊網(wǎng)頁相比峡扩,其重要性猶如天壤之別。如果搜索引擎抓取到的網(wǎng)頁大部分是比較重要的網(wǎng)頁障本,則可以說明在抓取網(wǎng)頁重要性方面做得比較好教届。這方面做的越好,則越說明搜索引擎的搜索精度越高驾霜。
通過以上3個標(biāo)準(zhǔn)的說明分析案训,可以將爬蟲研發(fā)的目標(biāo)簡單描述如下:在資源有限的情況下,既然搜索引擎只能抓取互聯(lián)網(wǎng)現(xiàn)存網(wǎng)頁的一部分粪糙,那么就盡可能給選擇比較重要的那部分頁面來索引强霎;對于已經(jīng)抓取到的網(wǎng)頁,盡可能快的更新內(nèi)容蓉冈,使得索引網(wǎng)頁和互聯(lián)網(wǎng)對應(yīng)頁面內(nèi)容同步更新城舞;在此基礎(chǔ)上,盡可能擴大抓取范圍寞酿,抓取到更多以前無法發(fā)現(xiàn)的網(wǎng)頁家夺。3個“”盡可能”基本說清楚了爬蟲系統(tǒng)為增強用戶體驗而奮斗的目標(biāo)。
大型商業(yè)搜索引擎為了滿足3個質(zhì)量標(biāo)準(zhǔn)伐弹,大都開發(fā)了多套針對性很強的爬蟲系統(tǒng)拉馋。以Google為例,至少包含兩套不同的爬蟲系統(tǒng)惨好,一套被稱為Fresh Bot煌茴,主要考慮網(wǎng)頁的時新性,對于內(nèi)容更新頻繁的網(wǎng)頁日川,目前可以達到以秒計的更新周期蔓腐;另外一套被稱之為Deep Crawl Bot,主要針對更新不是那么頻繁的網(wǎng)頁抓取逗鸣,以天為更新周期合住。除此之外绰精,Google投入了很大精力研發(fā)針對暗網(wǎng)的抓取系統(tǒng),后續(xù)透葛,有時間在說明暗網(wǎng)系統(tǒng)笨使。
如果您對爬蟲有興趣,還可以閱讀:
全程干貨 | 解密爬蟲抓取僚害、更新網(wǎng)頁的策略方法