【搜索引擎基礎知識2】網絡爬蟲


部分內容參考《這就是搜索引擎》


通用搜索引擎的處理對象是互聯網網頁,目前網頁數量以百億計,搜索引擎的網絡爬蟲能夠高效地將海量的網頁數據傳下載到本地,在本地 形成互聯網網頁的鏡像備份。它是搜索引擎系統中很關鍵也很基礎的構件。

(一)網絡爬蟲本質就是瀏覽器http請求

瀏覽器和網絡爬蟲是兩種不同的網絡客戶端,都以相同的方式來獲取網頁:

      1、首先, 客戶端程序連接到域名系統(DNS)服務器上,DNS服務器將主機 名轉換成ip 地址。

      2、接下來,客戶端試着連接具有該IP地址的服務器。服務器上可能有多個 不同進程程序在運行,每個進程程序都在監聽網絡以發現新的選接。.各個進程監聽不同的網絡端口 (port). 端口是一個l6位的數卞,用來辨識不同的服務。Http請求一般默認都是80端口。

     3、 一旦建立連接,客戶端向服務器發送一個http請求,服務器接收到請求後,返回響應結果給客戶端。

     4、客戶端關閉該連接。

    詳細瞭解http工作原理:網絡互聯參考模型(詳解) Apache運行機制剖析

  (二)搜索引擎爬蟲架構

        瀏覽器是用戶主動操作然後完成HTTP請求,而爬蟲需要自動完成http請求,網絡爬蟲需要一套整體架構完成工作。

       儘管爬蟲技術經過幾十年的發展,從整體框架上已相對成熟,但隨着互聯網 的不斷髮展,也面臨着一些有挑戰性的新問題。 通用爬蟲框架如下圖:

                       

                                                                                    通用爬蟲框架


       通用的爬蟲框架流程:

       1、首先從互聯網頁面中精心選擇一部分網頁,以這 些網頁的鏈接地址作爲種子URL;

       2、將這些種子URL放入待抓取URL隊列中;

       3、爬蟲從待抓取 URL隊列依次讀取,並將URL通過DNS解析,把鏈接地址轉換爲網站服務器對應的IP地址。 

       4、然後將IP地址和網頁相對路徑名稱交給網頁下載器,

       5、網頁下載器負責頁面內容的下載。

       6、對於下載到 本地的網頁,一方面將其存儲到頁面庫中,等待建立索引等後續處理;另一方面將下載網頁的 URL放入己抓取URL隊列中,這個隊列記載了爬蟲系統己經下載過的網頁URL,以避免網頁 的重複抓取。

       7、對於剛下載的網頁,從中抽取出所包含的所有鏈接信息,並在已抓取URL隊列 中檢査,如果發現鏈接還沒有被抓取過,則將這個URL放入待抓取URL隊歹!

       8,9、末尾,在之後的 抓取調度中會下載這個URL對應的網頁,如此這般,形成循環,直到待抓取URL隊列爲空.

(三)爬蟲抓取策略

  在爬蟲系統中,待抓取URL隊列是很重要的一部分。待抓取URL隊列中的URL以什麼樣的順序排列也是一個很重要的問題,因爲這涉及到先抓取那個頁面,後抓取哪個頁面。而決定這些URL排列順序的方法,叫做抓取策略。

       1、 深度優先搜索策略(順藤摸瓜)
         即圖的深度優先遍歷算法。網絡爬蟲會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之後再轉入下一個起始頁,繼續跟蹤鏈接。

         我們使用圖的方式來說明:

        我們假設互聯網就是張有向圖,圖中每個頂點代表一個網頁。 設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜索可從圖中某個頂點發v 出發,訪問此頂點,然後依次從v 的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v 有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到爲止。

以如下圖的無向圖G1爲例,進行圖的深度優先搜索:

          


                                                  G1

    

       搜索過程:

             


        假設從頂點頁面v1 出發進行搜索抓取,在訪問了頁面v1 之後,選擇鄰接點頁面v2。因爲v2 未曾訪問,則從v2 出發進行搜索。依次類推,接着從v4 、v8 、v5 出發進行搜索。在訪問了v5 之後,由於v5 的鄰接點都已被訪問,則搜索回到v8。由於同樣的理由,搜索繼續回到v4,v2 直至v1,此時由於v1 的另一個鄰接點未被訪問,則搜索又從v1 到v3,再繼續進行下去由此,得到的頂點訪問序列爲:


  2、 廣度優先搜索策略
      寬度優先遍歷策略的基本思路是,將新下載網頁中發現的鏈接直接插入待抓取URL隊列的末尾。也就是指網絡爬蟲會先抓取起始網頁中鏈接的所有網頁,然後再選擇其中的一個鏈接網頁,繼續抓取在此網頁中鏈接的所有網頁。該算法的設計和實現相對簡單。在目前爲覆蓋儘可能多的網頁, 一般使用廣度優先搜索方法。也有很多研究將廣度優先搜索策略應用於聚焦爬蟲中。其基本思想是認爲與初始URL在一定鏈接距離內的網頁具有主題相關性的概率很大。另外一種方法是將廣度優先搜索與網頁過濾技術結合使用,先用廣度優先策略抓取網頁,再將其中無關的網頁過濾掉。這些方法的缺點在於,隨着抓取網頁的增多,大量的無關網頁將被下載並過濾,算法的效率將變低。

       還是以上面的圖爲例,抓取過程如下:

         廣度搜索過程:

                          

        首先訪問頁面v1 和v1 的鄰接點v2 和v3,然後依次訪問v2 的鄰接點v4 和v5 及v3 的鄰接點v6 和v7,最後訪問v4 的鄰接點v8。由於這些頂點的鄰接點均已被訪問,並且圖中所有頂點都被訪問,由些完成了圖的遍歷。得到的頂點訪問序列爲:


v1→v2 →v3 →v4→ v5→ v6→ v7 →v8


和深度優先搜索類似,在遍歷的過程中也需要一個訪問標誌數組。並且,爲了順次訪問路徑長度爲2、3、…的頂點,需附設隊列以存儲已被訪問的路徑長度爲1、2、… 的頂點。

(1)採用廣度優先的原因:
重要的網頁往往離種子站點距離較近;萬維網的深度沒有我們想象的那麼深,但卻出乎意料地寬(中文萬維網直徑長度只有17,即任意兩個網頁之間點擊17次後便可以訪問到);
寬度優先有利於多爬蟲合作抓取;
(2)廣度優先的存在不利結果:
容易導致爬蟲陷入死循環,不該抓取的反覆抓取;
應該抓取的沒有機會抓取;
(3) 解決以上兩個缺點的方法是深度抓取策略(Depth-First Trsversal)和不重複抓取策略 
(4)爲了防止爬蟲無限制地寬度優先抓取,必須在某個深度上進行限制,達到這個深度後停止抓取,這個深度就是萬維網的直徑長度。當最大深度上停止抓取時,那些深度過大的未抓取網頁,總是期望可以從其他種子站點更加經濟地到達。限制抓取深度會破壞死循環的條件,即使出現循環也會在有限次後停止。 
(5)評價:   寬度(廣度)優先,兼顧深度的遍歷策略,可以有效保證抓取過程中的封閉性,即在抓取過程(遍歷路徑)中總是抓取相同域名下的網頁,而很少出現其他域名下的網頁。

    3、反向鏈接數策略
       反向鏈接數是指一個網頁被其他網頁鏈接指向的數量。反向鏈接數表示的是一個網頁的內容受到其他人的推薦的程度。因此,很多時候搜索引擎的抓取系統會使用這個指標來評價網頁的重要程度,從而決定不同網頁的抓取先後順序。

    在真實的網絡環境中,由於廣告鏈接、作弊鏈接的存在,反向鏈接數不能完全等他我那個也的重要程度。因此,搜索引擎往往考慮一些可靠的反向鏈接數。

   4、Partial PageRank策略,即最佳優先搜索策略
        Partial PageRank算法借鑑了PageRank算法的思想:按照一定的網頁分析算法,預測候選URL與目標網頁的相似度,或與主題的相關性,並選取評價最好的一個或幾個URL進行抓取,即對於已經下載的網頁,連同待抓取URL隊列中的URL,形成網頁集合,計算每個頁面的PageRank值,計算完之後,將待抓取URL隊列中的URL按照PageRank值的大小排列,並按照該順序抓取頁面。

        它只訪問經過網頁分析算法預測爲“有用”的網頁。存在的一個問題是,在爬蟲抓取路徑上的很多相關網頁可能被忽略,因爲最佳優先策略是一種局部最優搜索算法。 因此需要將最佳優先結合具體的應用進行改進,以跳出局部最優點。研究表明,這樣的閉環調整可以將無關網頁數量降低30%~90%。
       如果每次抓取一個頁面,就重新計算PageRank值,一種折中方案是:每抓取K個頁面後,重新計算一次PageRank值。但是這種情況還會有一個問題:對於已經下載下來的頁面中分析出的鏈接,也就是我們之前提到的未知網頁那一部分,暫時是沒有PageRank值的。爲了解決這個問題,會給這些頁面一個臨時的PageRank值:將這個網頁所有入鏈傳遞進來的PageRank值進行彙總,這樣就形成了該未知頁面的PageRank值,從而參與排序。

    由於PageRank是一個全局算法,就是當所有網頁都被下載完成以後,其計算結果纔是可靠的,但是爬蟲在抓取過程中只能接觸到一部分網頁,所以在抓取階段的網頁時無法進行可靠的PageRank計算的,所以叫做非完全PageRank策略。

    5、OPIC策略策略
        該算法實際上也是對頁面進行一個重要性打分。在算法開始前,給所有頁面一個相同的初始現金(cash)。當下載了某個頁面P之後,將P的現金分攤給所有從P中分析出的鏈接,並且將P的現金清空。對於待抓取URL隊列中的所有頁面按照現金數進行排序。

    6、大站優先策略
    對於待抓取URL隊列中的所有網頁,根據所屬的網站進行分類。對於待下載頁面數多的網站,優先下載。這個策略也因此叫做大站優先策略。 

(四)網頁更新策略

     互聯網是實時變化的,具有很強的動態性。網頁更新策略主要是決定何時更新之前已經下載過的頁面。常見的更新策略又以下三種:

    1.歷史參考策略

    顧名思義,根據頁面以往的歷史更新數據,預測該頁面未來何時會發生變化。一般來說,是通過泊松過程進行建模進行預測。

    2.用戶體驗策略
    儘管搜索引擎針對於某個查詢條件能夠返回數量巨大的結果,但是用戶往往只關注前幾頁結果。因此,抓取系統可以優先更新那些現實在查詢結果前幾頁中的網頁,而後再更新那些後面的網頁。這種更新策略也是需要用到歷史信息的。用戶體驗策略保留網頁的多個歷史版本,並且根據過去每次內容變化對搜索質量的影響,得出一個平均值,用這個值作爲決定何時重新抓取的依據。
    3.聚類抽樣策略

    前面提到的兩種更新策略都有一個前提:需要網頁的歷史信息。這樣就存在兩個問題:第一,系統要是爲每個系統保存多個版本的歷史信息,無疑增加了很多的系統負擔;第二,要是新的網頁完全沒有歷史信息,就無法確定更新策略。

    這種策略認爲,網頁具有很多屬性,類似屬性的網頁,可以認爲其更新頻率也是類似的。要計算某一個類別網頁的更新頻率,只需要對這一類網頁抽樣,以他們的更新週期作爲整個類別的更新週期。基本思路如圖:

   

                  

 (五)暗網抓取

請參考《這就是搜索引擎》

1、查詢組合問題


2、文本框填寫問題


(六)分佈式爬蟲

請參考《這就是搜索引擎》

1、主從式分佈爬蟲

對於主從式分佈爬蟲,不同的服務器擔當不同的角色分工,其中有一臺專門負責對其他服務器提供URL 分發服務,其他機器則進行實際的網頁下載。

但會導致瓶頸。


2、對等式分佈爬蟲

在對等式分佈爬蟲體系中,服務器之間不存在分工差異,每臺服務器承擔相同的功能,各自負擔一部分URL的抓取工作。


(七)爬蟲質量的評價標準

1、【更全】 抓取網頁覆蓋率,爬蟲抓取的網頁數量佔互聯網所有網頁數量的比例。(即召回率越高越好)

2、 【更快】抓取網頁時新率,網頁很可能處於不斷變化之中,有的更新,有的刪除。保證時新率能夠保證網頁在變化後的第一時間反映到網頁庫中,而過期和失效的數據就會越少,用戶訪問到的東西越新。

3、 【更準】抓取網頁重要性,重要性越高,說明網頁質量越好,越能滿足用戶的搜索需求。(即搜索精度越好)

(八)網絡爬蟲的組成模塊

一般的網絡爬蟲通常包含以下5個模塊:

1、保存種子URL的數據結構

2、保存待抓取URL的數據結構

3、保存已經抓取過的URL的數據結構

4、頁面獲取模塊

5、對已經獲取頁面內容的各個部分進行抽取的模塊,例如HTML,JS等。

其它可選的模塊包括:

1、負責連接前處理模塊

2、負責連接後處理模塊

3、過濾器模塊

4、負責多線程的模塊

5、負責分佈式的模塊

(九)URL存儲的常用數據結構

1、種子URL

爬蟲都是從一系列的種子URL開始爬取,一般從數據庫表或者配置文件中讀取這些種子URL。

一般來說,網站擁有者把網站提交給分類目錄,例如dmoz(http://www.dmoz.org/),爬蟲則可以從開放式目錄dmoz抓取。

種子URL一般有以下幾個字段

Id   url  Source(網站來源)  rank(PageRank值)

2、待抓取URL的數據結構

(1)一個比較小的示例爬蟲程序,可能就使用內存中的一個隊列,或者是優先級別隊列進行存儲。

(2)一箇中等規模的爬蟲程序,可能使用BerkelyDB這種內存數據庫來存儲,如果內存中存放不下的話,還可以序列化到磁盤上。

(3)真正的大規模爬蟲系統,是通過服務器集羣來存儲已經爬取出來的URL。

3、已抓取過的URL的數據結構

由於Visited表經常被查詢,以確認是否已經處理過。因此,Visited表如果是一個內存數據結構的話,可以採用Hash(HashSet/HashMap)來存儲。

如果存儲在數據庫中的話,可以對URL列建立索引。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章