摘要:該文首先通過設(shè)計(jì)一種論壇爬蟲程序來獲取多個(gè)網(wǎng)絡(luò)論壇中的帖子,并將這些不同格式的帖子轉(zhuǎn)換成統(tǒng)一格式的XML文件,最后將這些XML文件轉(zhuǎn)為倒排文檔的索引文件,從而滿足了用戶對(duì)多論壇信息獲取的需求。
關(guān)鍵詞:論壇爬蟲;網(wǎng)絡(luò)論壇;信息聚合
中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)03-0570-03
網(wǎng)絡(luò)論壇作為一種信息交流的平臺(tái)蘊(yùn)含著大量由用戶發(fā)表的主題信息,目前互聯(lián)網(wǎng)上出現(xiàn)了越來越多的具有較高信息聚合度的網(wǎng)絡(luò)論壇,它們分散在互聯(lián)網(wǎng)的各個(gè)角落,形成了新的“信息孤島”。用戶往往需要訪問多個(gè)網(wǎng)絡(luò)論壇來獲取這些分散的信息。因此,有必要整合這些“信息孤島”中的信息,為用戶提供統(tǒng)一的訪問接口來獲取網(wǎng)絡(luò)論壇中的信息。
該文首先通過設(shè)計(jì)一種論壇爬蟲程序來獲取多個(gè)網(wǎng)絡(luò)論壇中的帖子,并將這些不同格式的帖子轉(zhuǎn)換成統(tǒng)一格式的XML文件,最后將這些XML文件轉(zhuǎn)為倒排文檔的索引文件,從而滿足了用戶對(duì)多論壇信息獲取的需求。
1網(wǎng)絡(luò)論壇分析
為了整合多個(gè)論壇中的信息就需要對(duì)多個(gè)論壇的信息進(jìn)行分析并抽象出共同的特征。目前,絕大數(shù)論壇都是由板塊和帖子構(gòu)成,即若干主題相關(guān)的帖子聚合形成板塊,若干板塊聚合構(gòu)成論壇。每個(gè)論壇中的帖子地址和板塊地址都具有相同的URL地址格式。帖子的URL地址顯示了該帖子的內(nèi)容;而板塊的URL地址顯示的是帖子標(biāo)題列表,由于一個(gè)板塊具有多個(gè)帖子,所以往往要?jiǎng)澐譃槎鄠€(gè)頁(yè)面來顯示,所以這里的板塊URL地址是第一頁(yè),通過翻頁(yè)地址可以鏈接到該板塊的下一頁(yè)。以“采購(gòu)經(jīng)理人論壇”網(wǎng)站為例,帖子的URL地址格式如下:http://bbs.purchasingbbs.com/forum.php?mod=viewthread&tid={articleId}&extra=page%3D{nextPage? Id}。其中{articleId}是帖子的數(shù)字編號(hào),{nextPageId}是翻頁(yè)地址的數(shù)字編號(hào),即當(dāng)前板塊的頁(yè)面編號(hào)。板塊的URL地址的格式如下:http://bbs.purchasingbbs.com/forum.php?mod=forumdisplay&fid={boardId}。其中{boardId}是板塊的數(shù)字編號(hào)。板塊翻頁(yè)URL地址的格式如下:
http://bbs.purchasingbbs.com/forum.php?mod=forumdisplay&fid={boardId}&page={nextPageId},這里的{boardId}是板塊的數(shù)字編號(hào)而,{nextPageId}是板塊的頁(yè)面編號(hào)。
因此,本文認(rèn)為一個(gè)論壇可以通過論壇名稱、論壇首頁(yè)地址、板塊地址格式、帖子地址格式、板塊翻頁(yè)地址格式等來描述,從論壇首頁(yè)地址出發(fā)可以找出所有與板塊地址格式相匹配的板塊地址,再?gòu)陌鍓K地址出發(fā)就可以找到所有與帖子地址格式相匹配的帖子地址,最后由帖子地址即可以得到帖子所包含的信息。
2論壇爬蟲設(shè)計(jì)
2.1論壇爬蟲分析
論壇爬蟲的主要任務(wù)是從某個(gè)論壇的首頁(yè)地址出發(fā)下載該論壇的所有帖子。它涉及到的三個(gè)實(shí)體類分別為:論壇實(shí)體、板塊實(shí)體和帖子實(shí)體,與之對(duì)應(yīng)的JavaBean對(duì)象分別為:SiteBean、BoardBean、ArticleBean,具體分析如下:
SiteBean是對(duì)論壇基本信息的封裝,其屬性包括論壇名稱(SiteName)、論壇地址(SiteUrl)、板塊地址格式(boardUrl)、帖子地址格式(articleUrl)、翻頁(yè)地址格式(nextPageUrl)。在數(shù)據(jù)庫(kù)中使用SiteInfo數(shù)據(jù)表來存放SiteBean實(shí)體類。
BoardBean是對(duì)板塊信息的封裝,其屬性包含了板塊編號(hào)(boardId)、板塊名稱(boardTitle)、板塊地址(boardUrl)、帖子列表(arti? cleList)、論壇地址(SiteUrl)。這里的articleList是一個(gè)數(shù)據(jù)類型為L(zhǎng)inkedList
ArticleBean是對(duì)帖子信息的封裝,其屬性包括帖子地址(articleUrl)、帖子標(biāo)題(articleTitle)、帖子編號(hào)(articleId)、發(fā)表時(shí)間(post? Date)、保存時(shí)間(saveDate)、帖子標(biāo)識(shí)(visitedFlag)、所屬板塊(boardUrl)、所屬論壇(SiteUrl)。其中visitedFlag字段表示帖子的處理狀態(tài),當(dāng)visitedFlag=0時(shí)表示當(dāng)前的帖子是新帖子但還未被保存;當(dāng)visitedFlag==1是表示帖子已經(jīng)被保存但是還沒有被轉(zhuǎn)化為XML文檔;當(dāng)visitedFlag==2時(shí)表示該帖子已經(jīng)加入到索引中處理完畢;當(dāng)visitedFlag==-1時(shí),表示該帖子的處理失敗。在數(shù)據(jù)庫(kù)中使用ArticleInfo數(shù)據(jù)表來存放ArticleBean實(shí)體類。
論壇爬蟲還用到兩個(gè)非常重要的工具類DownLoader類和HtmlPage類。其中DownLoader類借助于HttpClient4.0提供的Http協(xié)議訪問功能,接收一個(gè)URL地址作為輸入?yún)?shù),下載該URL地址所對(duì)應(yīng)的網(wǎng)頁(yè)文件,并將該網(wǎng)頁(yè)內(nèi)容封裝成HtmlPage類。HtmlPage類則借助于HtmlParser2.0提供的HTML文件解析功能,從HTML文件中提取出所需要的內(nèi)容。HtmlPage類的extractBoardUrl方法以SiteBean對(duì)象的boardUrl屬性作為板塊地址格式,從論壇首頁(yè)中提取出論壇的板塊地址放入BoardBean對(duì)象的articleList屬性中。
2.2抓取新帖地址
通過讀取每個(gè)板塊的首頁(yè)地址并匹配帖子URL地址格式及翻頁(yè)URL地址格式可以獲取該板塊的所有帖子地址列表。抓取帖子的具體過程如圖1所示。在抓取帖子的過程中,為了提高程序運(yùn)行的效率,在發(fā)現(xiàn)新帖后先將新帖的地址保存到ArticleInfo數(shù)據(jù)表中,并將visitedFlag設(shè)置為0,等待下載程序的進(jìn)一步處理。
圖1抓取論壇中的帖子
2.3下載貼子
下載程序的功能是將網(wǎng)絡(luò)論壇中的帖子以html文件的格式保存在本地文件系統(tǒng)中,首先從ArticleInfo數(shù)據(jù)表中讀取所有visit? edFlag==0的記錄,并封裝成ArticleBean實(shí)體類;再使用DownLoader類下載ArticleBean所對(duì)應(yīng)的網(wǎng)頁(yè)并保存到本地文件系統(tǒng)中;最后將當(dāng)前記錄的visitedFlag字段更新為1,同時(shí)更新saveDate為當(dāng)前日期。
如何存儲(chǔ)下載的帖子是關(guān)鍵點(diǎn)。一個(gè)論壇的帖子總數(shù)可以達(dá)幾十萬(wàn)之多,而文件系統(tǒng)中一個(gè)的目錄只能存儲(chǔ)一定數(shù)量的文件,所以將所有帖子都存放在同一個(gè)目錄中是不可行的。本文采用了論壇域名、板塊編號(hào)、處理日期三個(gè)級(jí)目錄結(jié)構(gòu),將帖子的存儲(chǔ)路徑設(shè)置為:
論壇地址\\板塊編號(hào)\\處理日期\\帖子編號(hào).html
以下是“采購(gòu)經(jīng)理人論壇”中某個(gè)帖子的保存路徑,從保存路徑中可以分析出該帖子屬于10號(hào)板塊,于2011年12月2日被保存。bbs.purchasingbbs.com.html\\board10\\board10_20111202\\article120.html
2.4提取內(nèi)容
提取程序的功能是將帖子的保存形式從html格式轉(zhuǎn)化為xml格式。不同論壇中的帖子格式不盡相同,但是都包括如下信息:帖子的標(biāo)題、帖子的地址、帖子的發(fā)表時(shí)間、帖子的內(nèi)容、帖子所屬的論壇。帖子在保存為html文件后將被提取程序轉(zhuǎn)換為xml文件,xml文件的結(jié)構(gòu)如下所示。
以“采購(gòu)經(jīng)理人論壇”中那個(gè)帖子為例,其對(duì)應(yīng)的xml文件保存路徑如下所示:bbs.purchasingbbs.com.html\\board10\\board10_20111202\\article120.xml
可以看出xml文件的存儲(chǔ)也采用了論壇域名、板塊編號(hào)、處理日期三級(jí)目錄結(jié)構(gòu)。
提取程序首先從數(shù)據(jù)庫(kù)中讀取所有visitedFlag=1的記錄并將這些記錄都封裝成ArticleBean實(shí)體類,再根據(jù)ArticleBean中的boardId字段、saveDate字段構(gòu)成帖子的html文件存儲(chǔ)路徑和xml文件存儲(chǔ)路徑,最后從html文件中提取相關(guān)信息到xml文件中。
檢測(cè)html文件的頁(yè)面編碼是提取程序的關(guān)鍵點(diǎn)。檢測(cè)頁(yè)面編碼的程序采用三種中文編碼:“gbk”、“gb2312”、“utf8”分別來解析html頁(yè)面,如果某種編碼解析出的html節(jié)點(diǎn)全部有效,則該編碼就是頁(yè)面編碼;如果這種策略失敗,則采用utf8編碼去解析html頁(yè)面,并查找頁(yè)面中是否存在charset屬性,并提取出charset屬性的值作為當(dāng)前頁(yè)面編碼。由于同一論壇的所有帖子的頁(yè)面編碼都相同,為了避免每次提取內(nèi)容時(shí)都檢測(cè)頁(yè)面編碼,應(yīng)該將首次檢測(cè)出的頁(yè)面編碼保存到SiteInfo數(shù)據(jù)表中。
檢測(cè)出頁(yè)面編碼后就可以借助HtmlParser2.0來解析出帖子的有效內(nèi)容、發(fā)表時(shí)間等信息。帖子的有效內(nèi)容都包含在一個(gè)具有id屬性的html標(biāo)簽中,以“采購(gòu)經(jīng)理人論壇”為例,帖子的有效內(nèi)容包含在id值為postmessage_[d]+的html元素中。預(yù)先將內(nèi)容標(biāo)識(shí)contentFlag存放在SiteInfo數(shù)據(jù)表中,在讀取論壇基本信息的時(shí)候該contentFlag被封裝到SiteBean實(shí)體類中。提取有效內(nèi)容的具體過程如圖3所示。在提取過程中將發(fā)現(xiàn)的有效內(nèi)容放入到StringBuffer緩沖區(qū)中,最后采用Dom4J開源包將StringBuffer的內(nèi)容寫入到xml文件中。
圖2提取帖子內(nèi)容
3索引文件設(shè)計(jì)
爬蟲程序生成的xml文件不能直接提供給搜索引擎使用,必須采用“倒排文檔”技術(shù)生成索引文件。Lucene是一款開源的搜索引擎開發(fā)框架,它提供了制作索引的API接口。由于Lucene自帶的分詞包對(duì)中文的支持效果不是很好,本文采用了開源的paoding分詞器,先將paoding分詞器封裝成符合Lucene要求的分詞器,然后再使用這種分詞器創(chuàng)建Lucene索引。在建立索引之前,設(shè)置索引的合并因子為50,設(shè)置文檔在內(nèi)存中的數(shù)目為100,這可以提高建立索引的效率。
考慮到論壇中的帖子是海量數(shù)據(jù),在讀取xml文件時(shí)如果直接采用遞歸的方法遍歷文件目錄,容易產(chǎn)生棧內(nèi)存溢出,因此本文根據(jù)ArticleInfo數(shù)據(jù)表中保存的boardId字段、saveDate字段生成該記錄所對(duì)應(yīng)的xml文件存儲(chǔ)路徑,根據(jù)路徑直接讀取xml文件,避免了棧內(nèi)存溢出,也提高了處理速度。
本文對(duì)多個(gè)論壇分別建立索引文件并將索引文件保存到以“論壇域名.index”的形式命名的文件目錄中。以“采購(gòu)經(jīng)理人論壇”為例,其對(duì)應(yīng)的索引文件保存在名稱為“bbs.purchasingbbs.com.index”的目錄中。搜索程序?qū)⒆x取所有以“.index”結(jié)尾的文件目錄,并采用多線程技術(shù)同時(shí)對(duì)多個(gè)論壇的索引文件進(jìn)行搜索。
4結(jié)束語(yǔ)
本文分析了互聯(lián)網(wǎng)中多個(gè)論壇所形成的“信息孤島”問題,提出了對(duì)多個(gè)論壇進(jìn)行信息聚合的必要性,同時(shí)設(shè)計(jì)了基于多個(gè)論壇的搜索引擎框架。尤其是對(duì)面向多個(gè)論壇進(jìn)行信息獲取的爬蟲程序進(jìn)行了深入的分析。
參考文獻(xiàn):
[1]陳麗君.深層網(wǎng)網(wǎng)絡(luò)爬蟲設(shè)計(jì)[J].計(jì)算機(jī)與信