劉鑫


摘要:本文從網絡爬蟲的基本概念、網絡爬蟲的主要作用、網絡爬蟲的各種類型和網絡爬蟲的發展方向著手進行研究。各種爬蟲的研究對于我們現如今的意義也相當重大,通過網絡爬蟲爬取的特定信息通過專業分析,可以影響著我們的生活,如經濟、健康、工作效率等方面,本文主要運用Python編寫網絡爬蟲,實現網絡爬蟲的功能。了解網絡爬蟲如何爬取信息,如何存儲所爬取的信息,從而認識其在信息檢索中的關鍵作用。
關鍵詞:網絡爬蟲;信息檢索;Python
中圖分類號:TP391.3 文獻標識碼:A 文章編號:1007-9416(2017)05-0095-03
1 緒論
當今社會,數據顯得越來越重要,以往人們也意識到數據的重要性,但是以前的情況面對浩如煙海的數據,人們往往望洋興嘆。因為以以前的數據處理能力,很難對大量的數據信息進行處理分析。隨著計算機技術的發展,數據的處理能力得到了極大的提高,尤其是近幾年開啟的云時代,讓人們迎來了大數據時代,人們在處理數據的能力得到提高的時候,生產數據的能力也得到了極大的提升,因此獲得數據,處理數據是人們提高對數據的利用的關鍵。
網絡爬蟲可以很容易的獲取互聯網上的信息,是我們獲取大量網絡上信息的高效工具,現如今有各種各樣的網絡爬蟲在以不同的方式獲取網絡上的數據,抓取網絡上有用的數據,方便人們對數據進行分析和利用。本課題對于網絡爬蟲進行研究,了解其在信息檢索中的應用,并設計簡單的網絡爬蟲,實現其功能。
2 網絡爬蟲的基本概念
網絡爬蟲(Web Crawler),又稱為網絡蜘蛛(Web Spider)或Web信息采集器,是一個自動下載網頁的計算機程序或自動化腳本,是搜索引擎的重要組成部分。網絡爬蟲通常從一個稱為種子集的URL集合開始運行,它首先將這些URL全部放入到一個有序的待爬行隊列里,按照一定的順序從中取出URL并下載所指向的頁面,分析頁面內容,提取新的URL并存入待爬行URL隊列中,如此重復上面的過程,直到URL隊列為空或滿足某個爬行終止條件,從而遍歷Web。該過程稱為網絡爬行(Web Crawling)[1]。
對于網絡爬蟲,基本的工作流程首先要有一個初始的URL,這個URL可以是一開始自己確定好,也可以是由用戶輸入獲得,然后通過URL獲取到網頁的信息,接著抓取網頁內的相關URL,對于滿足條件的信息進行抓取,直到所有的條件滿足才結束爬取的過程。當然,這只是對于網絡爬蟲大概的一個爬取過程,對于不同的網絡爬蟲來說,爬取的過程是不同的,但是他們都需要有一個URL,然后還有過濾的條件,以及存儲所抓取到的信息的過程。
3 網絡爬蟲的類型
網絡爬蟲根據不同的應用,爬蟲系統在許多方面也存在著不同的差異,按照系統結構和實現技術,我們可以將網絡爬蟲分為以下幾類:通用型網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。當然,實際上的網絡爬蟲不會是單一的技術實現,通常是由多種網絡爬蟲技術結合而成[2]。
3.1 通用網絡爬蟲
通用網絡爬蟲通常用于搜索引擎,它能從一些種子URL爬取大量網站,甚至是整個Web,僅僅受限于時間或者其他方面的限制,它的邏輯相比于其他提取規則的復雜的網絡爬蟲較為簡單,但是其作用不可小覷。它主要用于門戶站點搜索引擎和為大型的Web服務提供商采集數據。由于商業原因,這方面性能優秀爬蟲的技術細節很少披露,但是此類的網絡爬蟲爬行的范圍和數量巨大,并且其爬行的速度快,存儲空間比較大。它們通常采用并行的方式,對爬行頁面的順序要求比較低,但是由于要刷新的頁面很多,很長時間頁面才能刷新一次。雖然其有一定缺陷,但是通用爬蟲適用于搜索引擎,有比較強的應用價值,其結構如圖1所示。
通用網絡爬蟲通常會采取一些爬行策略來提高爬行效率,如:深度優先策略、廣度優先策略、最佳優先策略等。
(1)深度優先策略。深度優先策略所采取主要方法是按照由低到高的順序,它首先從起始網頁中的URL選擇一個進入,然后對這個網頁中的URL進行分析,接著再選擇其中的一個URL進入,就像這樣不斷的層層深入,一個接著一個鏈接抓取,直到沒有鏈接,不能深入為止。當一個分支爬取完后爬蟲會返回上個分支繼續爬取未爬取的鏈接,直到所有的鏈接遍歷完成后,這時的爬行任務才算結束。其實,深度優先策略設計較為簡單,但是若其爬取較深的站點時會造成資源的大量浪費,而且隨著鏈接的深入,鏈接自身的價值往往較低,所有相較于其它兩種策略,通常這種策略很少被用到。(2)廣度優先策略。廣度優先策略是指在爬蟲爬取的過程中先完成當前頁的所有爬取工作再進入下一層進行爬取,等下一層的爬取工作結束后再逐步深入進行爬取。此策略能控制爬行深度,避免了遇到一個無窮深的分支無法結束爬取浪費資源的情況。廣度優先策略通常和網頁過濾技術結合使用,先通過廣度優先策略抓取網頁,然后過濾掉無關的網頁。但是此策略也有缺點,當抓取的網頁過多時有許多無關的網頁也會被下載并且過濾,影響效率,并且此策略要爬取目錄較深的網頁時,需要耗費大量時間。(3)最佳優先策略。最佳優先策略是先按照一定的網頁分析算法進行分析,預選出幾個和需求相似度高或者主題相近的URL進行爬取,它只爬取經過網頁分析算法認為“有用”的URL,這種算法可以節約大量資源,改善了前兩種策略的不足,但是此策略也有所不足,由于網頁分析算法不夠精確,所以有可能忽略大量相關的網頁,所以需要結合具體的應用改善此策略。
3.2 聚焦網絡爬蟲
傳統的網絡爬蟲通常被設計成盡可能多的覆蓋網絡,對于需要爬取頁面的順序和爬取網頁主題是否相關關注度不是很大。聚焦網絡爬蟲解決了這一問題,它定向爬取與主題相關的頁面,有選擇的訪問互聯網上的網頁和相關鏈接,極大的節約了資源和時間,適用于特定人員對特定特定領域信息獲取的需求。endprint
聚焦網絡爬蟲需要解決幾個問題,如:如何對目標網頁進行描述,如何對網頁和數據進行分析和過濾,還有就是對URL的搜索和排序策略,為了解決以上問題,聚焦網絡爬蟲有以下幾種實現策略:
(1)基于內容評價的爬行策略。它將用戶輸入的查詢詞作為主題,將文本相似度的計算方法引入到網絡爬蟲中,它爬取包含用戶輸入查詢詞的頁面,但是不能判斷所抓取的頁面與主題關系的相關程度的高低后來有人利用空間向量模型計算和頁面主題的相關程度,改善了這一缺點;(2)基于鏈接結構評價的爬行策略。此爬行策略訪問網頁中的鏈接,它通過HITS方法對網頁中的鏈接進行評估,并按照一定的方法決定鏈接的訪問順序,還有的一種評估方法是通過PageRank算法,比較PageRank的值對網頁中的鏈接進行排序訪問;(3)基于增強學習的爬行策略。此策略是將增強學習引入聚焦爬蟲,利用貝葉斯分類器講網頁中的超鏈接按文本和超鏈接文本進行分類,計算出鏈接的重要性,根據這個決定鏈接的訪問順序;(4)基于語境圖的爬行策略。M.Diligenti.[3]等人提出了通過建立語境圖(Context Graphs)學習網頁之間的相關度,從而訓練一個機器學習系統,通過這個機器學習系統可以計算當前頁面到相關的網頁距離,距離越近的的網頁鏈接優先。
3.3 增量式網絡爬蟲
增量式網絡爬蟲(Incremental Web Crawler)是指對已下載網頁采取增量式更新,為保證爬取的網頁都是盡可能新的網頁,所以此爬蟲只爬取新產生或者已經發生變化的網頁。與周期性爬行和刷新頁面的網絡爬蟲對比,增量式爬蟲只在網頁新產生或者發生變化的頁面才進行爬取,因而減少了數據的下載,節約了時間和空間等各種資源,但是其爬行的算法相較而言更復雜而且實現難度大大增加[4]。
增量式爬蟲主要是為了保證本地爬取到的網頁為最新網頁,并提高本地頁面的質量,為了達到這兩點要求,我們要做到以下幾種方法:
(1)統一更新:爬蟲需以相同的頻率訪問所有網頁,且不考慮網頁的改變頻率;(2)個體更新:爬蟲需根據個體網頁的改變頻率來重新訪問各頁面;(3)基于分類的更新:爬蟲根據網頁改變頻率將網頁分為更新較快和較慢的網頁子集,然后以不同的訪問頻率對這兩類網頁進行訪問。
4 系統分析
本課題所做的是一個爬取百度貼吧內容的網絡爬蟲,主要用urllib2模塊編寫爬蟲,還有其他爬蟲用requests模塊編寫,進行對比,現在主要談爬取百度貼吧的網絡爬蟲,通過獲得一個初始URL,頁面爬行模塊在互聯網上抓取網頁,經過分析模塊將抓取的頁面放入頁面庫中,并且過濾頁面中的超鏈接放入URL隊列,從而進行下一輪的頁面抓取。對于所需要編寫的網絡爬蟲先要得到一個URL,然后通過URL抓取頁面,接著對頁面內容進行分析,滿足過濾條件的(即正則表達式)的存入頁面庫,不滿足的接著爬取,直到相關的URL爬取完畢,如流程圖2所示。
對于網絡爬蟲爬取貼吧的內容需要有爬蟲自動抓取,但是初始的URL要由人為定義,并且對于抓取到的內容要進行過濾,獲得自己需要的內容,剔除那些不需要的內容,將過濾后所得的需要的內容存儲起來。這些只是最基本的功能,如果能夠進一步完善人機交互的話,會使得本課題更加完善,如做出一個界面友好的前端等。
由于貼吧的信息容量大小不確定,所以此網絡爬蟲的工作量也挺難確定,而且還要對爬取的內容進行過濾,取得想要爬取的信息,而且只是在個人的筆記本電腦上運行網絡爬蟲的程序,這樣有可能降低爬行的效率。但是對于本課題來說,我們編寫的網絡爬蟲比較小,在普通的個人筆記本電腦足以運行,完全不影響運行的效率。此外,我們還可以通過改變網絡爬蟲的爬行策略來提高網絡爬蟲的運行效率。對于貼吧的網絡爬蟲來說,通常貼吧的基礎架構變動不是很大,所以不用擔心因為網站的改變,網絡爬蟲不能使用。此外這個爬蟲經過很多人試驗過,功能是能夠實現的,還有,這個網絡爬蟲是由Python語言編寫的,Python語言具有強大而且豐富的庫,對代碼的可用性和可靠性提供了強有力的保障,所以此網絡爬蟲在可靠性和可用性的需求也是滿足的[5]。
對于本課題,主要研究了貼吧爬蟲的爬取過程,對于以后可能還要研究爬取其他信息的網絡爬蟲,此外對于網絡爬蟲也要求有良好的用戶體驗,最好能增加一點用戶界面的友好性,還有對于不同爬行策略的網絡爬蟲的性能進行對比,從而編寫出目的性更強,性能更強的高效的網絡爬蟲,此外我們還應當考慮對于網絡爬蟲爬取到的信息處理問題等。
5 系統設計
5.1 抓取貼吧信息爬蟲
網絡爬蟲主要是爬取互聯網上的網頁信息,獲得需求的目標信息。對于這個貼吧的網絡爬蟲要包括的模塊有頁面爬行模塊、頁面分析模塊、頁面過濾模塊、還有頁面數據的保存模塊。
5.2 抓取貼吧圖片爬蟲
對于貼吧的圖片爬取,我設計的比較簡單,功能模塊因為爬取貼吧信息的網絡爬蟲都有,也包括頁面爬行模塊、頁面分析模塊、頁面過濾模塊、還有頁面數據的保存模塊
5.3 詳細設計
對于貼吧的網絡爬蟲來說,首先要有一個URL,此次做的網絡爬蟲初始的URL前半部分是http://tieba.baidu.com/p/,這部分內容針對的是百度貼吧,由于百度貼吧的內容比較多,分類也煩雜,此時我們要求用戶輸入貼吧的頁碼,如3138733512,接著網絡爬蟲開始運行。對于百度貼吧,如果我們只爬取樓主發表的信息所以我們需要把樓主的信息放入類的初始化上,即init方法,除此之外我們還要將貼吧中比較重要的帖子頁碼這一參數放入此方法中。通過對網頁源代碼的分析,我們發現百度貼吧的每一層的主要內容都在標簽
里面,因此我們采用的正則表達式來實現。 查看運行結果我們發現除了我們需要爬取的樓層內容之外,還包含了大量的換行符和圖片符,因此我們需要對所抓取的內容進行處理,將這些沒用的標簽去除掉,從而得到我們真正想要的純正的信息[6]。endprint針對此類情況,我們編寫一個Tool類,在它的里面定義一個替換各種標簽的方法replace,其中也定義了幾個正則表達式,re.sub方法對抓取的信息進行匹配替換處理,在代碼運行后,我們需要寫入需要爬行貼吧的具體URL,然后會讓我們選擇是否只爬取樓主的發表信息,接著會選擇是否寫入樓層信息,當選擇完畢后,爬蟲開始爬取所需要的信息并寫入文件,運行完成后會生成一個TXT文件,上面有所需要抓取的信息。
6 結語
對于網絡爬蟲的發展主要要看信息檢索的發展方向,這些可以從國內外的搜索引擎哪里看出一些端倪,伴隨著大數據,云計算的浪潮,網絡爬蟲肯定會得到進一步的發展,對于信息爬取的效率也越來越高,不僅僅是信息爬取的速提高,而且信息爬取的準確性也會提高,而人們通過對于這些爬取下來的信息進行分析,會讓這些信息充分發揮其作用。網絡爬蟲的設計將來會越來越智能化,不僅僅能高效的爬取需要爬取的信息,還能智能化的預測爬取相關需要的信息,如果這一功能將來得到實現,運用到智能機器人的身上,將會使機器人更趨于人類的思考方式。
參考文獻
[1]張海藩,袁勤勇,李曄.軟件工程導論[M].北京:清華大學出版社,2010.
[2][美]Justin Seitz 著.孫松柏,李聰,潤秋譯.Python黑帽子-黑客與滲透測試編程之道[M].北京:電子工業出版社,2015.
[3]M.Diligenti.,F.Coetzee, S.Lawtence, et al.F0cused crawling using context graphs[C].In Proceedings of 26th International Confer-ence on Very Large Database,Cairo,Egypt.2000.
[4][美]Justin Seitz 著.丁赟卿,譯.Python灰帽子-黑客與逆向工程師的Python編程之道[M].北京:電子工業出版社,2011.
[5]Mark Lutz著.鄒曉,瞿喬.任發科譯.Python編程(上下兩冊)[M].北京:中國電力出版社,2015.
[6]羅剛,王振東,著.自己動手寫網絡爬蟲[M].北京:清華大學出版社,2010.endprint