部分內容參考《這就是搜尋引擎》
(一)網路爬蟲本質就是瀏覽器http請求
瀏覽器和網路爬蟲是兩種不同的網路客戶端,都以相同的方式來獲取網頁:
1、首先, 客戶端程式連線到網域名稱系統(dns)伺服器上,dns伺服器將主機 名轉換成ip 位址。
2、接下來,客戶端試著連線具有該ip位址的伺服器。伺服器上可能有多個 不同程序程式在執行,每個程序程式都在監聽網路以發現新的選接。.各個程序監聽不同的網路埠 (port). 埠是乙個l6位的數卞,用來辨識不同的服務。http請求一般預設都是80埠。
3、 一旦建立連線,客戶端向伺服器傳送乙個http請求,伺服器接收到請求後,返回響應結果給客戶端。
4、客戶端關閉該連線。
詳細了解http工作原理:網路互聯參考模型(詳解) 和apache執行機制剖析
(二)搜尋引擎爬蟲架構
瀏覽器是使用者主動操作然後完成http請求,而爬蟲需要自動完成http請求,網路爬蟲需要一套整體架構完成工作。
儘管爬蟲技術經過幾十年的發展,從整體框架上已相對成熟,但隨著網際網路 的不斷發展,也面臨著一些有挑戰性的新問題。 通用爬蟲框架如下圖:
通用爬蟲框架
通用的爬蟲框架流程:
2、將這些種子url放入待抓取url佇列中;
(三)爬蟲抓取策略
在爬蟲系統中,待抓取url佇列是很重要的一部分。待抓取url佇列中的url以什麼樣的順序排列也是乙個很重要的問題,因為這涉及到先抓取那個頁面,後抓取哪個頁面。而決定這些url排列順序的方法,叫做抓取策略。
1、 深度優先搜尋策略(順藤摸瓜)
我們使用圖的方式來說明:
我們假設網際網路就是張有向圖,圖中每個頂點代表乙個網頁。 設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可從圖中某個頂點發v 出發,訪問此頂點,然後依次從v 的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v 有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中乙個未曾被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。
以如下圖的無向圖g1為例,進行圖的深度優先搜尋:
g1搜尋過程:
2、 廣度優先搜尋策略
還是以上面的圖為例,抓取過程如下:
廣度搜尋過程:
首先訪問頁面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策略,即最佳優先搜尋策略
(四)網頁更新策略
1.歷史參考策略
顧名思義,根據頁面以往的歷史更新資料,**該頁面未來何時會發生變化。一般來說,是通過泊松過程進行建模進行**。
2.使用者體驗策略
儘管搜尋引擎針對於某個查詢條件能夠返回數量巨大的結果,但是使用者往往只關注前幾頁結果。因此,抓取系統可以優先更新那些現實在查詢結果前幾頁中的網頁,而後再更新那些後面的網頁。這種更新策略也是需要用到歷史資訊的。使用者體驗策略保留網頁的多個歷史版本,並且根據過去每次內容變化對搜尋質量的影響,得出乙個平均值,用這個值作為決定何時重新抓取的依據。
3.聚類抽樣策略
前面提到的兩種更新策略都有乙個前提:需要網頁的歷史資訊。這樣就存在兩個問題:第一,系統要是為每個系統儲存多個版本的歷史資訊,無疑增加了很多的系統負擔;第二,要是新的網頁完全沒有歷史資訊,就無法確定更新策略。
這種策略認為,網頁具有很多屬性,類似屬性的網頁,可以認為其更新頻率也是類似的。要計算某乙個類別網頁的更新頻率,只需要對這一類網頁抽樣,以他們的更新週期作為整個類別的更新週期。基本思路如圖:
(五)暗網抓取
請參考《這就是搜尋引擎》
1、查詢組合問題
2、文字框填寫問題
(六)分布式爬蟲
請參考《這就是搜尋引擎》
1、主從式分布爬蟲
但會導致瓶頸。
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(爬蟲則可以從開放式目錄dmoz抓取。
種子url一般有以下幾個字段
id url source(****) rank(pagerank值)
2、待抓取url的資料結構
(1)乙個比較小的示例爬蟲程式,可能就使用記憶體中的乙個佇列,或者是優先級別佇列進行儲存。
(2)乙個中等規模的爬蟲程式,可能使用berkelydb這種記憶體資料庫來儲存,如果記憶體中存放不下的話,還可以序列化到磁碟上。
(3)真正的大規模爬蟲系統,是通過伺服器集群來儲存已經爬取出來的url。
3、已抓取過的url的資料結構
由於visited表經常被查詢,以確認是否已經處理過。因此,visited表如果是乙個記憶體資料結構的話,可以採用hash(hashset/hashmap)來儲存。
如果儲存在資料庫中的話,可以對url列建立索引。
搜尋引擎 倒排索引基礎知識
搜尋引擎的索引 單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3 1 單詞 文件矩陣 從縱向即文件這個維度來看,每列代表文件包含了哪些單詞,比如文件1包含了詞彙1和詞彙4,而不包含其它單詞。...
搜尋引擎 倒排索引基礎知識
搜尋引擎的索引 單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3 1 單詞 文件矩陣 從縱向即文件這個維度來看,每列代表文件包含了哪些單詞,比如文件1包含了詞彙1和詞彙4,而不包含其它單詞。...
搜尋引擎 倒排索引基礎知識
單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3 1 單詞 文件矩陣 從縱向即文件這個維度來看,每列代表文件包含了哪些單詞,比如文件1包含了詞彙1和詞彙4,而不包含其它單詞。從橫向即單詞這個...