了解入門爬蟲技術(shù)原理,看這篇就夠了

3 評(píng)論 37721 瀏覽 90 收藏 17 分鐘

爬蟲技術(shù)就是一個(gè)高效的下載系統(tǒng),能夠?qū)⒑A康木W(wǎng)頁(yè)數(shù)據(jù)傳送到本地,在本地形成互聯(lián)網(wǎng)網(wǎng)頁(yè)的鏡像備份。本文從爬蟲技術(shù)的誕生開始,為你詳細(xì)解析爬蟲技術(shù)原理。

一、爬蟲系統(tǒng)的誕生

通用搜索引擎的處理對(duì)象是互聯(lián)網(wǎng)網(wǎng)頁(yè),目前互聯(lián)網(wǎng)網(wǎng)頁(yè)的數(shù)量已達(dá)百億,所以搜索引擎首先面臨的問題是:如何能夠設(shè)計(jì)出高效的下載系統(tǒng),以將如此海量的網(wǎng)頁(yè)數(shù)據(jù)傳送到本地,在本地形成互聯(lián)網(wǎng)網(wǎng)頁(yè)的鏡像備份。

網(wǎng)絡(luò)爬蟲能夠起到這樣的作用,完成此項(xiàng)艱巨的任務(wù),它是搜索引擎系統(tǒng)中很關(guān)鍵也很基礎(chǔ)的構(gòu)件。

本文主要介紹與網(wǎng)絡(luò)爬蟲相關(guān)的技術(shù),盡管爬蟲經(jīng)過幾十年的發(fā)展,從整體框架上來看已經(jīng)相對(duì)成熟,但隨著互聯(lián)網(wǎng)的不斷發(fā)展,也面臨著一些新的挑戰(zhàn)。

二、通用爬蟲技術(shù)框架

爬蟲系統(tǒng)首先從互聯(lián)網(wǎng)頁(yè)面中精心選擇一部分網(wǎng)頁(yè),以這些網(wǎng)頁(yè)的鏈接地址作為種子URL,將這些種子放入待抓取URL隊(duì)列中,爬蟲從待抓取URL隊(duì)列依次讀取,并將URL通過DNS解析,把鏈接地址轉(zhuǎn)換為網(wǎng)站服務(wù)器對(duì)應(yīng)的IP地址。

然后將其和網(wǎng)頁(yè)相對(duì)路徑名稱交給網(wǎng)頁(yè)下載器,網(wǎng)頁(yè)下載器負(fù)責(zé)頁(yè)面的下載。

對(duì)于下載到本地的網(wǎng)頁(yè),一方面將其存儲(chǔ)到頁(yè)面庫(kù)中,等待建立索引等后續(xù)處理;另一方面將下載網(wǎng)頁(yè)的URL放入已抓取隊(duì)列中,這個(gè)隊(duì)列記錄了爬蟲系統(tǒng)已經(jīng)下載過的網(wǎng)頁(yè)URL,以避免系統(tǒng)的重復(fù)抓取。

對(duì)于剛下載的網(wǎng)頁(yè),從中抽取出包含的所有鏈接信息,并在已下載的URL隊(duì)列中進(jìn)行檢查,如果發(fā)現(xiàn)鏈接還沒有被抓取過,則放到待抓取URL隊(duì)列的末尾。在之后的抓取調(diào)度中會(huì)下載這個(gè)URL對(duì)應(yīng)的網(wǎng)頁(yè)。

如此這般,形成循環(huán),直到待抓取URL隊(duì)列為空,這代表著爬蟲系統(tǒng)將能夠抓取的網(wǎng)頁(yè)已經(jīng)悉數(shù)抓完,此時(shí)完成了一輪完整的抓取過程。

通用爬蟲架構(gòu)

上述是一個(gè)通用爬蟲的整體流程,如果從更加宏觀的角度考慮,處于動(dòng)態(tài)抓取過程中的爬蟲和互聯(lián)網(wǎng)所有網(wǎng)頁(yè)之間的關(guān)系,可以概括為以下5個(gè)部分:

  1. 已下載網(wǎng)頁(yè)結(jié)合:爬蟲已經(jīng)從互聯(lián)網(wǎng)下載到本地進(jìn)行索引的網(wǎng)頁(yè)集合。
  2. 已過期網(wǎng)頁(yè)結(jié)合:由于網(wǎng)頁(yè)數(shù)量龐大,爬蟲完整抓取一輪需要較長(zhǎng)時(shí)間,在抓取過程中,很多已下載的網(wǎng)頁(yè)可能已經(jīng)更新了,從而導(dǎo)致過期。之所以如此,是因?yàn)榛ヂ?lián)網(wǎng)網(wǎng)頁(yè)處于不斷的動(dòng)態(tài)變化過程中,所以易產(chǎn)生本地網(wǎng)頁(yè)內(nèi)容和真實(shí)互聯(lián)網(wǎng)不一致的情況。
  3. 待下載網(wǎng)頁(yè)集合:處于待抓取URL隊(duì)列中的網(wǎng)頁(yè),這些網(wǎng)頁(yè)即將被爬蟲下載。
  4. 可知網(wǎng)頁(yè)集合:這些網(wǎng)頁(yè)還沒有被爬蟲下載,也沒有出現(xiàn)在待抓取URL隊(duì)列中,通過已經(jīng)抓取的網(wǎng)頁(yè)或者在待抓取URL隊(duì)列中的網(wǎng)頁(yè),總是能夠通過鏈接關(guān)系發(fā)現(xiàn)它們,稍晚時(shí)候會(huì)被爬蟲抓取并索引。
  5. 未知網(wǎng)頁(yè)集合:有些網(wǎng)頁(yè)對(duì)于爬蟲是無(wú)法抓取到的,這部分網(wǎng)頁(yè)構(gòu)成了未知網(wǎng)頁(yè)結(jié)合。事實(shí)上,這部分網(wǎng)頁(yè)所占的比例很高。

互聯(lián)網(wǎng)頁(yè)面劃分

從理解爬蟲的角度看,對(duì)互聯(lián)網(wǎng)網(wǎng)頁(yè)給出如上劃分有助于深入理解搜索引擎爬蟲所面臨的主要任務(wù)和挑戰(zhàn)。絕大多數(shù)爬蟲系統(tǒng)遵循上文的流程,但是并非所有的爬蟲系統(tǒng)都如此一致。根據(jù)具體應(yīng)用的不同,爬蟲系統(tǒng)在許多方面存在差異,大體而已,可以將爬蟲系統(tǒng)分為如下3種類型:

1.批量型爬蟲:批量型爬蟲有比較明確的抓取范圍和目標(biāo),當(dāng)爬蟲達(dá)到這個(gè)設(shè)定的目標(biāo)后,即停止抓取過程。

至于具體目標(biāo)可能各異,也許是設(shè)定抓取一定數(shù)量的網(wǎng)頁(yè)即可,也許是設(shè)定抓取的時(shí)間等,各不一樣。

2.增量型爬蟲:增量型爬蟲與批量型爬蟲不同,會(huì)保持持續(xù)不斷的抓取,對(duì)于抓取到的網(wǎng)頁(yè),要定期更新。

因?yàn)榛ヂ?lián)網(wǎng)網(wǎng)頁(yè)處于不斷變化中,新增網(wǎng)頁(yè)、網(wǎng)頁(yè)被刪除或者網(wǎng)頁(yè)內(nèi)容更改都很常見,而增量型爬蟲需要及時(shí)反映這種變化,所以處于持續(xù)不斷的抓取過程中,不是在抓取新網(wǎng)頁(yè),就是在更新已有網(wǎng)頁(yè)。通用的商業(yè)搜索引擎爬蟲基本都屬此類。

3.垂直型爬蟲:垂直型爬蟲關(guān)注特定主題內(nèi)容或者屬于特定行業(yè)的網(wǎng)頁(yè),比如對(duì)于健康網(wǎng)站來說,只需要從互聯(lián)網(wǎng)頁(yè)面里找到與健康相關(guān)的頁(yè)面內(nèi)容即可,其他行業(yè)的內(nèi)容不在考慮范圍。

垂直型爬蟲一個(gè)最大的特點(diǎn)和難點(diǎn)就是:如何識(shí)別網(wǎng)頁(yè)內(nèi)容是否屬于指定行業(yè)或主題。

從節(jié)省系統(tǒng)資源的角度來講,不可能把所有互聯(lián)網(wǎng)頁(yè)面下載之后在進(jìn)行篩選,這樣會(huì)造成資源過度浪費(fèi),往往需要爬蟲在抓取階段就能夠動(dòng)態(tài)識(shí)別某個(gè)網(wǎng)址是否與主題相關(guān),并盡量不去抓取無(wú)關(guān)頁(yè)面,以達(dá)到節(jié)省資源的目的。垂直搜索網(wǎng)站或者垂直行業(yè)網(wǎng)站往往需要此種類型的爬蟲。

三、優(yōu)秀爬蟲的特性

優(yōu)秀爬蟲的特性對(duì)于不同的應(yīng)用來說,可能實(shí)現(xiàn)的方式各有差異,但是實(shí)用的爬蟲都應(yīng)該具備以下特性:

1.高性能

互聯(lián)網(wǎng)的網(wǎng)頁(yè)數(shù)量是海量的,所以爬蟲的性能至關(guān)重要。這里的性能主要是指爬蟲下載網(wǎng)頁(yè)的抓取速度,常見的評(píng)價(jià)方式是以爬蟲每秒能夠下載的網(wǎng)頁(yè)數(shù)量作為性能指標(biāo),單位時(shí)間能夠下載的網(wǎng)頁(yè)數(shù)量越多,爬蟲的性能越高。

要提高爬蟲的性能,在設(shè)計(jì)時(shí)程序訪問磁盤的操作方法及具體實(shí)現(xiàn)時(shí)數(shù)據(jù)結(jié)構(gòu)的選擇很關(guān)鍵,比如對(duì)于待抓取URL隊(duì)列和已抓取URL隊(duì)列,因?yàn)閁RL數(shù)量非常大,不同實(shí)現(xiàn)方式性能表現(xiàn)迥異,所以高效的數(shù)據(jù)結(jié)構(gòu)對(duì)于爬蟲性能影響很大。

2.可擴(kuò)展性

即使單個(gè)爬蟲的性能很高,要將所有網(wǎng)頁(yè)都下載到本地,仍然需要相當(dāng)長(zhǎng)的時(shí)間周期,為了能夠盡可能縮短抓取周期,爬蟲系統(tǒng)應(yīng)該有很好地可擴(kuò)展性,即很容易通過增加抓取服務(wù)器和爬蟲數(shù)量來達(dá)到此目的。

目前實(shí)用的大型網(wǎng)絡(luò)爬蟲一定是分布式運(yùn)行的,即多臺(tái)服務(wù)器專做抓取。每臺(tái)服務(wù)器部署多個(gè)爬蟲,每個(gè)爬蟲多線程運(yùn)行,通過多種方式增加并發(fā)性。

對(duì)于巨型的搜索引擎服務(wù)商來說,可能還要在全球范圍、不同地域分別部署數(shù)據(jù)中心,爬蟲也被分配到不同的數(shù)據(jù)中心,這樣對(duì)于提高爬蟲系統(tǒng)的整體性能是很有幫助的。

3.健壯性

爬蟲要訪問各種類型的網(wǎng)站服務(wù)器,可能會(huì)遇到很多種非正常情況:比如網(wǎng)頁(yè)HTML編碼不規(guī)范、 被抓取服務(wù)器突然死機(jī),甚至爬蟲陷阱等。爬蟲對(duì)各種異常情況能否正確處理非常重要,否則可能會(huì)不定期停止工作,這是無(wú)法忍受的。

從另外一個(gè)角度來講,假設(shè)爬蟲程序在抓取過程中死掉,或者爬蟲所在的服務(wù)器宕機(jī),健壯的爬蟲應(yīng)能做到:再次啟動(dòng)爬蟲時(shí),能夠恢復(fù)之前抓取的內(nèi)容和數(shù)據(jù)結(jié)構(gòu),而不是每次都需要把所有工作完全從頭做起,這也是爬蟲健壯性的一種體現(xiàn)。

4.友好性

爬蟲的友好性包含兩方面的含義:一是保護(hù)網(wǎng)站的部分私密性;另一是減少被抓取網(wǎng)站的網(wǎng)絡(luò)負(fù)載。爬蟲抓取的對(duì)象是各類型的網(wǎng)站,對(duì)于網(wǎng)站所有者來說,有些內(nèi)容并不希望被所有人搜到,所以需要設(shè)定協(xié)議,來告知爬蟲哪些內(nèi)容是不允許抓取的。目前有兩種主流的方法可達(dá)到此目的:爬蟲禁抓協(xié)議和網(wǎng)頁(yè)禁抓標(biāo)記。

爬蟲禁抓協(xié)議指的是由網(wǎng)站所有者生成一個(gè)指定的文件robot.txt,并放在網(wǎng)站服務(wù)器的根目錄下,這個(gè)文件指明了網(wǎng)站中哪些目錄下的網(wǎng)頁(yè)是不允許爬蟲抓取的。具有友好性的爬蟲在抓取該網(wǎng)站的網(wǎng)頁(yè)前,首先要讀取robot.txt文件,對(duì)于禁止抓取的網(wǎng)頁(yè)不進(jìn)行下載。

網(wǎng)頁(yè)禁抓標(biāo)記一般在網(wǎng)頁(yè)的HTML代碼里加入meta name=”robots”標(biāo)記,content字段指出允許或者不允許爬蟲的哪些行為??梢苑譃閮煞N情形:一種是告知爬蟲不要索引該網(wǎng)頁(yè)內(nèi)容,以noindex作為標(biāo)記;另外一種情形是告知爬蟲不要抓取網(wǎng)頁(yè)所包含的鏈接,以nofollow作為標(biāo)記。通過這種方式,可以達(dá)到對(duì)網(wǎng)頁(yè)內(nèi)容的一種隱私保護(hù)。

遵循以上協(xié)議的爬蟲可以被認(rèn)為是友好的,這是從保護(hù)私密性的角度來考慮的;另外一種友好性則是,希望爬蟲對(duì)某網(wǎng)站的訪問造成的網(wǎng)路負(fù)載較低。

爬蟲一般會(huì)根據(jù)網(wǎng)頁(yè)的鏈接連續(xù)獲取某網(wǎng)站的網(wǎng)頁(yè),如果爬蟲訪問網(wǎng)站頻率過高,會(huì)給網(wǎng)站服務(wù)器造成很大的訪問壓力,有時(shí)候甚至?xí)绊懢W(wǎng)站的正常訪問,造成類似DOS攻擊的效果。

為了減少網(wǎng)站的網(wǎng)絡(luò)負(fù)載,友好性的爬蟲應(yīng)該在抓取策略部署時(shí)考慮每個(gè)被抓取網(wǎng)站的負(fù)載,在盡可能不影響爬蟲性能的情況下,減少對(duì)單一站點(diǎn)短期內(nèi)的高頻訪問。

四、爬蟲質(zhì)量的評(píng)價(jià)標(biāo)準(zhǔn)

如果從搜索引擎用戶體驗(yàn)的角度考慮,對(duì)爬蟲的工作效果有不同的評(píng)價(jià)標(biāo)準(zhǔn),其中最主要的3個(gè)標(biāo)準(zhǔn)是:抓取網(wǎng)頁(yè)的覆蓋率、抓取網(wǎng)頁(yè)時(shí)新性及抓取網(wǎng)頁(yè)重要性。如果這3方面做得好,則搜索引擎用戶體驗(yàn)必定好。

對(duì)于現(xiàn)有的搜索引擎來說,還不存在哪個(gè)搜索引擎有能力將互聯(lián)網(wǎng)上出現(xiàn)的所有網(wǎng)頁(yè)都下載并建立索引,所有搜索引擎只能索引互聯(lián)網(wǎng)的一部分。而所謂的抓取覆蓋率指的是爬蟲抓取網(wǎng)頁(yè)的數(shù)量占互聯(lián)網(wǎng)所有網(wǎng)頁(yè)數(shù)量的比例,覆蓋率越高,等價(jià)于搜索引擎的召回率越高,用戶體驗(yàn)越好。

索引網(wǎng)頁(yè)和互聯(lián)網(wǎng)網(wǎng)頁(yè)對(duì)比

抓取到本地的網(wǎng)頁(yè),很有可能已經(jīng)發(fā)生變化,或者被刪除,或者內(nèi)容被更改,因?yàn)榕老x抓取完一輪需要較長(zhǎng)的時(shí)間周期,所以抓取到的網(wǎng)頁(yè)當(dāng)中必然會(huì)有一部分是過期的數(shù)據(jù),即不能在網(wǎng)頁(yè)變化后第一時(shí)間反應(yīng)到網(wǎng)頁(yè)庫(kù)中。所以網(wǎng)頁(yè)庫(kù)中過期的數(shù)據(jù)越少,則網(wǎng)頁(yè)的時(shí)新性越好,這對(duì)用戶體驗(yàn)的改善大有裨益。

如果時(shí)新性不好,搜索到的都是過期數(shù)據(jù),或者網(wǎng)頁(yè)被刪除,用戶的內(nèi)心感受可想而知。

互聯(lián)網(wǎng)盡管網(wǎng)頁(yè)繁多,但是每個(gè)網(wǎng)頁(yè)的差異性都很大,比如來自騰訊、網(wǎng)易新聞的網(wǎng)頁(yè)和某個(gè)作弊網(wǎng)頁(yè)相比,其重要性猶如天壤之別。如果搜索引擎抓取到的網(wǎng)頁(yè)大部分是比較重要的網(wǎng)頁(yè),則可以說明在抓取網(wǎng)頁(yè)重要性方面做得比較好。這方面做的越好,則越說明搜索引擎的搜索精度越高。

通過以上3個(gè)標(biāo)準(zhǔn)的說明分析,可以將爬蟲研發(fā)的目標(biāo)簡(jiǎn)單描述如下:在資源有限的情況下,既然搜索引擎只能抓取互聯(lián)網(wǎng)現(xiàn)存網(wǎng)頁(yè)的一部分,那么就盡可能給選擇比較重要的那部分頁(yè)面來索引;對(duì)于已經(jīng)抓取到的網(wǎng)頁(yè),盡可能快的更新內(nèi)容,使得索引網(wǎng)頁(yè)和互聯(lián)網(wǎng)對(duì)應(yīng)頁(yè)面內(nèi)容同步更新;在此基礎(chǔ)上,盡可能擴(kuò)大抓取范圍,抓取到更多以前無(wú)法發(fā)現(xiàn)的網(wǎng)頁(yè)。

3個(gè)“盡可能”基本說清楚了爬蟲系統(tǒng)為增強(qiáng)用戶體驗(yàn)而奮斗的目標(biāo)。

大型商業(yè)搜索引擎為了滿足3個(gè)質(zhì)量標(biāo)準(zhǔn),大都開發(fā)了多套針對(duì)性很強(qiáng)的爬蟲系統(tǒng)。以Google為例,至少包含兩套不同的爬蟲系統(tǒng):一套被稱為Fresh Bot,主要考慮網(wǎng)頁(yè)的時(shí)新性,對(duì)于內(nèi)容更新頻繁的網(wǎng)頁(yè),目前可以達(dá)到以秒計(jì)的更新周期;另外一套被稱之為Deep Crawl Bot,主要針對(duì)更新不是那么頻繁的網(wǎng)頁(yè)抓取,以天為更新周期。

除此之外,Google投入了很大精力研發(fā)針對(duì)暗網(wǎng)的抓取系統(tǒng),后續(xù),有時(shí)間再說明暗網(wǎng)系統(tǒng)。

Google的兩套爬蟲系統(tǒng)

五、最后的總結(jié)

閱讀本文,通過了解爬蟲的技術(shù)架構(gòu)、爬蟲的類型、優(yōu)秀爬蟲的特性、爬蟲質(zhì)量標(biāo)準(zhǔn),相信你對(duì)爬蟲系統(tǒng)已經(jīng)有了一個(gè)初步的系統(tǒng)性的認(rèn)識(shí),最后將主要知識(shí)點(diǎn)做一個(gè)簡(jiǎn)短的綱領(lǐng)性總結(jié):

  • 爬蟲抓取網(wǎng)頁(yè)的工作流程:選擇待抓取網(wǎng)頁(yè),按順序放入待抓取隊(duì)列;系統(tǒng)依次將網(wǎng)頁(yè)鏈接地址轉(zhuǎn)換為IP地址,下載到本地后,按順序進(jìn)行存儲(chǔ)和標(biāo)記,避免重復(fù)下載;繼續(xù)執(zhí)行新一輪的抓取,周而復(fù)始。
  • 爬蟲和互聯(lián)網(wǎng)所有網(wǎng)頁(yè)之間的關(guān)系:已下載網(wǎng)頁(yè)結(jié)合、已過期網(wǎng)頁(yè)結(jié)合、待下載網(wǎng)頁(yè)結(jié)合、可知網(wǎng)頁(yè)結(jié)合、未知網(wǎng)頁(yè)結(jié)合
  • 爬蟲類型:批量型爬蟲、增量型爬蟲、垂直型爬蟲
  • 優(yōu)秀爬蟲的特性:高性能、可擴(kuò)展性、健壯性、友好性
  • 爬蟲質(zhì)量的評(píng)價(jià)標(biāo)準(zhǔn):抓取網(wǎng)頁(yè)的覆蓋率、抓取網(wǎng)頁(yè)時(shí)新性及抓取網(wǎng)頁(yè)重要性

 

本文由 @?kevin 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自 Unsplash,基于 CC0 協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 寫的不錯(cuò)

    來自廣東 回復(fù)
  2. 不錯(cuò)

    來自湖南 回復(fù)
  3. 催更~請(qǐng)解鎖暗網(wǎng)章節(jié)

    來自浙江 回復(fù)