作者:Poll的筆記
來源:http://www.cnblogs.com/maybe2030/p/4778134.html
閱讀目錄
隨著網際網路的大力發展,網際網路稱為信息的主要載體,而如何在網際網路中搜集信息是網際網路領域面臨的一大挑戰。網絡爬蟲技術是什麼?其實網絡爬蟲技術就是指的網絡數據的抓取,因為在網絡中抓取數據是具有關聯性的抓取,它就像是一隻蜘蛛一樣在網際網路中爬來爬去,所以我們很形象地將其稱為是網絡爬蟲技術。其中網絡爬蟲也被稱為是網絡機器人或者是網絡追逐者。
網絡爬蟲技術是搜尋引擎架構中最為根本的數據技術,通過網絡爬蟲技術,我們可以將網際網路中數以百億計的網頁信息保存到本地,形成一個鏡像文件,為整個搜尋引擎提供數據支撐。
1. 網絡爬蟲技術基本工作流程和基礎架構網絡爬蟲獲取網頁信息的方式和我們平時使用瀏覽器訪問網頁的工作原理是完全一樣的,都是根據HTTP協議來獲取,其流程主要包括如下步驟:
1)連接DNS域名伺服器,將待抓取的URL進行域名解析(URL->IP);
2)根據HTTP協議,發送HTTP請求來獲取網頁內容。
一個完整的網絡爬蟲基礎框架如下圖所示:
整個架構共有如下幾個過程:
1)需求方提供需要抓取的種子URL列表,根據提供的URL列表和相應的優先級,建立待抓取URL隊列(先來先抓);
2)根據待抓取URL隊列的排序進行網頁抓取;
3)將獲取的網頁內容和信息下載到本地的網頁庫,並建立已抓取URL列表(用於去重和判斷抓取的進程);
4)將已抓取的網頁放入到待抓取的URL隊列中,進行循環抓取操作;
2. 網絡爬蟲的抓取策略在爬蟲系統中,待抓取URL隊列是很重要的一部分。待抓取URL隊列中的URL以什麼樣的順序排列也是一個很重要的問題,因為這涉及到先抓取哪個頁面,後抓取哪個頁面的問題。而決定這些URL排列順序的方法,叫做抓取策略。下面重點介紹幾種常見的抓取策略:
1)深度優先遍歷策略
深度優先遍歷策略很好理解,這跟我們有向圖中的深度優先遍歷是一樣的,因為網絡本身就是一種圖模型嘛。深度優先遍歷的思路是先從一個起始網頁開始抓取,然後對根據連結一個一個的逐級進行抓取,直到不能再深入抓取為止,返回上一級網頁繼續跟蹤連結。
一個有向圖深度優先搜索的實例如下所示:
上圖左圖為一個有向圖示意圖,右圖為深度優先遍歷的搜索過程示意圖。深度優先遍歷的結果為:
2)廣度優先搜索策略
廣度優先搜索和深度優先搜索的工作方式正好是相對的,其思想為:將新下載網頁中發現的連結直接插入待抓取URL隊列的末尾。也就是指網絡爬蟲會先抓取起始網頁中連結的所有網頁,然後再選擇其中的一個連結網頁,繼續抓取在此網頁中連結的所有網頁。
上圖為上邊實例的有向圖的廣度優先搜索流程圖,其遍歷的結果為:
v1→v2 →v3 →v4→ v5→ v6→ v7 →v8
從樹的結構上去看,圖的廣度優先遍歷就是樹的層次遍歷。
3)反向連結搜索策略
反向連結數是指一個網頁被其他網頁連結指向的數量。反向連結數表示的是一個網頁的內容受到其他人的推薦的程度。因此,很多時候搜尋引擎的抓取系統會使用這個指標來評價網頁的重要程度,從而決定不同網頁的抓取先後順序。
在真實的網絡環境中,由於廣告連結、作弊連結的存在,反向連結數不能完全等他我那個也的重要程度。因此,搜尋引擎往往考慮一些可靠的反向連結數。
4)大站優先策略
對於待抓取URL隊列中的所有網頁,根據所屬的網站進行分類。對於待下載頁面數多的網站,優先下載。這個策略也因此叫做大站優先策略。
5)其他搜索策略
一些比較常用的爬蟲搜索側率還包括Partial PageRank搜索策略(根據PageRank分值確定下一個抓取的URL)、OPIC搜索策略(也是一種重要性排序)。最後必須要指明的一點是,我們可以根據自己的需求為網頁的抓取間隔時間進行設定,這樣我們就可以確保我們基本的一些大站或者活躍的站點內容不會被漏抓。
3. 網絡爬蟲更新策略網際網路是實時變化的,具有很強的動態性。網頁更新策略主要是決定何時更新之前已經下載過的頁面。常見的更新策略又以下三種:
1)歷史參考策略
顧名思義,根據頁面以往的歷史更新數據,預測該頁面未來何時會發生變化。一般來說,是通過泊松過程進行建模進行預測。
2)用戶體驗策略
儘管搜尋引擎針對於某個查詢條件能夠返回數量巨大的結果,但是用戶往往只關注前幾頁結果。因此,抓取系統可以優先更新那些現實在查詢結果前幾頁中的網頁,而後再更新那些後面的網頁。這種更新策略也是需要用到歷史信息的。用戶體驗策略保留網頁的多個歷史版本,並且根據過去每次內容變化對搜索質量的影響,得出一個平均值,用這個值作為決定何時重新抓取的依據。
3)聚類抽樣策略
前面提到的兩種更新策略都有一個前提:需要網頁的歷史信息。這樣就存在兩個問題:第一,系統要是為每個系統保存多個版本的歷史信息,無疑增加了很多的系統負擔;第二,要是新的網頁完全沒有歷史信息,就無法確定更新策略。
這種策略認為,網頁具有很多屬性,類似屬性的網頁,可以認為其更新頻率也是類似的。要計算某一個類別網頁的更新頻率,只需要對這一類網頁抽樣,以他們的更新周期作為整個類別的更新周期。基本思路如圖:
4. 分布式抓取系統結構
一般來說,抓取系統需要面對的是整個網際網路上數以億計的網頁。單個抓取程序不可能完成這樣的任務。往往需要多個抓取程序一起來處理。一般來說抓取系統往往是一個分布式的三層結構。如圖所示:
最下一層是分布在不同地理位置的數據中心,在每個數據中心裡有若干臺抓取伺服器,而每臺抓取伺服器上可能部署了若干套爬蟲程序。這就構成了一個基本的分布式抓取系統。
對於一個數據中心內的不同抓去伺服器,協同工作的方式有幾種:
1)主從式(Master-Slave)
主從式基本結構如圖所示:
對於主從式而言,有一臺專門的Master伺服器來維護待抓取URL隊列,它負責每次將URL分發到不同的Slave伺服器,而Slave伺服器則負責實際的網頁下載工作。Master伺服器除了維護待抓取URL隊列以及分發URL之外,還要負責調解各個Slave伺服器的負載情況。以免某些Slave伺服器過於清閒或者勞累。
這種模式下,Master往往容易成為系統瓶頸。
2)對等式(Peer to Peer)
對等式的基本結構如圖所示:
在這種模式下,所有的抓取伺服器在分工上沒有不同。每一臺抓取伺服器都可以從待抓取在URL隊列中獲取URL,然後對該URL的主域名的hash值H,然後計算H mod m(其中m是伺服器的數量,以上圖為例,m為3),計算得到的數就是處理該URL的主機編號。
舉例:假設對於URL www.baidu.com,計算器hash值H=8,m=3,則H mod m=2,因此由編號為2的伺服器進行該連結的抓取。假設這時候是0號伺服器拿到這個URL,那麼它將該URL轉給伺服器2,由伺服器2進行抓取。
這種模式有一個問題,當有一臺伺服器死機或者添加新的伺服器,那麼所有URL的哈希求餘的結果就都要變化。也就是說,這種方式的擴展性不佳。針對這種情況,又有一種改進方案被提出來。這種改進的方案是一致性哈希法來確定伺服器分工。其基本結構如圖所示:
一致性哈希將URL的主域名進行哈希運算,映射為一個範圍在0-232之間的某個數。而將這個範圍平均的分配給m臺伺服器,根據URL主域名哈希運算的值所處的範圍判斷是哪臺伺服器來進行抓取。
如果某一臺伺服器出現問題,那麼本該由該伺服器負責的網頁則按照順時針順延,由下一臺伺服器進行抓取。這樣的話,及時某臺伺服器出現問題,也不會影響其他的工作。
5. 參考內容 [1] wawlian: 網絡爬蟲基本原理(一)(二);
[2] guisu: 搜尋引擎-網絡爬蟲;
[3] 《這就是搜尋引擎:核心技術詳解》。
備註:
1、如果有題目諮詢,請把題目表述清楚(備註姓名),發到公號後臺。抱歉不能一 一解答。但我們會定期整理,發送推文,以供更多朋友參與交流。
2、如果您想支持本號的運營,請點擊一下二維碼讚賞,請不要直接在公號裡發紅包。否則我們只能看到如下:
謝謝理解與支持!
交流分享、謝謝支持!