了解入門爬蟲技術(shù)原理,看這篇就夠了
爬蟲技術(shù)就是一個高效的下載系統(tǒng),能夠?qū)⒑A康木W(wǎng)頁數(shù)據(jù)傳送到本地,在本地形成互聯(lián)網(wǎng)網(wǎng)頁的鏡像備份。本文從爬蟲技術(shù)的誕生開始,為你詳細解析爬蟲技術(shù)原理。
一、爬蟲系統(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ò)爬蟲能夠起到這樣的作用,完成此項艱巨的任務,它是搜索引擎系統(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)站服務器對應的IP地址。
然后將其和網(wǎng)頁相對路徑名稱交給網(wǎng)頁下載器,網(wǎng)頁下載器負責頁面的下載。
對于下載到本地的網(wǎng)頁,一方面將其存儲到頁面庫中,等待建立索引等后續(xù)處理;另一方面將下載網(wǎng)頁的URL放入已抓取隊列中,這個隊列記錄了爬蟲系統(tǒng)已經(jīng)下載過的網(wǎng)頁URL,以避免系統(tǒng)的重復抓取。
對于剛下載的網(wǎng)頁,從中抽取出包含的所有鏈接信息,并在已下載的URL隊列中進行檢查,如果發(fā)現(xiàn)鏈接還沒有被抓取過,則放到待抓取URL隊列的末尾。在之后的抓取調(diào)度中會下載這個URL對應的網(wǎng)頁。
如此這般,形成循環(huán),直到待抓取URL隊列為空,這代表著爬蟲系統(tǒng)將能夠抓取的網(wǎng)頁已經(jīng)悉數(shù)抓完,此時完成了一輪完整的抓取過程。
通用爬蟲架構(gòu)
上述是一個通用爬蟲的整體流程,如果從更加宏觀的角度考慮,處于動態(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)更新了,從而導致過期。之所以如此,是因為互聯(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)頁面劃分
從理解爬蟲的角度看,對互聯(lián)網(wǎng)網(wǎng)頁給出如上劃分有助于深入理解搜索引擎爬蟲所面臨的主要任務和挑戰(zhàn)。絕大多數(shù)爬蟲系統(tǒng)遵循上文的流程,但是并非所有的爬蟲系統(tǒng)都如此一致。根據(jù)具體應用的不同,爬蟲系統(tǒng)在許多方面存在差異,大體而已,可以將爬蟲系統(tǒng)分為如下3種類型:
1.批量型爬蟲:批量型爬蟲有比較明確的抓取范圍和目標,當爬蟲達到這個設(shè)定的目標后,即停止抓取過程。
至于具體目標可能各異,也許是設(shè)定抓取一定數(shù)量的網(wǎng)頁即可,也許是設(shè)定抓取的時間等,各不一樣。
2.增量型爬蟲:增量型爬蟲與批量型爬蟲不同,會保持持續(xù)不斷的抓取,對于抓取到的網(wǎng)頁,要定期更新。
因為互聯(lián)網(wǎng)網(wǎng)頁處于不斷變化中,新增網(wǎng)頁、網(wǎng)頁被刪除或者網(wǎng)頁內(nèi)容更改都很常見,而增量型爬蟲需要及時反映這種變化,所以處于持續(xù)不斷的抓取過程中,不是在抓取新網(wǎng)頁,就是在更新已有網(wǎng)頁。通用的商業(yè)搜索引擎爬蟲基本都屬此類。
3.垂直型爬蟲:垂直型爬蟲關(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)秀爬蟲的特性對于不同的應用來說,可能實現(xiàn)的方式各有差異,但是實用的爬蟲都應該具備以下特性:
1.高性能
互聯(lián)網(wǎng)的網(wǎng)頁數(shù)量是海量的,所以爬蟲的性能至關(guān)重要。這里的性能主要是指爬蟲下載網(wǎng)頁的抓取速度,常見的評價方式是以爬蟲每秒能夠下載的網(wǎng)頁數(shù)量作為性能指標,單位時間能夠下載的網(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)對于爬蟲性能影響很大。
2.可擴展性
即使單個爬蟲的性能很高,要將所有網(wǎng)頁都下載到本地,仍然需要相當長的時間周期,為了能夠盡可能縮短抓取周期,爬蟲系統(tǒng)應該有很好地可擴展性,即很容易通過增加抓取服務器和爬蟲數(shù)量來達到此目的。
目前實用的大型網(wǎng)絡(luò)爬蟲一定是分布式運行的,即多臺服務器專做抓取。每臺服務器部署多個爬蟲,每個爬蟲多線程運行,通過多種方式增加并發(fā)性。
對于巨型的搜索引擎服務商來說,可能還要在全球范圍、不同地域分別部署數(shù)據(jù)中心,爬蟲也被分配到不同的數(shù)據(jù)中心,這樣對于提高爬蟲系統(tǒng)的整體性能是很有幫助的。
3.健壯性
爬蟲要訪問各種類型的網(wǎng)站服務器,可能會遇到很多種非正常情況:比如網(wǎng)頁HTML編碼不規(guī)范、 被抓取服務器突然死機,甚至爬蟲陷阱等。爬蟲對各種異常情況能否正確處理非常重要,否則可能會不定期停止工作,這是無法忍受的。
從另外一個角度來講,假設(shè)爬蟲程序在抓取過程中死掉,或者爬蟲所在的服務器宕機,健壯的爬蟲應能做到:再次啟動爬蟲時,能夠恢復之前抓取的內(nèi)容和數(shù)據(jù)結(jié)構(gòu),而不是每次都需要把所有工作完全從頭做起,這也是爬蟲健壯性的一種體現(xiàn)。
4.友好性
爬蟲的友好性包含兩方面的含義:一是保護網(wǎng)站的部分私密性;另一是減少被抓取網(wǎng)站的網(wǎng)絡(luò)負載。爬蟲抓取的對象是各類型的網(wǎng)站,對于網(wǎng)站所有者來說,有些內(nèi)容并不希望被所有人搜到,所以需要設(shè)定協(xié)議,來告知爬蟲哪些內(nèi)容是不允許抓取的。目前有兩種主流的方法可達到此目的:爬蟲禁抓協(xié)議和網(wǎng)頁禁抓標記。
爬蟲禁抓協(xié)議指的是由網(wǎng)站所有者生成一個指定的文件robot.txt,并放在網(wǎng)站服務器的根目錄下,這個文件指明了網(wǎng)站中哪些目錄下的網(wǎng)頁是不允許爬蟲抓取的。具有友好性的爬蟲在抓取該網(wǎng)站的網(wǎng)頁前,首先要讀取robot.txt文件,對于禁止抓取的網(wǎng)頁不進行下載。
網(wǎng)頁禁抓標記一般在網(wǎng)頁的HTML代碼里加入meta name=”robots”標記,content字段指出允許或者不允許爬蟲的哪些行為??梢苑譃閮煞N情形:一種是告知爬蟲不要索引該網(wǎng)頁內(nèi)容,以noindex作為標記;另外一種情形是告知爬蟲不要抓取網(wǎng)頁所包含的鏈接,以nofollow作為標記。通過這種方式,可以達到對網(wǎng)頁內(nèi)容的一種隱私保護。
遵循以上協(xié)議的爬蟲可以被認為是友好的,這是從保護私密性的角度來考慮的;另外一種友好性則是,希望爬蟲對某網(wǎng)站的訪問造成的網(wǎng)路負載較低。
爬蟲一般會根據(jù)網(wǎng)頁的鏈接連續(xù)獲取某網(wǎng)站的網(wǎng)頁,如果爬蟲訪問網(wǎng)站頻率過高,會給網(wǎng)站服務器造成很大的訪問壓力,有時候甚至會影響網(wǎng)站的正常訪問,造成類似DOS攻擊的效果。
為了減少網(wǎng)站的網(wǎng)絡(luò)負載,友好性的爬蟲應該在抓取策略部署時考慮每個被抓取網(wǎng)站的負載,在盡可能不影響爬蟲性能的情況下,減少對單一站點短期內(nèi)的高頻訪問。
四、爬蟲質(zhì)量的評價標準
如果從搜索引擎用戶體驗的角度考慮,對爬蟲的工作效果有不同的評價標準,其中最主要的3個標準是:抓取網(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)頁和互聯(lián)網(wǎng)網(wǎng)頁對比
抓取到本地的網(wǎng)頁,很有可能已經(jīng)發(fā)生變化,或者被刪除,或者內(nèi)容被更改,因為爬蟲抓取完一輪需要較長的時間周期,所以抓取到的網(wǎng)頁當中必然會有一部分是過期的數(shù)據(jù),即不能在網(wǎ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個標準的說明分析,可以將爬蟲研發(fā)的目標簡單描述如下:在資源有限的情況下,既然搜索引擎只能抓取互聯(lián)網(wǎng)現(xiàn)存網(wǎng)頁的一部分,那么就盡可能給選擇比較重要的那部分頁面來索引;對于已經(jīng)抓取到的網(wǎng)頁,盡可能快的更新內(nèi)容,使得索引網(wǎng)頁和互聯(lián)網(wǎng)對應頁面內(nèi)容同步更新;在此基礎(chǔ)上,盡可能擴大抓取范圍,抓取到更多以前無法發(fā)現(xiàn)的網(wǎng)頁。
3個“盡可能”基本說清楚了爬蟲系統(tǒng)為增強用戶體驗而奮斗的目標。
大型商業(yè)搜索引擎為了滿足3個質(zhì)量標準,大都開發(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)。
Google的兩套爬蟲系統(tǒng)
五、最后的總結(jié)
閱讀本文,通過了解爬蟲的技術(shù)架構(gòu)、爬蟲的類型、優(yōu)秀爬蟲的特性、爬蟲質(zhì)量標準,相信你對爬蟲系統(tǒng)已經(jīng)有了一個初步的系統(tǒng)性的認識,最后將主要知識點做一個簡短的綱領(lǐng)性總結(jié):
- 爬蟲抓取網(wǎng)頁的工作流程:選擇待抓取網(wǎng)頁,按順序放入待抓取隊列;系統(tǒng)依次將網(wǎng)頁鏈接地址轉(zhuǎn)換為IP地址,下載到本地后,按順序進行存儲和標記,避免重復下載;繼續(xù)執(zhí)行新一輪的抓取,周而復始。
- 爬蟲和互聯(lián)網(wǎng)所有網(wǎng)頁之間的關(guān)系:已下載網(wǎng)頁結(jié)合、已過期網(wǎng)頁結(jié)合、待下載網(wǎng)頁結(jié)合、可知網(wǎng)頁結(jié)合、未知網(wǎng)頁結(jié)合
- 爬蟲類型:批量型爬蟲、增量型爬蟲、垂直型爬蟲
- 優(yōu)秀爬蟲的特性:高性能、可擴展性、健壯性、友好性
- 爬蟲質(zhì)量的評價標準:抓取網(wǎng)頁的覆蓋率、抓取網(wǎng)頁時新性及抓取網(wǎng)頁重要性
本文由 @?kevin 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自 Unsplash,基于 CC0 協(xié)議
寫的不錯
不錯
催更~請解鎖暗網(wǎng)章節(jié)