Nutch抓取流程
nutch抓取流程
注入起始url(inject)、生成爬取列表(generate)、爬取(fetch)、解析網(wǎng)頁(yè)內(nèi)容(parse)、更新url數(shù)據(jù)庫(kù)(updatedb)
1:注入起始url(inject)
org.apache.nutch.crawl.Injector
注入待抓取URL,因?yàn)镹utch的抓取程序要抓取網(wǎng)頁(yè),肯定需要有一個(gè)或者多個(gè)入口url。
nutch會(huì)按照廣度優(yōu)先策略(一般有廣度優(yōu)先策略和深度優(yōu)先策略)進(jìn)行抓取,根據(jù)前面指定
的url進(jìn)行抓取工作。
url存儲(chǔ)具體格式為<Text, CrawlDatum>。其中的key表示該URL的地址,而value則是Nutch
自己定義的一個(gè)類(lèi)型“CrawlDatum”,該類(lèi)型實(shí)現(xiàn)了"Writable"接口,用來(lái)表示頁(yè)面的一些
屬性。
“CrawlDatum"類(lèi)所在位置:org.apache.nutch.crawl.CrawlDatum
其中包括了頁(yè)面的狀態(tài),抓取時(shí)間,抓取間隔等屬性。
inject過(guò)程把這些數(shù)據(jù)存儲(chǔ)到crawldb目錄中。
2:生成爬取列表(generate)
org.apache.nutch.crawl.Generator
生成segment。這一步驟主要是對(duì)上一步提交的URL集合進(jìn)行分析,確定抓取任務(wù)的詳細(xì)信息。
在segments目錄下新建一個(gè)System.currentTimeMillis()時(shí)間標(biāo)識(shí)的文件,如:20150906145715
另外遍歷crawlDb,取出topN個(gè)需要fetch的urlList,【topN的配置屬性是:generate.topN,
nutch-default.xml中沒(méi)有配置這個(gè)屬性,查看代碼發(fā)現(xiàn)如果沒(méi)有配置默認(rèn)是long的最大值
job.getLong(GENERATOR_TOP_N, Long.MAX_VALUE),分析crawl腳本發(fā)現(xiàn)這個(gè)值會(huì)被設(shè)置為50000
numSlaves=1
sizeFetchlist=`expr $numSlaves \* 50000`
generate_args=($commonOptions "$CRAWL_PATH"/crawldb "$CRAWL_PATH"/segments -topN $sizeFetchlist -numFetchers $numSlaves -noFilter)
】
存放到segments/20150906145715/crawl_generate文件中,
crawl_generate 為SequenceFile文件
3:爬取(fetch)
org.apache.nutch.fetcher.Fetcher
分析提交的URL集合之后,將頁(yè)面內(nèi)容抓取下來(lái),存于segment目錄下。
抓取過(guò)程中,頁(yè)面的URL地址可能因?yàn)殒溄影l(fā)生改變(302重定向),從而需要更新URL地址;
例如:京東手機(jī)分類(lèi)url:http://list.jd.com/9987-653-655.html,
打開(kāi)之后url就變成這個(gè)了:http://list.jd.com/list.html?cat=9987,653,655
抓取采用多線程方式進(jìn)行,以提高抓取速度;參數(shù)為:fetcher.threads.fetch,默認(rèn)最大線程數(shù)量為10,
使用crawl腳本的話線程數(shù)會(huì)被設(shè)置為50,
【numThreads=50
__bin_nutch fetch $commonOptions -D fetcher.timelimit.mins=$timeLimitFetch "$CRAWL_PATH"/segments/$SEGMENT -noParsing -threads $numThreads
】
fetch操作過(guò)程中調(diào)用了parse操作。
4:解析(parse)
org.apache.nutch.parse.ParseSegment
內(nèi)容解析器。抓取到的頁(yè)面文件被提交到這里,實(shí)現(xiàn)對(duì)頁(yè)面文件的處理,包括頁(yè)面文件的分析和處理
4.1:parsed text &data
解析segment中由fetch得到的頁(yè)面,并進(jìn)行整理,將頁(yè)面分成為parse-date和parse-text
parse-date中保存的是頁(yè)面的題名、作者、日期、鏈接等元數(shù)據(jù)信息;
parse-text中保存的是頁(yè)面的文本內(nèi)容。
通過(guò)上面幾步操作,創(chuàng)建了如下幾個(gè)目錄
content、crawl_fetch、crawl_generate、crawl_parse、parse_data、parse_text
content
包含下載頁(yè)面的原始數(shù)據(jù),存儲(chǔ)為map文件,格式是<url,Content>。為了展示快摘頁(yè)面,
這里使用文件存儲(chǔ)數(shù)據(jù),因?yàn)镹utch需要對(duì)文件做快速隨機(jī)的訪問(wèn)。
crawl_generate
它包含將要爬取的URL列表以及從CrawlDb取到的與這些URL頁(yè)相關(guān)的當(dāng)前狀態(tài)信息,
對(duì)應(yīng)的文件的格式<url,CrawlDatum>。
crawl_fetch
它包含數(shù)據(jù)爬取的狀態(tài)信息,即爬取是否成功相應(yīng)碼是什么,等等。
這個(gè)數(shù)據(jù)存儲(chǔ)在map文件里,格式是<url,CrawlDatum>
crawl_parse
每個(gè)成功爬取并解析的頁(yè)面的鏈接列表都保存在這里,頁(yè)面中解析出來(lái)的鏈接
都保存在這里面也是<url,CrawlDatum>格式存儲(chǔ)的。
parse_date
解析過(guò)程中收集的元數(shù)據(jù),使用<url,ParseData>格式存儲(chǔ)的
parse_text
存儲(chǔ)的是網(wǎng)址和標(biāo)題信息,使用<url,ParseText>格式存儲(chǔ)的
5:更新url數(shù)據(jù)庫(kù)(updatedb)
根據(jù)第四步的解析結(jié)果更新crawldb數(shù)據(jù)庫(kù)
其實(shí)這一步就是調(diào)用CrawlDb.java中的update方法,從第95和96行代碼可以發(fā)現(xiàn)
其實(shí)就是根據(jù)第四步生成的crawl_fetch和crawl_parse中的數(shù)據(jù)文件進(jìn)行更新。
?
本文轉(zhuǎn)自SummerChill博客園博客,原文鏈接:http://www.cnblogs.com/DreamDrive/p/5947898.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
- 上一篇: 投影机常见故障
- 下一篇: 实战脚本写入注册表,完善WindowsS