周飚
[摘 要]隨著大數(shù)據(jù)與云計算、物聯(lián)網(wǎng)、人工智能進一步融合,各行各業(yè)產(chǎn)生了海量電子化數(shù)據(jù),建立大數(shù)據(jù)應(yīng)用首要解決的問題就是采集數(shù)據(jù),其中,Apache Nutch是用于數(shù)據(jù)采集的爬蟲框架。為采集若干人才招聘網(wǎng)站職位需求數(shù)據(jù),采用MySQL數(shù)據(jù)庫進行數(shù)據(jù)存儲,采用Nutch實現(xiàn)網(wǎng)站數(shù)據(jù)采集,采用排程框架Quartz實現(xiàn)數(shù)據(jù)定時采集和更新。
[關(guān)鍵詞]Nutch;分布式;爬蟲框架;Crawler Quartz排程
doi:10.3969/j.issn.1673 - 0194.2019.18.078
[中圖分類號]TP391.1[文獻標(biāo)識碼]A[文章編號]1673-0194(2019)18-0-03
0? ? ?引 言
未來大數(shù)據(jù)產(chǎn)業(yè)發(fā)展出現(xiàn)兩大趨勢:①與云計算、人工智能等前沿創(chuàng)新技術(shù)深度融合,實現(xiàn)超大規(guī)模數(shù)據(jù)運算,智能化、自動化的海量數(shù)據(jù)分析,在短時間內(nèi)完成復(fù)雜度較高、精密度較高的信息處理;②制造業(yè)產(chǎn)品從市場規(guī)劃、設(shè)計、制造、銷售到維護整個生命周期會產(chǎn)生大量結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),形成制造業(yè)大數(shù)據(jù),為使產(chǎn)品制造全過程變得更加敏捷、精準(zhǔn)和智能,企業(yè)不斷升級制造業(yè)的大數(shù)據(jù)解決方案,助力傳統(tǒng)制造業(yè)迅速轉(zhuǎn)型與發(fā)展。
世界各國已將大數(shù)據(jù)上升為國家戰(zhàn)略,大數(shù)據(jù)在推動我國經(jīng)濟轉(zhuǎn)型升級過程中發(fā)揮著至關(guān)重要的作用。從大數(shù)據(jù)產(chǎn)業(yè)層級來看,主要分為3層,從底層到上層分別是基礎(chǔ)支撐層、數(shù)據(jù)服務(wù)層和融合應(yīng)用層。面對來自政府、工業(yè)、農(nóng)業(yè)、交通、商品交易和互聯(lián)網(wǎng)等各方面巨大的數(shù)據(jù),發(fā)展大數(shù)據(jù)應(yīng)用亟待建立起穩(wěn)定高效的數(shù)據(jù)采集和存儲的基礎(chǔ)設(shè)施。數(shù)據(jù)從哪里來,如何采集數(shù)據(jù),是首先要解決的問題。
1? ? ?網(wǎng)站數(shù)據(jù)采集
互聯(lián)網(wǎng)網(wǎng)站會產(chǎn)生大量開放的非結(jié)構(gòu)化和結(jié)構(gòu)化網(wǎng)頁數(shù)據(jù)。對于這些數(shù)據(jù),企業(yè)可以通過網(wǎng)站提供的公共API和網(wǎng)頁爬蟲從網(wǎng)站上獲取。網(wǎng)頁爬蟲適用所有可以訪問的網(wǎng)站,無論網(wǎng)站是否提供了API,都可以進行數(shù)據(jù)采集,這種方案不存在局限性。目前,常用的網(wǎng)頁爬蟲系統(tǒng)有Nutch、Crawler4j、Scrapy等框架。本文將對Nutch在網(wǎng)頁數(shù)據(jù)采集方面進行初步研究。
2? ? ?Nutch技術(shù)介紹
Apache Nutch是一個高度可擴展和可伸縮性的分布式爬蟲框架。Nutch通過分布式抓取網(wǎng)頁數(shù)據(jù),并由Hadoop支持,通過提交MapReduce任務(wù)來抓取網(wǎng)頁數(shù)據(jù),可以將網(wǎng)頁數(shù)據(jù)存儲在HDFS分布式文件系統(tǒng)中。Nutch可以進行分布式多任務(wù)的數(shù)據(jù)爬取、存儲和索引。由于多個計算機并行做爬取任務(wù),Nutch可以充分利用多個計算機的計算資源和存儲能力,大大提高系統(tǒng)爬取數(shù)據(jù)能力。Nutch在搜索引擎中負責(zé)爬取網(wǎng)頁,同時自動維護網(wǎng)頁的URL信息,例如,相同網(wǎng)頁去重、網(wǎng)頁定時更新、網(wǎng)頁重定向。Nutch采用了MapReduce分布式爬取和解析,具有良好的水平擴展性。Nutch 2.x引入了Gora作為存儲抽象層,從而支持各種傳統(tǒng)SQL數(shù)據(jù)庫和NoSQL數(shù)據(jù)庫,如MySQL、HBase、Cassandra等。
只看Apache Nutch單任務(wù)網(wǎng)頁爬蟲,從總體上分為3個主要部分,即爬行、索引和搜索,各部分之間的協(xié)作關(guān)系是Nutch根據(jù)目標(biāo)網(wǎng)址列表及層級訪問網(wǎng)站,抓取內(nèi)容并進行存儲,然后對這些內(nèi)容建立索引,在索引的基礎(chǔ)上完成所需數(shù)據(jù)的搜索。Nutch基本運行流程包含5個步驟:①將起始URL集合注入Nutch系統(tǒng)中;②生成片段文件,其中,包含將要抓取的URL地址,然后根據(jù)URL地址在互聯(lián)網(wǎng)上抓取相應(yīng)內(nèi)容;③解析所抓取到的網(wǎng)頁,并分析其中的文本和數(shù)據(jù);④根據(jù)新抓取網(wǎng)頁中的URL集合更新起始URL集合,并再次進行抓取;⑤對抓取到的網(wǎng)頁內(nèi)容建立索引,生成索引文件存放在系統(tǒng)中。從用戶角度來看,Nutch提供了一個基于Tomcat的查詢應(yīng)用程序,允許用戶輸入詞條,Nutch以Lucene為搜索引擎在索引文件中進行搜索,并將相應(yīng)的結(jié)果返回給用戶。
3? ? ?案例及解決方案研究
本文基于Nutch2.1爬蟲框架結(jié)合其他技術(shù)來研究如何采集各個人才招聘網(wǎng)站職位需求數(shù)據(jù),為中、高等職業(yè)院校主管部門在專業(yè)設(shè)置、招生就業(yè)方面提供數(shù)據(jù)分析依據(jù)。
(1)建立Eclipse開發(fā)環(huán)境下Nutch+MySQL二次開發(fā)環(huán)境。下載Nutch 2.2.1源碼,修改相關(guān)配置文件,利用ant工具構(gòu)建Eclipse二次開發(fā)項目,在Eclipse開發(fā)環(huán)境中導(dǎo)入該項目。創(chuàng)建Java Maven項目,在pom.xml文件中配置好Nutch,依賴各個jar包并自動下載。
(2)安裝MySQL數(shù)據(jù)庫服務(wù)器,創(chuàng)建后臺數(shù)據(jù)庫及webpage表。
(3)配置Nutch,使其采用MySQL關(guān)系型數(shù)據(jù)庫存儲數(shù)據(jù)。修改/ivy/ivy.xml文件的代碼如下。
(4)項目數(shù)據(jù)庫連接配置。修改gora.properties,以連接到指定的后臺數(shù)據(jù)庫,
ora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver
gora.sqlstore.jdbc.url=jdbc:mysql://數(shù)據(jù)庫服務(wù)器IP地址:端口/后臺數(shù)據(jù)庫名
gora.sqlstore.jdbc.user=XXXX(連接數(shù)據(jù)庫的用戶名)
gora.sqlstore.jdbc.password=******(連接數(shù)據(jù)庫的密碼)
(5)配置nutch-site.xml文件,添加6個property。第1個property的name為http.agent.name,value為YourNutchSpider;第2個property的name為http.accept.language,value為ja-jp, en-us,en-gb,en;q=0.7,*;q=0.3;第3個property的name為storage.data.store.class,value為org.apache.gora.sql.store.SqlStore;第4個property的name為parser.character.encoding.default,value為utf-8;第5個property的name為plugin.includes,value為protocol-http|urlfilter-regex|parse-(html|tika)|index-(basic|anchor)|urlnormalizer-(pass|regex|basic)|scoring-opic;第6個property的name為generate.batch.id,value為*。
配置格式如下所示:
(6)配置Nutch要訪問的種子網(wǎng)站域名。在項目根目錄下,建立urls目錄,然后在目錄下建立一個文本文件,文件名為seed.txt,內(nèi)容是爬取的人才網(wǎng)站域名。
(7)調(diào)用Nutch API。Nutch本身提供了Crawler類來執(zhí)行數(shù)據(jù)爬蟲的命令??梢允褂肏adoop的ToolRunner來運行Crawl工具,自定義Java類MyCrawler.java,在main方法中調(diào)用ToolRunner.run方法運行Crawler,主要代碼如下。
public class MyCrawler {
public static void main(String[] args) {
String crawlArg = "urls -depth 1";
try {
ToolRunner.run(NutchConfiguration.create(), new Crawler(), tokenize(crawlArg));
} catch (Exception e) {
e.printStackTrace();
return;
}
}
public static String[] tokenize(String str) {
StringTokenizer tok = new StringTokenizer(str);
String tokens[] = new String[tok.countTokens()];
int i = 0;
while (tok.hasMoreTokens()) {
tokens[i] = tok.nextToken();
i++;
}
return tokens;
}
}
(8)為了解決定時采集最新人才招聘網(wǎng)站的職位需求數(shù)據(jù),引入java排程框架Quartz。將上面實現(xiàn)網(wǎng)頁抓取的代碼封裝進Job接口的實現(xiàn)類CrawJob,再利用Quartz排程API實現(xiàn)定時執(zhí)行數(shù)據(jù)采集,主要代碼如下。
//1、創(chuàng)建Scheduler的工廠
SchedulerFactory sf = new StdSchedulerFactory();
//2、從工廠中獲取調(diào)度器實例
Scheduler scheduler = sf.getScheduler();
//3、創(chuàng)建JobDetail
JobDetail jobDetail = JobBuilder.newJob(CrawlJob.class)
.withDescription("This is a crawl web data job by nutch to DB.")
.withIdentity("crawlJob", "crawGroup")
.build();
//4、創(chuàng)建Trigger
Trigger t = TriggerBuilder.newTrigger()
.withDescription("This is a trigger of crawl web data.")
.withIdentity("crawlTrigger", "crawlTriggerGroup")
.startAt(startTime)
.withSchedule(CronScheduleBuilder.cronSchedule("0 */1 * * * ?")).build();
//5、注冊任務(wù)和定時器
scheduler.scheduleJob(jobDetail, t);
scheduler.scheduleJob(historyJobDetail, historyTrigger);
//6、啟動調(diào)度器
scheduler.start();
上述代碼實現(xiàn)每隔1分鐘采集一次人才網(wǎng)站的最新數(shù)據(jù)。
4? ? ?為數(shù)據(jù)分析做準(zhǔn)備
Nutch將采集到的數(shù)據(jù)存儲到webpage數(shù)據(jù)表中,可根據(jù)數(shù)據(jù)分析需要再定義相關(guān)數(shù)據(jù)表,每隔一段時間將webpage中的數(shù)據(jù)進行解析,存入數(shù)據(jù)表中??紤]性能需要,定時清除webpage中的歷史數(shù)據(jù)。存入相關(guān)數(shù)據(jù)表中的結(jié)構(gòu)化數(shù)據(jù)為數(shù)據(jù)分析解決了數(shù)據(jù)從哪里來的問題。經(jīng)過數(shù)據(jù)采集、解析和結(jié)構(gòu)化,接著可以根據(jù)業(yè)務(wù)需求進行數(shù)據(jù)分析和統(tǒng)計,并可借助圖形展現(xiàn)框架將這些定義良好的有價值的數(shù)據(jù)進行可視化展現(xiàn)。
5? ? ?下一步研究方向
以上是以MySQL數(shù)據(jù)庫作為數(shù)據(jù)存儲來研究Nutch數(shù)據(jù)采集,下一步將MySqL關(guān)系型數(shù)據(jù)庫存儲轉(zhuǎn)換成Hoodap分布式存儲,利用Nutch相關(guān)技術(shù)建立爬蟲集群,進一步研究Nutch的分布式數(shù)據(jù)采集,為更大規(guī)模、更快響應(yīng)數(shù)據(jù)采集做準(zhǔn)備。把Nutch與Hoodap整合起來,Nutch負責(zé)抓取數(shù)據(jù),Hoodap負責(zé)存儲數(shù)據(jù),真正建立大數(shù)據(jù)應(yīng)用平臺,結(jié)合全文檢索引擎Lucene/Solr實現(xiàn)數(shù)據(jù)實時索引和快速檢索。
主要參考文獻
[1]朱應(yīng)堅,陳雪梅,向勇.基于Nutch的分布式電商數(shù)據(jù)采集數(shù)據(jù)研究[J].廣東通信技術(shù),2015(10).
[2]孫立偉,何國輝,吳禮發(fā).網(wǎng)絡(luò)爬蟲技術(shù)的研究[J].電腦知識與技術(shù),2010(15).
[3]宋豪.基于WiFi的分布式無線數(shù)據(jù)采集系統(tǒng)研究與實現(xiàn)[D]. 西安:西安理工大學(xué),2018.
[4]王烽.新型互聯(lián)網(wǎng)中服務(wù)信任自動管理機制設(shè)計與實現(xiàn)[D].北京:北京交通大學(xué),2018.
[5]龔延倫.A公司三期工程可行性研究項目的范圍管理[D].成都:電子科技大學(xué),2010.
[6]王思賢.基于DSP的直接轉(zhuǎn)矩控制系統(tǒng)研究[D].長沙:中南大學(xué),2009.
[7]唐湘越.基于DSP的直接轉(zhuǎn)矩控制系統(tǒng)研究[D].大連:大連交通大學(xué),2009.
[8]宋志堅.基于LXI的高性能數(shù)據(jù)采集系統(tǒng)的軟件設(shè)計與實現(xiàn)[D].成都:西南交通大學(xué),2008.
[9]陳美華.面向P2P環(huán)境的SLBLTrust信任模型及其安全擴展機制研究[D].上海:華東師范大學(xué),2009.