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