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