通用搜尋引擎的處理對象是互連網網頁,目前網頁數量以百億計,搜尋引擎的網路爬蟲能夠高效地將海量的網頁資料傳下載到本地,在本地 形成互連網網頁的鏡像備份。它是搜尋引擎系統中很關鍵也很基礎的構件。
1. 網路爬蟲本質就是瀏覽器http請求。
瀏覽器和網路爬蟲是兩種不同的網路用戶端,都以相同的方式來擷取網頁:
1)首先, 用戶端程式串連到網域名稱系統(DNS)伺服器上,DNS伺服器將主機 名轉換成ip 地址。
2)接下來,用戶端試著串連具有該IP地址的伺服器。伺服器上可能有多個 不同進程程式在運行,每個進程程式都在監聽網路以發現新的選接。.各個進程監聽不同的網路連接埠 (port). 連接埠是一個l6位的數卞,用來辨識不同的服務。Http請求一般預設都是80連接埠。
3) 一旦建立串連,用戶端向伺服器發送一個http請求,伺服器接收到請求後,返迴響應結果給用戶端。
4)用戶端關閉該串連。
詳細瞭解http工作原理:網路互聯參考模型(詳解) 和Apache運行機制剖析
2. 搜尋引擎爬蟲架構
但是瀏覽器是使用者主動操作然後完成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隊列為空白.
3. 爬蟲抓取策略
在爬蟲系統中,待抓取URL隊列是很重要的一部分。待抓取URL隊列中的URL以什麼樣的順序排列也是一個很重要的問題,因為這涉及到先抓取那個頁面,後抓取哪個頁面。而決定這些URL排列順序的方法,叫做抓取策略。
3.1 深度優先搜尋策略(順藤摸瓜)
即圖的深度優先遍曆演算法。網路爬蟲會從起始頁開始,一個連結一個連結跟蹤下去,處理完這條線路之後再轉入下一個起始頁,繼續跟蹤連結。
我們使用圖的方式來說明:
我們假設互連網就是張有向圖,圖中每個頂點代表一個網頁。 設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可某個頂點發v 出發,訪問此頂點,然後依次從v 的未被訪問的鄰接點出發深度優先遍曆圖,直至圖中所有和v 有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。
以如的無向圖G1為例,進行圖的深度優先搜尋:
G1
搜尋過程:
假設從頂點頁面v1 出發進行搜尋抓取,在訪問了頁面v1 之後,選擇鄰接點頁面v2。因為v2 未曾訪問,則從v2 出發進行搜尋。依次類推,接著從v4 、v8 、v5 出發進行搜尋。在訪問了v5 之後,由於v5 的鄰接點都已被訪問,則搜尋回到v8。由於同樣的理由,搜尋繼續回到v4,v2 直至v1,此時由於v1 的另一個鄰接點未被訪問,則搜尋又從v1 到v3,再繼續進行下去由此,得到的頂點訪問序列為:
3.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、… 的頂點。
3.2 最佳優先搜尋策略
最佳優先搜尋策略按照一定的網頁分析演算法,預測候選URL與目標網頁的相似性,或與主題的相關性,並選取評價最好的一個或幾個URL進行抓取。
3.3.反向連結數策略
反向連結數是指一個網頁被其他網頁連結指向的數量。反向連結數表示的是一個網頁的內容受到其他人的推薦的程度。因此,很多時候搜尋引擎的抓取系統會使用這個指標來評價網頁的重要程度,從而決定不同網頁的抓取先後順序。
在真實的網路環境中,由於廣告連結、作弊連結的存在,反向連結數不能完全等他我那個也的重要程度。因此,搜尋引擎往往考慮一些可靠的反向連結數。
3.4.Partial PageRank策略,即最佳優先搜尋策略
Partial PageRank演算法借鑒了PageRank演算法的思想:按照一定的網頁分析演算法,預測候選URL與目標網頁的相似性,或與主題的相關性,並選取評價最好的一個或幾個URL進行抓取,即對於已經下載的網頁,連同待抓取URL隊列中的URL,形成網頁集合,計算每個頁面的PageRank值,計算完之後,將待抓取URL隊列中的URL按照PageRank值的大小排列,並按照該順序抓取頁面。
它只訪問經過網頁分析演算法預測為“有用”的網頁。存在的一個問題是,在爬蟲抓取路徑上的很多相關網頁可能被忽略,因為最佳優先策略是一種局部最優搜尋演算法。 因此需要將最佳優先結合具體的應用進行改進,以跳出局部最優點。研究表明,這樣的閉環調整可以將無關網頁數量降低30%~90%。
如果每次抓取一個頁面,就重新計算PageRank值,一種折中方案是:每抓取K個頁面後,重新計算一次PageRank值。但是這種情況還會有一個問題:對於已經下載下來的頁面中分析出的連結,也就是我們之前提到的未知網頁那一部分,暫時是沒有PageRank值的。為瞭解決這個問題,會給這些頁面一個臨時的PageRank值:將這個網頁所有入鏈傳遞進來的PageRank值進行匯總,這樣就形成了該未知頁面的PageRank值,從而參與排序。
3.5.OPIC策略策略
該演算法實際上也是對頁面進行一個重要性打分。在演算法開始前,給所有頁面一個相同的初始現金(cash)。當下載了某個頁面P之後,將P的現金分攤給所有從P中分析出的連結,並且將P的現金清空。對於待抓取URL隊列中的所有頁面按照現金數進行排序。
3. 6.大站優先策略
對於待抓取URL隊列中的所有網頁,根據所屬的網站進行分類。對於待下載頁面數多的網站,優先下載。這個策略也因此叫做大站優先策略。
4. 網頁更新策略
互連網是即時變化的,具有很強的動態性。網頁更新策略主要是決定何時更新之前已經下載過的頁面。常見的更新策略又以下三種:
1.曆史參考策略 顧名思義,根據頁面以往的曆史更新資料,預測該頁面未來何時會發生變化。一般來說,是通過泊松過程進行建模進行預測。
2.使用者體驗策略
儘管搜尋引擎針對於某個查詢條件能夠返回數量巨大的結果,但是使用者往往只關注前幾頁結果。因此,抓取系統可以優先更新那些現實在查詢結果前幾頁中的網頁,而後再更新那些後面的網頁。這種更新策略也是需要用到曆史資訊的。使用者體驗策略保留網頁的多個曆史版本,並且根據過去每次內容變化對搜尋品質的影響,得出一個平均值,用這個值作為決定何時重新抓取的依據。
3.聚類抽樣策略 前面提到的兩種更新策略都有一個前提:需要網頁的曆史資訊。這樣就存在兩個問題:第一,系統要是為每個系統儲存多個版本的曆史資訊,無疑增加了很多的系統負擔;第二,要是新的網頁完全沒有曆史資訊,就無法確定更新策略。 這種策略認為,網頁具有很多屬性,類似屬性的網頁,可以認為其更新頻率也是類似的。要計算某一個類別網頁的更新頻率,只需要對這一類網頁抽樣,以他們的更新周期作為整個類別的更新周期。基本思路
5. 雲端儲存文檔
應用的知識:
1,GFS,使用GFSDistributed File System儲存海量文檔。
2,BitTable,在GFS的基礎上構建BitTable的資料模型;
3,MegaStore儲存模型又建立在BitTable之上的儲存和計算模型。
4,Map/Reduce雲端運算模型和系統計算架構。
4.1 BitTable儲存原始的網頁資訊
4-1所示的邏輯模型,樣本crawldb table用於儲存爬蟲抓取的網頁資訊,
其中:Row Key為網頁的URL,出於排序效率考慮,URL中主機網域名稱字元順序往往被反置,如www.facebook.com被處理為com.facebook.www;
Column Family包括title、content、anchor,其中tile儲存網頁的標題,content儲存網頁html內容,anchor儲存網頁被其它網頁引用的連結,qualifier就是其它網頁的URL,內容為其它網頁中該連結的頁面顯示字元,同樣anchor連結的URL主機域字串被反置。對於不同時間擷取的同一網頁的有關內容被打上不同的時間戳記Timestampe,縱向座標可以看到不同的版本。
圖4-1Crawldb Table 邏輯模型
在實際的儲存中,圖4-1所示的多維邏輯結構會被二維平面化為(Key, Value)對,並且進行排序。在(Key,Value)中,Key由四維索引值組成,包括:Row Key, ColumnFamily(處理時使用8位元編碼), Column Qualifier和Timestamp,4-2所示,為Key的實際結構,在對Key進行排序過程中,有最新Timestamp的Key會被排在最前面,flag項用於標明系統需要對該(Key,Value)記錄進行的操作符,如增加、刪除、更新等。
圖4-2 key結構圖
4-3是crawldb二維平面化後經過排序的格式。圖中Key列中的資訊由Row Key(頁面的URL)、Column Family、Column Qualifer和Timestamp組成,其中並未顯示Key flag項,flag項主要用於表項處理。
圖4-3 crawldb表的key/valuye 列表
圖4-4顯示了crawldb table的CellStore檔案格式。CellStore檔案中儲存了經過排序後的Key,Value對,物理上,這些資料都被壓縮後儲存,以大約64k大小的塊為單位組織;在檔案結尾處,保留有三個索引部分:Bloom Filter、塊索引(row key + 塊在檔案內的位移)、Trailer。
4.2Map/Reduce計算模型處理網頁資訊:網頁去重和產生倒排索引
網頁去重我們採用簡單策略,目標是將網頁集合內所有內容相同的網頁找出來,采 取對網頁內容取雜湊值的方法,比如MD5, 如果兩個網頁的MD5值相同,則可以認為兩 頁內容完全相同。 在Map/Reduce架構下,輸入資料是網頁本身,可以用網頁的URL作為輸入資料的Key, 網頁內容是輸入資料的value; Map操作則對每個網頁的內容利用MD5計算雜湊值,以這 個雜湊值作為中間資料的Key, 網頁的URL作為中間資料的value: Reduce操作則將相同 Key的中間資料對應的URL建立成一個鏈表結構,這個鏈表代表了具有相同網頁內容雜湊
值的都有哪些網頁。這樣就完成了識別內容相同網頁的任務。
對於建立倒排索引這個任務來說,4-6所示,輸入資料也是網頁,以網頁的DOCID作為輸入資料 的Key, 網頁中出現的單詞集合是輸入資料的 Value; Map 操作將輸入資料轉化為 (word,DOCID)的形式,即某個單詞作為Key, DOCID作為中間資料的value,其含義是單詞 word在DOCID這個網頁出現過;Reduce操作將中間資料中相同Key的記錄融合,得到某 個單詞對應的網頁ID列表: <word,List(DodD)>。這就是單詞word對應的倒排列表。通過 這種方式就可以建立簡單的倒排索引,在Reduce階段也可以做些複雜操作,獲得形式更為複雜的倒排索引。
圖4-6
參考文獻:
《這就是搜尋引擎:核心技術詳解》
《搜尋引擎—資訊檢索實踐》