雷才峰 田仁杰 王建鋒
摘 要:網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOFA社區中間,更經常被稱為網頁追逐者)是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。本文從網絡爬蟲的介紹出發, 闡述了網絡爬蟲的搜索策略以及相關算法,包括頁面解析,重復鏈接分析,以及多線程等等
關鍵詞:搜索引擎 網絡爬蟲
一、引言
隨著信息時代的到來,網絡飛速發展,規模無限擴大,信息量呈爆炸式的增長。網絡給人們帶來了豐富和動態的網絡信息,但是因為Internet上的信息是極其分散,無序,毫無規則。所以很難被利用。因此如何在 Internet 這個巨大的信息海洋中快速并且準確的找到有用的信息,是 Internet 用戶的所共同面對的難題。而網絡搜索引擎的出現則解決了這一困難,加強了Internet用戶定位和收集網絡信息的能力,引擎通過收集眾多網絡站點上的網絡信息來為幫助用戶更方便的尋找所需信息。而在整個搜索引擎中,網絡爬蟲起著重要的作用,它是整個搜索引擎的數據來源,爬蟲設計的好壞直接決定著整個引擎系統的內容是否豐富,信息能否得到及時的更新。
二、網絡爬蟲的種類
幾年來隨著對網絡爬蟲的不斷研究與探索,備種各樣的爬蟲層出不窮。現在常見的優秀網給爬蟲有:批量型網絡爬蟲、增量型網絡爬蟲、通用網絡爬蟲、垂直網絡爬蟲、聚焦網絡爬蟲。這幾種爬蟲功能不一,使用的領域也不同。比如谷歌、百度等大型搜索引擎都是非常典型的增量型網絡爬蟲,可以提供非常大量的數據。而如淘寶、蘇寧易購等店鋪進行爬取就需要用到批量型網絡爬蟲,它們經常會對各種內容設限或屏蔽防止外來的爬取。
三、網絡爬蟲的基本原理
網絡爬蟲是一個自動提取網頁的程序,它為搜索引擎從Internet 上下載網頁,是搜索引擎的重要組成。爬蟲從一個或若干初始網頁的URL開始,通過分析該URL的源文件,提取出新的網頁鏈接,繼而通過這些鏈接繼續尋找新的鏈接,這樣一直循環下去,直到抓取并分析完所有的網頁為止。當然這是理想狀態下爬蟲的執行過程,但是實際上要抓取Internet上所有的網頁是不可能完成的。從目前公布的數據來看,最好的搜索引擎也只不過抓取了整個 Internet40%的網頁。這有兩個原因,其一是網絡爬蟲設計時的抓取技術瓶頸造成的,無法遍歷所有的網頁,很多網頁鏈接不能從其他網頁中得到。其二是存儲技術和處理技術造成的,如果按照每個頁面的平均的大小是 20K,那么 100 億個頁面的大小就是200000G,對于現在的存儲技術來說是個挑戰。
四、 網絡爬蟲的爬行策略
網絡爬蟲的爬行策略可以分成深度優先和廣度優先。
(一)深度優先策略:其本質就是將網頁鏈接按照深度由低到高的順序依次進行爬取直到最底層為止。通俗點講就是“一條道走到黑”,當一條路完全走完后再去返回來去走另條道。這種策略作為早期最為流行的算法比較適合于垂直搜索等需要深度搜索的引擎,但又因為往往會爬取的過深會而耗時耗力產生大量的浪費。
(二)廣度優先策略:廣度優先策略又被稱為寬度優先策略。其原理就是從個初始點出發,將所有檢測到的路徑全部都訪間一遍,每當全部路徑都訪問結束卻沒有發現目標時,那么就會把所有走兩步可以到達的位置全部訪問一遍。如果任然沒有發現目標,就以此類推將所有走三步可以達到的位置全部訪問一遍。這種方法聽起來非常的笨,而且極為的耗時,但可以保證一定能找到一條最短路徑。
五、爬蟲的具體實現
(一)基本流程。
如果是第一次運行,爬蟲根據編碼過程中給定的起始網頁,開始分析網頁源文件,把分析出來的鏈接放進待爬取隊列,把已經處理過的原始網頁放進已爬行隊列,并根據網頁鏈接在哈希表中添加一個新元素,然后各個工作線程從待爬行
隊列中取出鏈接繼續分析,提取鏈接,把提取出的新鏈接與哈希表中已存在的元素進行對比,如果已在哈希表中存在,則放棄該鏈接,如果不存在,則在哈希表中生成一個新元素,并且把該鏈接放入待爬行隊列,然后工作線程繼續取出鏈接進行爬行這樣一直循環下去,直到滿足系統停止條件,如果系統運行期間人為的關閉了系統,則系統會自動在關閉時把相關記錄保存到文本文件中。如果系統不是第一次運行,則在啟動系統后,系統不是分析編碼過程中指定的起始網頁,而是先讀取保存在文本文件中的信息,然后生成和上一次運行時同樣的哈希表,待爬行隊列,已爬行隊列,然后從待爬行對列中取出鏈接執行。
(二)爬蟲主要數據結構。
1. CHashTable類:這個類根據一定的算法為每一個鏈接(鏈接對應的網址)生成一個唯一對應的數字,然后把這個數字作為該鏈接在哈希表中的位置,并把該位置的值設置為 1,表示該位置已經有一個鏈接對應了。當有新的鏈接要放入哈希表中時,則只需檢查新鏈接所對應的哈希表中的位置的值,如果為 0 則表示該鏈接以前未出現,如果為 1則表示是重復鏈接,不需要處理了。
2. CURLParse類:該類主要負責得到鏈接的源文件,并從中提取出源文件中的所有鏈接,然后把不重復的鏈接放入到待爬行隊列中去,供工作線程使用。在提取源文件鏈接的過程中,本系統沒有使用正則表達式,而是直接利用 CString 類來尋找鏈接,個人覺得這樣操作的準確性更高。由于提取出來的鏈接很多都不完整,而是相對路徑,因此,還需要對此類鏈接進行一些操作,使其變成完整路徑后才能放入待爬行隊列。
3.CURLQueue 類:該類用來存儲待爬行鏈接和已爬行鏈接,并提供了一些可以操作隊列的接口以及一些返回隊列相關信息的接口。
4. URLStruct 結構體:該結構體用來控制系統的執行層級。如果某個鏈接的層級為 1,則由它分析出的鏈接的層級為 2。當鏈接的層級大于系統設定的層級時,就不對此鏈接做任何處理,既不從該鏈接中提取新的鏈接。
五、系統運行
操作系統Windows7及以上。但是根據實際使用情況,建議使用Windows10。因為Windows10做為目前主流的操作系統具有更好的服務器性能、更強的安全性、更輕的管理工作負擔。
參考文獻
[1] 孟時,王彥,larbin網絡爬蟲的體系結構[J]. 電腦學習,2010
[2] 高波,Linux網絡編程[M]. 程序設計2000
[3] 王芳,陳海建 深入解析Web主題爬蟲的關鍵性原理[J]. 微型電腦應用,2011