摘? 要:網(wǎng)絡(luò)爬蟲是當(dāng)前較流行的網(wǎng)絡(luò)搜索引擎工具,其設(shè)計(jì)需要不斷優(yōu)化,研究也需要不斷深入。主題網(wǎng)絡(luò)爬蟲抓取目標(biāo)明確、抓取結(jié)果的結(jié)構(gòu)性較好,更便于進(jìn)行分析。該文報(bào)告了網(wǎng)絡(luò)爬蟲技術(shù)的現(xiàn)狀,從主題網(wǎng)絡(luò)爬蟲的基本結(jié)構(gòu)入手,對當(dāng)前主題網(wǎng)絡(luò)爬蟲主流系統(tǒng)的系統(tǒng)功能架構(gòu)和主要功能模塊進(jìn)行了研究,并分析了當(dāng)前主流系統(tǒng)的多線程管理模式,特別對基于Java開源框架的爬蟲系統(tǒng)的多線程進(jìn)行分析,為網(wǎng)絡(luò)爬蟲性能的提高提出更進(jìn)一步的方法。
關(guān)鍵詞:多線程;主題;網(wǎng)絡(luò)爬蟲
中圖分類號:TP391.3? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號:2096-4706(2020)07-0083-04
Research on Multi-threaded Web Crawler System Based on Theme
SONG Tingting
(Minjiang University,F(xiàn)uzhou? 350108,China)
Abstract:Web crawlers are currently popular web search engine tools,and their design needs to be constantly optimized,and research needs to be constantly deepened. Topic crawlers have clear crawling targets and better structure of crawling results,which is easier to analyze. This article reports on the current status of web crawler technology. Starting from the basic structure of the theme web crawler,the system functional architecture and main functional modules of the current mainstream system of the theme web crawler are studied,and the multi-thread management mode of the current mainstream system is analyzed. In particular,the multithreading of the crawler system based on the Java open source framework is analyzed,and a further method for improving the performance of the web crawler is proposed.
Keywords:multi-thread;theme;web crawler
0? 引? 言
隨著全球信息化的飛速發(fā)展,如何有效抓取并利用互聯(lián)網(wǎng)上海量數(shù)據(jù)中的有用信息成了重大挑戰(zhàn)。傳統(tǒng)的網(wǎng)絡(luò)爬蟲受制于帶寬、系統(tǒng)資源等多方面條件,在某限定時(shí)間內(nèi)下載數(shù)據(jù)有限、下載目標(biāo)數(shù)據(jù)不夠明確,已經(jīng)難以滿足用戶的需求,主題網(wǎng)絡(luò)爬蟲應(yīng)運(yùn)而生。
主題網(wǎng)絡(luò)爬蟲雖在國內(nèi)起步晚,但發(fā)展迅速,已經(jīng)成為當(dāng)前搜索引擎和網(wǎng)頁信息挖掘中的一個(gè)研究熱點(diǎn)。主題網(wǎng)絡(luò)爬蟲通過對整個(gè)網(wǎng)頁按主題分塊采集,再將不同塊的采集結(jié)果重新整合到一起,得以提高整個(gè)網(wǎng)頁的采集覆蓋率和頁面利用率。
本文是基于閩江學(xué)院的福建省教育廳中青年教師教育科研項(xiàng)目“基于多線程的主題網(wǎng)絡(luò)爬蟲的算法分析與性能優(yōu)化”的研究成果。筆者作為項(xiàng)目的申請人和主持人,將從以下幾個(gè)方面進(jìn)行闡述。
1? 主題網(wǎng)絡(luò)爬蟲的基本構(gòu)成
主題網(wǎng)絡(luò)爬蟲是從一個(gè)網(wǎng)站的某個(gè)頁面(通常是網(wǎng)站主頁)開始,然后有選擇地訪問互聯(lián)網(wǎng)的網(wǎng)頁,獲取信息。主題爬蟲不追求網(wǎng)絡(luò)覆蓋率,其關(guān)注點(diǎn)在于與某一主題相關(guān)的內(nèi)容。主題爬蟲是有目的、有選擇地在網(wǎng)絡(luò)中爬行,為面向該主題的用戶提供數(shù)據(jù)。主題爬蟲在抓取頁面時(shí),需要對頁面進(jìn)行主題相關(guān)性分析、過濾,保留與主題相關(guān)的鏈接,將有效網(wǎng)址加入準(zhǔn)備進(jìn)行網(wǎng)頁爬取的隊(duì)列中,然后根據(jù)確定采用的算法策略從未爬取的隊(duì)列中選擇下一個(gè)設(shè)定的URL進(jìn)行爬取,直到設(shè)定的策略執(zhí)行完結(jié)束爬取。
主題網(wǎng)絡(luò)爬蟲的基本思想是通過機(jī)器學(xué)習(xí)的方式預(yù)先建立主題模型,在爬取過程中使用主題模型來判斷當(dāng)前頁面和待抓取的下一條URL的主題相關(guān)度,保證盡可能少地采集與主題無關(guān)的頁面,保留與主題相關(guān)的網(wǎng)頁。主題爬蟲與通用爬蟲的主要區(qū)別就在于增加了判斷網(wǎng)頁內(nèi)容是否與主題相關(guān)的主題判斷模塊和不同的網(wǎng)頁搜索策略。
2? 面向主題的多線程網(wǎng)絡(luò)爬蟲系統(tǒng)介紹
2.1? 系統(tǒng)的功能架構(gòu)
如圖1所示,面向主題的多線程網(wǎng)絡(luò)爬蟲系統(tǒng)主要分為兩大功能架構(gòu)組:網(wǎng)頁抓取模塊組、前端展示模塊組。主題爬蟲系統(tǒng)的功能主要體現(xiàn)在網(wǎng)頁抓取模塊組,該模塊組內(nèi)含頁面采集、頁面分析、頁面主題相關(guān)度評價(jià)、URL管理、爬行控制和線程池六大模塊。
為了獲取關(guān)聯(lián)度較高的頁面鏈接,通常使用URL關(guān)聯(lián)模塊和主題相關(guān)度評價(jià)模塊,先通過頁面采集模塊把關(guān)聯(lián)頁面下載下來,這種方式可以盡可能地避免下載無關(guān)頁面,節(jié)省爬取時(shí)間,減少資源消耗,提高系統(tǒng)性能。網(wǎng)頁抓取模塊組的結(jié)構(gòu)示意圖如圖2所示。
2.2? 系統(tǒng)功能模塊
(1)爬行控制模塊。該模塊是整個(gè)系統(tǒng)的核心,協(xié)調(diào)調(diào)度其他模塊的運(yùn)行。通過該模塊可以調(diào)用線程池模塊,將多線程應(yīng)用于網(wǎng)頁爬取,通過URL管理模塊解析URL,找出滿足相關(guān)度要求的鏈接并將其加入待爬取的隊(duì)列中,拋棄無法滿足相關(guān)度要求的鏈接。圖3顯示了該模塊與其他模塊之間的調(diào)度關(guān)系。
(2)頁面采集模塊。頁面采集模塊的主要任務(wù)是在爬取隊(duì)列中下載相關(guān)網(wǎng)頁,即通過HTTP協(xié)議將服務(wù)器端與URL對應(yīng)的頁面下載。其原理是首先在主程序設(shè)置一個(gè)初始的URL地址,獲取其頁面所包含的所有鏈接地址,建立待爬取隊(duì)列。判斷該隊(duì)列在非空的情況下哪些URL已被爬取,同時(shí)下載未被爬取的URL頁面,忽略已抓取的頁面,直到隊(duì)列清空。
(3)URL管理模塊。URL管理模塊的任務(wù)是初始化待抓取隊(duì)列,并對頁面內(nèi)容進(jìn)行去重處理。如果URL未被抓取就調(diào)用相關(guān)函數(shù)進(jìn)行下載,如果已被抓取則略過。循環(huán)執(zhí)行上述步驟直到待抓取隊(duì)列為空。URL管理模塊的另一個(gè)功能就是給URL隊(duì)列進(jìn)行排序,保證相關(guān)度高的URL能夠優(yōu)先被抓取。
(4)頁面分析模塊。該模塊主要任務(wù)是設(shè)置分析規(guī)則,對下載的頁面的源碼按照規(guī)則進(jìn)行解析,實(shí)現(xiàn)網(wǎng)頁文本內(nèi)容的提取。
(5)頁面主題相關(guān)度評價(jià)模塊。該模塊的主要任務(wù)是網(wǎng)頁的主題相關(guān)度計(jì)算。需要預(yù)先設(shè)置主題關(guān)鍵字及其邊界,再導(dǎo)入頁面分析模塊提取出來的文本內(nèi)容,匹配相應(yīng)算法計(jì)算文本內(nèi)容的相似度,然后把文本內(nèi)容符合主題要求的頁面寫到系統(tǒng)數(shù)據(jù)庫中,不符合的則丟棄。
(6)線程池模塊。該模塊是本文重點(diǎn)研究的對象,其主要任務(wù)是管理多線程,提高爬取性能。
3? 系統(tǒng)的多線程管理
3.1? 多線程網(wǎng)絡(luò)爬蟲
網(wǎng)絡(luò)爬蟲如果僅僅使用一個(gè)線程,那么需要花費(fèi)很多時(shí)間等待DNS服務(wù)器的響應(yīng),另外發(fā)送到服務(wù)器端的請求以及接收從服務(wù)器端返回的網(wǎng)頁數(shù)據(jù)都需要耗費(fèi)大量時(shí)間,但是等待的過程CPU卻總是空閑,嚴(yán)重浪費(fèi)了系統(tǒng)資源。單線程網(wǎng)絡(luò)爬蟲已經(jīng)被多線程模式所取代,以提升CPU利用效率,減少等待時(shí)間。
利用多線程一次可以爬取多個(gè)網(wǎng)頁,為避免多線程網(wǎng)絡(luò)爬蟲系統(tǒng)占用過多服務(wù)器資源,需要使用禮貌策略,所謂禮貌策略就是讓服務(wù)器的多數(shù)時(shí)間用于處理實(shí)際用戶的請求,而爬蟲工作會(huì)在處理請求的間隙執(zhí)行。執(zhí)行多個(gè)爬取任務(wù)通常需要在各個(gè)任務(wù)間相互協(xié)調(diào)和通信。所以多線程的程序復(fù)雜度要遠(yuǎn)遠(yuǎn)比單線程高。
多線程技術(shù)的使用提升了爬蟲效率,但是系統(tǒng)資源也將因頻繁地創(chuàng)建和銷毀線程對象而消耗。因此為解決這個(gè)問題,使用線程池技術(shù),即線程池中存在可隨時(shí)被喚醒的線程以降低創(chuàng)建線程時(shí)的資源消耗,可以改善因多線程的頻繁創(chuàng)建而引發(fā)的系統(tǒng)效率降低的問題。
3.2? 線程池的原理
線程池是根據(jù)任務(wù)需求創(chuàng)建或銷毀線程對象的,線程池通常會(huì)創(chuàng)建一批線程,這批線程為空閑等待狀態(tài)。當(dāng)一個(gè)請求進(jìn)入系統(tǒng),線程池馬上調(diào)度一個(gè)空閑狀態(tài)的線程進(jìn)行處理。但是如果長時(shí)間沒有任務(wù)請求,線程池內(nèi)的線程一直空閑等待,線程池中設(shè)定的策略會(huì)主動(dòng)把這些沒有被調(diào)用的線程銷毀,從而達(dá)到降低系統(tǒng)資源開銷的目的。反之如果線程池中的線程一直處于運(yùn)行狀態(tài),那么線程池又會(huì)創(chuàng)建更多線程等待處理新任務(wù)。線程池工作模式如圖4所示。
線程池對提高效率作用很大,使用線程池的優(yōu)點(diǎn)如下:
(1)線程池技術(shù)可以根據(jù)實(shí)際情況實(shí)時(shí)調(diào)整線程的數(shù)量,使效率大大提高,在實(shí)際使用線程池的過程中要注意:需要綜合考慮來設(shè)置合適的線程數(shù)量,線程數(shù)并不是越多越好;需要考慮多線程并發(fā)可能導(dǎo)致的各種錯(cuò)誤,避免死鎖的產(chǎn)生。
(2)線程池中的每個(gè)線程都可以復(fù)用,將創(chuàng)建和銷毀線程時(shí)導(dǎo)致的對系統(tǒng)資源過多的占用影響降至最低。
基于以上分析,所以在做相關(guān)主題爬蟲設(shè)計(jì)的時(shí)候,為提高爬蟲的性能和系統(tǒng)資源使用率,盡量要考慮使用線程池來管理多線程。
3.3? 爬蟲多線程工作流程
爬蟲多線程工作流程如圖5所示。多線程爬蟲的工作流程如下:
(1)將線程數(shù)初始設(shè)定為0;
(2)在配置文件中確定線程數(shù)量的最大值。然后程序判斷線程數(shù)是否達(dá)到該值。若達(dá)到則線程被線程池收回,結(jié)束該流程。否則繼續(xù)下一步;
(3)線程從待抓取的URL隊(duì)列中取出一個(gè)URL地址,作為頁面下載入口。如果待抓取隊(duì)列為空,該線程就終止,否則線程計(jì)數(shù)器就加1;
(4)系統(tǒng)發(fā)送HTTP異步請求,當(dāng)前線程繼續(xù)執(zhí)行爬取任務(wù),然后返回第2步判斷線程數(shù),是否繼續(xù)獲取新的URL下載。同時(shí)分配新線程,等待HTTP響應(yīng);
(5)線程接收到響應(yīng)數(shù)據(jù)后,對頁面數(shù)據(jù)進(jìn)行分析處理,把新的URL放入待抓取隊(duì)列中,線程數(shù)減1,一個(gè)爬取任務(wù)完成。
4? 基于Java的爬蟲系統(tǒng)的多線程設(shè)計(jì)
4.1? Java多線程爬蟲框架——Crawler4j
一個(gè)系統(tǒng)程序代表了一個(gè)進(jìn)程,進(jìn)程占用CPU資源運(yùn)行。一個(gè)進(jìn)程可以包含多個(gè)線程,線程是資源調(diào)度的基本單位,執(zhí)行一段程序的實(shí)質(zhì)就是在多個(gè)線程之間進(jìn)行切換,程序的不同部分由不同的線程執(zhí)行。因此當(dāng)線程池中某個(gè)線程在等待HTTP做出響應(yīng)時(shí),其他線程就進(jìn)入CPU執(zhí)行,避免資源的浪費(fèi)。
Java語言對多線程提供了很好的支持,Java的開源性決定了在眾多領(lǐng)域都有不同的Java開源框架。Crawler4j是一個(gè)開源的Java網(wǎng)絡(luò)爬蟲框架,提供一個(gè)用于抓取Web頁面的簡單接口,可以利用這個(gè)接口實(shí)現(xiàn)一個(gè)多線程的Web爬蟲。使用這個(gè)框架,可以非常簡單地在Crawler4j所提供的接口基礎(chǔ)上進(jìn)行擴(kuò)展,從而實(shí)現(xiàn)爬蟲功能。同時(shí)這個(gè)開源框架還提供了線程實(shí)時(shí)監(jiān)控功能,以便查看線程的運(yùn)行情況和數(shù)據(jù)爬取情況。因此使用Crawler4j框架接口實(shí)現(xiàn)多線程的、可自定義網(wǎng)頁抽取規(guī)則和解析規(guī)則的主題網(wǎng)絡(luò)爬蟲系統(tǒng)。
Crawler4j框架包含有三大組件,分別是Frontier、Fetcher、Parser。Frontier組件是該框架的核心,包含URL處理隊(duì)列接口,提供鏈接處理及其后續(xù)工作;Fetcher組件提供了獲取URL指定頁面內(nèi)容的接口;Parser組件提供了種子提取的接口并將其放入U(xiǎn)RL隊(duì)列中。Crawler4j框架還提供了CrawlerController線程控制器實(shí)現(xiàn)爬蟲線程的控制,當(dāng)然還包含其他一些組件。
在實(shí)際開發(fā)過程中,只需要對Crawler4j框架中的頁面解析方式和URL的訪問規(guī)則進(jìn)行修改,使其能夠按照用戶的配置進(jìn)行網(wǎng)頁抓取。系統(tǒng)采用多線程控制Crawler4j的線程控制器,能夠通過用戶的配置信息,創(chuàng)建不同的爬蟲任務(wù)。系統(tǒng)為用戶提供任務(wù)控制接口,用戶可以通過界面控制爬蟲任務(wù)的運(yùn)行情況。
主題爬蟲系統(tǒng)支持多任務(wù)同時(shí)爬取,在爬行控制模塊中設(shè)置任務(wù)控制器,管理爬取任務(wù)隊(duì)列,每個(gè)任務(wù)都可以自行設(shè)定配置參數(shù)和種子鏈接,按配置參數(shù)由CrawlerController控制器進(jìn)行調(diào)度來爬取相關(guān)數(shù)據(jù)。Crawler4j框架主要由三個(gè)類實(shí)現(xiàn)多線程管理,分別是任務(wù)管理類(TaskController)、活動(dòng)任務(wù)類(AliveTask)、活動(dòng)任務(wù)隊(duì)列類(AliveTaskQueue)。
4.2? 爬蟲線程的工作流程設(shè)計(jì)
當(dāng)線程接收到URL待爬取隊(duì)列中的鏈接地址后,通過DNS解析鏈接地址,獲取頁面信息,然后利用框架的HTMLParser類對頁面信息進(jìn)行解析,提取出頁面文本內(nèi)容、鏈接信息等,然后通過頁面分析模塊和相關(guān)度評價(jià)模塊進(jìn)行處理,判斷分析后的文本內(nèi)容是否與主題相關(guān),若頁面內(nèi)容與用戶設(shè)定主題相關(guān),則過濾該頁面中的URL,將有效的URL加入隊(duì)列,繼續(xù)抓取下一條URL,同時(shí)將當(dāng)前頁面交由另外的文本處理線程對當(dāng)前文本進(jìn)行后續(xù)處理,生成文本內(nèi)容摘要,結(jié)合內(nèi)容特征向量和摘要特征向量生成內(nèi)容語義信息和摘要語義信息,將語義信息和網(wǎng)頁信息保存至數(shù)據(jù)庫中,同時(shí)建立該頁面的全文索引。
5? 結(jié)? 論
本文詳細(xì)介紹了基于主題的多線程網(wǎng)絡(luò)爬蟲系統(tǒng)中的主要功能模塊,并詳細(xì)介紹了系統(tǒng)的多線程管理方式、原理和工作流程,并通過對Java開源框架——Crawler4j的介紹和使用,實(shí)現(xiàn)了爬蟲線程的工作流程的設(shè)計(jì)。
參考文獻(xiàn):
[1] 葛玲.基于查詢擴(kuò)展的主題爬蟲研究 [D].北京:北京工業(yè)大學(xué),2009.
[2] 孫青云,王俊峰,趙宗渠,等.一種基于模擬登錄的微博數(shù)據(jù)采集方案 [J].計(jì)算機(jī)技術(shù)與發(fā)展,2014,24(3):6-10.
[3] 陳睿嘉,康志忠,張衛(wèi)濤.基于網(wǎng)絡(luò)爬蟲的導(dǎo)航深度服務(wù)信息自動(dòng)采集 [J].測繪工程,2015,24(1):17-24.
[4] 段兵營.捜索引擎中網(wǎng)絡(luò)爬蟲的研究與實(shí)現(xiàn) [D].西安:西安電子科技大學(xué),2014.
[5] 王洪威.主題網(wǎng)絡(luò)爬蟲的分析與設(shè)計(jì) [D].北京:北京郵電大學(xué),2013.
[6] 陳千.主題網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)的研究與應(yīng)用 [D].北京:北京理工大學(xué),2015.
[7] 柴嘉斌,李廣華,李長春.主題爬蟲搜索策略的研究 [J].科技信息,2011(12):234-235.
[8] 張曉雷.面向Web挖掘的主題網(wǎng)絡(luò)爬蟲的研究與實(shí)現(xiàn) [D].西安:西安電子科技大學(xué),2012.
作者簡介:宋婷婷(1980—),女,漢族,福建福州人,講師,碩士,研究方向:網(wǎng)絡(luò)爬蟲。