王國慶 高紅梅 黃法錦 白瑪旺久 西藏大學(xué)信息科學(xué)技術(shù)學(xué)院 (西藏 拉薩850000)
通過調(diào)查研究發(fā)現(xiàn),在西藏自治區(qū)外,大部分人對西藏的物質(zhì)文化和人民生活一知半解。造成此種現(xiàn)象的原因在于獲取西藏信息的渠道太少,人們對西藏的看法與實(shí)際情況存在偏差。但隨著互聯(lián)網(wǎng)的迅猛發(fā)展,爬蟲技術(shù)的日益成熟,通過對西藏主流媒體的爬取來獲取所需要的新聞,不僅能改變外界對于西藏的認(rèn)知和看法,而且有助于向區(qū)外展示和發(fā)揚(yáng)西藏文化,能夠讓人們更加清楚的了解和認(rèn)識到西藏人民多姿多彩的物質(zhì)文化生活。
Maven 是一個(gè)針對Java 開發(fā)項(xiàng)目的管理工具,能夠管理項(xiàng)目所依賴的jar 包。它以Jelly 作為自己的腳本語言。包含了一個(gè)項(xiàng)目對象模型(POM),一組標(biāo)準(zhǔn)集合,一個(gè)項(xiàng)目生命周期,一個(gè)依賴管理系統(tǒng)和用來定義在生命周期階段中插件目標(biāo)的邏輯。
WebMagic 是一個(gè)簡單靈活的Java 爬蟲框架, WebMagic 主要包括兩個(gè)包,分別是核心包和擴(kuò)展包。其中核心包(webmagic-core)包含爬蟲基本模塊和基本抽取器,而擴(kuò)展包(webmagic-extension)則提供一些方便編寫爬蟲的工具。同時(shí)內(nèi)置了一些常用組件,便于爬蟲開發(fā)。
WebMagic 是 由Downloader、PageProcessor、Scheduler、Pipeline 四個(gè)組件構(gòu)成的。而Spider 則將四大組件組織起來。
用 于 數(shù) 據(jù) 流 轉(zhuǎn) 的 對 象:(1)Request: Request 是URL 地址 的 封 裝 層,實(shí) 現(xiàn) 了pageprocessor 和Downloader 交 互,是pageprocessor 控制Downloader 的唯一途徑。(2)Page:Page 代表Downloader下載的界面,可以是HTML、JSON或其他文本格式等。(3)Resultitems:Resultitems 負(fù)責(zé)存儲由pageprocessor 處理的結(jié)果以供Pipeline 使用。
WebMagic 總體架構(gòu)如圖1 所示。
圖2 信息爬取操作流程
如果使用WebMagic 框架來進(jìn)行爬蟲的構(gòu)建,首先需要借助Maven 來創(chuàng)建WebMagic 項(xiàng)目,其次則是在項(xiàng)目的pom.xml 配置文件中添加對象的依賴。
對于通用的網(wǎng)頁,Downloader 組件可通過URL 地址直接獲取網(wǎng)頁信息,具體則是通過超鏈接得到對應(yīng)的網(wǎng)頁,然后按照所需要的數(shù)據(jù)字段進(jìn)行抽取,將獲得的字段為空的數(shù)據(jù)舍棄,將所獲得的完整的數(shù)據(jù)存儲到MySQL 數(shù)據(jù)庫中。循環(huán)重試機(jī)制會把下載失敗的URL 再次放在隊(duì)尾進(jìn)行重試,直到超過所設(shè)置的重試次數(shù)為止,循環(huán)重試機(jī)制和設(shè)置重試次數(shù)可以有效解決因?yàn)槟承┚W(wǎng)絡(luò)原因而漏抓頁面的問題。
PageProcessor 組件負(fù)責(zé)解析頁面,抽取有用的信息,以及發(fā)現(xiàn)新的鏈接。它可以根據(jù)用戶的需求來定制所需要的PageProcessor。其定制的功能主要分為三大部分:
(1)對爬蟲的配置,包括:配置帶爬取網(wǎng)站的編碼、Http 頭、超時(shí)時(shí)間、重試策略、代理等信息。
(2)爬蟲最為重要的部分則是頁面元素的抽取,對于已經(jīng)下載的頁面,主要采取三種抽取方式,分別為CSS 選擇器、Xpath 和正則表達(dá)式。代碼實(shí)現(xiàn):
page.putField("div",page.getHtml().css("div1.headline h1").all());
//以css 抽取方式抽取div 標(biāo)簽下class 為headline 中的h1標(biāo)簽。
page.putField("div2",page.getHtml().xpath("http://div[@id=qds_boxb1]/ul/li/a"));//以Xpath 抽取方式抽取div 標(biāo)簽下的id 為qds_boxb1 下的a 標(biāo)簽。
Page.putField(key: "div3",page.getHtml().css(selector:"div#demo1 li").Regex(".*中國特色社會主義.*").all());
//css 和正則表達(dá)式抽取方式混合使用來抽取。
(3)獲取鏈接則是第三個(gè)需要解決的問題,應(yīng)采用適合的方法來篩選出所需要的鏈接并將其加入到待抓取的隊(duì)列中。
page.addTargetRequests(page.getHtml().css("div.jdyw").links().all()); //獲取class 為jdyw下的URL
page.putField("url",page.getHtml().css("div.tbig_title h1").all());
//獲取URL 中class 為tbig_title下h1 標(biāo)簽中的內(nèi)容。
數(shù)據(jù)的抓取過程中需要對已經(jīng)抓取的、重復(fù)的URL 隊(duì)列進(jìn)行管理,Scheduler 組件負(fù)責(zé)管理待抓取的URL,以及一些去重的工作。URL 有二種去重方式,一是HashSet,使用Java 中的HashSet不能重復(fù)的特點(diǎn)去重,優(yōu)點(diǎn)是容易理解,使用方便。缺點(diǎn)是占用內(nèi)存大,性能較低。二是布隆過濾器,使用布隆過濾器也可以實(shí)現(xiàn)去重,優(yōu)點(diǎn)是占用的內(nèi)存要比使用HashSet 要小的多,也適合大量數(shù)據(jù)的去重操作。缺點(diǎn)是有誤判的可能。除非項(xiàng)目有特殊需求,否則無需定制Scheduler。
Pipeline 組件負(fù)責(zé)抽取結(jié)果的處理,包括計(jì)算、持久化到文件、數(shù)據(jù)庫等。采用Pipeline 來處理抽取結(jié)果,有兩個(gè)重要的原因:(1)頁面抽取與后處理相分離,分離這兩個(gè)階段使得模塊化結(jié)構(gòu)更加明顯,代碼結(jié)構(gòu)更加清晰。(2)Pipeline 的功能相對固定,更易做成通用組件。WebMagic 默認(rèn)提供了“輸出到控制臺”和“保存到文件”兩種結(jié)果處理方案。Pipeline 定義了如何保存結(jié)果,如果要保存到指定的數(shù)據(jù)庫,則需編寫對應(yīng)的Pipeline。
即進(jìn)一步對已經(jīng)保存在MySQL 中的新聞數(shù)據(jù)進(jìn)行分析統(tǒng)計(jì),整理分類,通過使用Dreamweaver 軟件用PHP 語言來制作動態(tài)網(wǎng)頁與MySQL 相連。將所爬取到的新聞信息通過網(wǎng)頁的方式呈現(xiàn)給用戶。所爬取到的新聞將會進(jìn)行分類,用戶通過對網(wǎng)頁的訪問,以及利用關(guān)鍵字進(jìn)行檢索,將會獲取不同類別的新聞。
通過對以WebMagic 為框架構(gòu)建爬蟲,以Maven 技術(shù)管理Java 項(xiàng)目的研究,實(shí)現(xiàn)了對西藏主流媒體熱點(diǎn)新聞的爬取和存儲,在爬取過程中,可能會遇到內(nèi)部網(wǎng)絡(luò)不允許訪問外網(wǎng)的情況,這時(shí)就需要設(shè)置代理IP。有些網(wǎng)絡(luò)服務(wù)器反感爬蟲,會對請求頭做個(gè)簡單判別,直接拒絕那些明顯是由自動化程序發(fā)起的請求,為了避免自動化程序被拒絕,在請求時(shí),可以修改請求頭,讓自動化程序更像一個(gè)瀏覽器。
此爬蟲系統(tǒng)能夠使用戶更加全面的獲知和了解西藏主流媒體上的熱點(diǎn)新聞,促進(jìn)了人們對于西藏地區(qū)物質(zhì)文化與人民生活的了解,改善了人們心中對于西藏的認(rèn)知和看法。