nutch源代码阅读心得
http://www.javaeye.com/topic/570440
主要類(lèi)分析:
一、 org.apache.nutch.crawl.Injector:
??? 1,注入url.txt
??? 2,url標(biāo)準(zhǔn)化
??? 3,攔截url,進(jìn)行正則校驗(yàn)(regex-urlfilter.txt)
??? 4,對(duì)符URL標(biāo)準(zhǔn)的url進(jìn)行map對(duì)構(gòu)造<url, CrawlDatum>,在構(gòu)造過(guò)程中給CrawlDatum初始化得分,分?jǐn)?shù)可影響url host的搜索排序,和采集優(yōu)先級(jí)!
??? 5,reduce只做一件事,判斷url是不是在crawldb中已經(jīng)存在,如果存在則直接讀取原來(lái)CrawlDatum,如果是新host,則把相應(yīng)狀態(tài)存儲(chǔ)到里邊(STATUS_DB_UNFETCHED(狀態(tài)意思為沒(méi)有采集過(guò)))
二、org.apache.nutch.crawl.Generator:
??? 1,過(guò)濾不及格url (使用url過(guò)濾插件)
??? 2,檢測(cè)URL是否在有效更新時(shí)間里
??? 3,獲取URL metaData,metaData記錄了url上次更新時(shí)間
??? 4,對(duì)url進(jìn)行打分
??? 5,將url載入相應(yīng)任務(wù)組(以host為分組)
??? 6,計(jì)算url hash值
??? 7,收集url, 直至到達(dá) topN 指定量
三、 org.apache.nutch.crawl.Fetcher:
??? 1,從segment中讀取<url, CrawlDatum>,將它放入相應(yīng)的隊(duì)列中,隊(duì)列以queueId為分類(lèi),而queueId是由 協(xié)議://ip 組成,在放入隊(duì)列過(guò)程中,
?? ??? ?如果不存在隊(duì)列則創(chuàng)建(比如javaeye的所有地址都屬于這個(gè)隊(duì)列:http://221.130.184.141)? --> queues.addFetchItem(url, datum);
??? 2,檢查機(jī)器人協(xié)議是否允許該url被爬行(robots.txt) --> protocol.getRobotRules(fit.url, fit.datum);
??? 3,檢查url是否在有效的更新時(shí)間里 --> if (rules.getCrawlDelay() > 0)
??? 4,針對(duì)不同協(xié)議采用不同的協(xié)議采用不同機(jī)器人,可以是http、ftp、file,這地方已經(jīng)將內(nèi)容保存下來(lái)(Content)。 --> protocol.getProtocolOutput(fit.url, fit.datum);
??? 5,成功取回Content后,在次對(duì)HTTP狀態(tài)進(jìn)行識(shí)別(如200、404)。--> case ProtocolStatus.SUCCESS:
??? 6,內(nèi)容成功保存,進(jìn)入ProtocolStatus.SUCCESS區(qū)域,在這區(qū)域里,系統(tǒng)對(duì)輸出內(nèi)容進(jìn)行構(gòu)造。 --> output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
??? 7,在內(nèi)容構(gòu)造過(guò)程中,調(diào)取內(nèi)容解析器插件(parseUtil),如mp3\html\pdf\word\zip\jsp\swf……。 --> this.parseUtil.parse(content); --> parsers[i].getParse(content);
??? 8,我們現(xiàn)在研究html解析,所以只簡(jiǎn)略說(shuō)明HtmlParser,HtmlParser中,會(huì)解析出text,title, outlinks, metadata。?
?? ??? ?text:過(guò)濾所有HTML元素;title:網(wǎng)頁(yè)標(biāo)題;outlinks:url下的所有鏈接;metadata:這東西分別做那么幾件事情 首先檢測(cè)url頭部的meta name="robots" 看看是否允許蜘蛛爬行,
?? ??? ?其次通過(guò)對(duì)meta http-equiv refresh等屬性進(jìn)行識(shí)別記錄,看頁(yè)面是否需要轉(zhuǎn)向。
四、 org.apache.nutch.parse.ParseSegment:
??? 1,這個(gè)類(lèi)邏輯就相對(duì)簡(jiǎn)單很多了哦,它對(duì)我們也是很有價(jià)值的,它只做一件事情,就是對(duì)爬行下來(lái)的Content(原始HTML)進(jìn)行解析,具體解析通過(guò)插件來(lái)實(shí)現(xiàn)。
?? ???? 比如我們要做的數(shù)據(jù)分析、數(shù)據(jù)統(tǒng)計(jì)都可以在這進(jìn)行實(shí)現(xiàn)。
??? 2,執(zhí)行完成后,輸出三個(gè)Map對(duì)<url,ParseText>解析內(nèi)容、<url,ParseData>包含所有鏈接的分析后的結(jié)果 、<url,CrawlDatum>outlinks
五、org.apache.nutch.crawl.CrawlDb:
??? 主要根據(jù)crawld_fatch輸出更新crawldb。
??? 1,map對(duì)crawld_fatch、crawldb地址進(jìn)行標(biāo)準(zhǔn)化(nomalizer)和攔截操作(filte);
??? 2,reduce在對(duì)兩crawld_fatch和crawldb進(jìn)行合并更新。
六、org.apache.nutch.crawl.LinkDb:
?? ?這個(gè)類(lèi)的作用是管理新轉(zhuǎn)化進(jìn)來(lái)的鏈接映射,并列出每個(gè)url的外部鏈接(incoming links)。
??? 1,先是對(duì)每一個(gè)url取出它的outLinks,作map操作把這個(gè)url作為每個(gè)outLinks的incoming link,
??? 2,在reduce里把根據(jù)每個(gè)key來(lái)把一個(gè)url的所有incoming link都加到inlinks里。
??? 3,這樣就把每個(gè)url的外部鏈接統(tǒng)計(jì)出來(lái)了,注意,系統(tǒng)對(duì)只對(duì)外部鏈接進(jìn)行統(tǒng)計(jì),什么叫外部鏈接呢,就是只對(duì)不同host進(jìn)行統(tǒng)計(jì),
?? ??? ?記住javaeye.com和biaowen.javaeye.com是兩個(gè)不同的host哦。 --> boolean ignoreInternalLinks = true;
??? 4,然后一步是對(duì)這些新加進(jìn)來(lái)的鏈接進(jìn)行合并。
七、 org.apache.nutch.crawl.Indexer:
?? ?這個(gè)類(lèi)的任務(wù)是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是為前面爬蟲(chóng)抓取回來(lái)的數(shù)據(jù)進(jìn)行索引好讓用戶可以搜索到這些數(shù)據(jù)。
?? ?這里的輸入就比較多了,有segments下的fetch_dir,parseData和parseText,還有crawldb下的 current_dir和linkdb下的current_dir。
??? 1,在這個(gè)類(lèi)里,map將所有輸入都裝載到一個(gè)容器里邊,
??? 2,再到reduce進(jìn)行分類(lèi)處理,
??? 3,實(shí)現(xiàn)攔截 --> this.filters.filter(doc, parse, key, fetchDatum, inlinks);
??? 4,打分 --> this.scfilters.indexerScore(key, doc, dbDatum,fetchDatum, parse, inlinks, boost);
??? 5,當(dāng)然要把這些數(shù)據(jù)體組合成一個(gè) lucene的document讓它索引了。
??? 6,在reduce里組裝好后收集時(shí)是<url,doc>,最后在輸出的OutputFormat類(lèi)里進(jìn)行真正的索引。
?? ???? doc里有如下幾個(gè)field
?? ??? ???? content(正文)
?? ??? ???? site??? (所屬主地址)
?? ??? ???? title??? (標(biāo)題)
?? ??? ???? host??? (host)
?? ??? ??? ?segement??? (屬于哪個(gè)segement)
?? ??? ???? digest??? (MD5碼,去重時(shí)候用到)
?? ??? ???? tstamp??? (時(shí)間戳)
?? ??? ??? ?url??? (當(dāng)前URL地址)
?? ??? ???? 載了一個(gè)例子:
?? ??? ??? ??? ?doc =
?? ??? ??? ??? ??? ?{content=[biaowen - JavaEye技術(shù)網(wǎng)站 首頁(yè) 新聞 論壇 博客 招聘 更多 ▼ 問(wèn)答 ………………(內(nèi)容省略)………… biaowen 永NF/ICP備05023328號(hào)],
?? ??? ??? ??? ??? ?site=[biaowen.javaeye.com],
?? ??? ??? ??? ??? ?title=[biaowen - JavaEye技術(shù)網(wǎng)站],
?? ??? ??? ??? ??? ?host=[biaowen.javaeye.com],
?? ??? ??? ??? ??? ?segment=[20090725083125],
?? ??? ??? ??? ??? ?digest=[063ba8430fa84e614ce71276e176f4ce],
?? ??? ??? ??? ??? ?tstamp=[20090725003318265],
?? ??? ??? ??? ??? ?url=[http://biaowen.javaeye.com/]}
八、 org.apache.nutch.crawl.DeleteDuplicates:
?? ?這個(gè)類(lèi)的作用就是這它的名字所寫(xiě)的意思--去重。
?? ?前面索引后(當(dāng)然不是一次時(shí)的情況)會(huì)有重復(fù),所以要去重。為什么呢,在一次索引時(shí)是不重復(fù)的,可是多次抓取后就會(huì)有重復(fù)了。
?? ?就是這個(gè)原因才要去重。當(dāng)然去重的規(guī)則有兩種一個(gè)是以時(shí)間為標(biāo)準(zhǔn),一種是以內(nèi)容的md5值為標(biāo)準(zhǔn)。
九、org.apache.nutch.indexer.IndexMerger:
??? 這個(gè)類(lèi)就相對(duì)簡(jiǎn)單了,目的將多個(gè)indexes合并為一個(gè)index,直接調(diào)用lucene方法實(shí)現(xiàn)!
附帶些參考資料:
??? 一、crawldb??? 下載的url,以及下載日期,用來(lái)進(jìn)行頁(yè)面更新
??? 二、segements??? 存放抓取頁(yè)面和分析結(jié)果
?? ??? ??? ??? ??? ???? 1、crawl_generate:待下載url
?? ??? ??? ??? ??? ???? 2、crawl_fetch:每個(gè)下載url的狀態(tài)
?? ??? ??? ??? ??? ???? 3、content:每個(gè)下載頁(yè)面的內(nèi)容
?? ??? ??? ??? ??? ???? 4、parse_text:包含每個(gè)解析過(guò)的url文本內(nèi)容
?? ??? ??? ??? ??? ???? 5、parse_data:每個(gè)url解析出的外部鏈接和元數(shù)據(jù)
?? ??? ??? ??? ??? ???? 6、crawl_parse:用來(lái)更新crawl的外部鏈接庫(kù)
??? 三、linkdb??? 存放url的互聯(lián)關(guān)系
??? 四、indexes:存放每次下載的獨(dú)立索引目錄
??? 五、index:符合lucene格式的索引目錄,是indexes里所有index合并后的完整索引
主要類(lèi)分析:
一、 org.apache.nutch.crawl.Injector:
??? 1,注入url.txt
??? 2,url標(biāo)準(zhǔn)化
??? 3,攔截url,進(jìn)行正則校驗(yàn)(regex-urlfilter.txt)
??? 4,對(duì)符URL標(biāo)準(zhǔn)的url進(jìn)行map對(duì)構(gòu)造<url, CrawlDatum>,在構(gòu)造過(guò)程中給CrawlDatum初始化得分,分?jǐn)?shù)可影響url host的搜索排序,和采集優(yōu)先級(jí)!
??? 5,reduce只做一件事,判斷url是不是在crawldb中已經(jīng)存在,如果存在則直接讀取原來(lái)CrawlDatum,如果是新host,則把相應(yīng)狀態(tài)存儲(chǔ)到里邊(STATUS_DB_UNFETCHED(狀態(tài)意思為沒(méi)有采集過(guò)))
二、org.apache.nutch.crawl.Generator:
??? 1,過(guò)濾不及格url (使用url過(guò)濾插件)
??? 2,檢測(cè)URL是否在有效更新時(shí)間里
??? 3,獲取URL metaData,metaData記錄了url上次更新時(shí)間
??? 4,對(duì)url進(jìn)行打分
??? 5,將url載入相應(yīng)任務(wù)組(以host為分組)
??? 6,計(jì)算url hash值
??? 7,收集url, 直至到達(dá) topN 指定量
三、 org.apache.nutch.crawl.Fetcher:
??? 1,從segment中讀取<url, CrawlDatum>,將它放入相應(yīng)的隊(duì)列中,隊(duì)列以queueId為分類(lèi),而queueId是由 協(xié)議://ip 組成,在放入隊(duì)列過(guò)程中,
?? ??? ?如果不存在隊(duì)列則創(chuàng)建(比如javaeye的所有地址都屬于這個(gè)隊(duì)列:http://221.130.184.141)? --> queues.addFetchItem(url, datum);
??? 2,檢查機(jī)器人協(xié)議是否允許該url被爬行(robots.txt) --> protocol.getRobotRules(fit.url, fit.datum);
??? 3,檢查url是否在有效的更新時(shí)間里 --> if (rules.getCrawlDelay() > 0)
??? 4,針對(duì)不同協(xié)議采用不同的協(xié)議采用不同機(jī)器人,可以是http、ftp、file,這地方已經(jīng)將內(nèi)容保存下來(lái)(Content)。 --> protocol.getProtocolOutput(fit.url, fit.datum);
??? 5,成功取回Content后,在次對(duì)HTTP狀態(tài)進(jìn)行識(shí)別(如200、404)。--> case ProtocolStatus.SUCCESS:
??? 6,內(nèi)容成功保存,進(jìn)入ProtocolStatus.SUCCESS區(qū)域,在這區(qū)域里,系統(tǒng)對(duì)輸出內(nèi)容進(jìn)行構(gòu)造。 --> output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
??? 7,在內(nèi)容構(gòu)造過(guò)程中,調(diào)取內(nèi)容解析器插件(parseUtil),如mp3\html\pdf\word\zip\jsp\swf……。 --> this.parseUtil.parse(content); --> parsers[i].getParse(content);
??? 8,我們現(xiàn)在研究html解析,所以只簡(jiǎn)略說(shuō)明HtmlParser,HtmlParser中,會(huì)解析出text,title, outlinks, metadata。?
?? ??? ?text:過(guò)濾所有HTML元素;title:網(wǎng)頁(yè)標(biāo)題;outlinks:url下的所有鏈接;metadata:這東西分別做那么幾件事情 首先檢測(cè)url頭部的meta name="robots" 看看是否允許蜘蛛爬行,
?? ??? ?其次通過(guò)對(duì)meta http-equiv refresh等屬性進(jìn)行識(shí)別記錄,看頁(yè)面是否需要轉(zhuǎn)向。
四、 org.apache.nutch.parse.ParseSegment:
??? 1,這個(gè)類(lèi)邏輯就相對(duì)簡(jiǎn)單很多了哦,它對(duì)我們也是很有價(jià)值的,它只做一件事情,就是對(duì)爬行下來(lái)的Content(原始HTML)進(jìn)行解析,具體解析通過(guò)插件來(lái)實(shí)現(xiàn)。
?? ???? 比如我們要做的數(shù)據(jù)分析、數(shù)據(jù)統(tǒng)計(jì)都可以在這進(jìn)行實(shí)現(xiàn)。
??? 2,執(zhí)行完成后,輸出三個(gè)Map對(duì)<url,ParseText>解析內(nèi)容、<url,ParseData>包含所有鏈接的分析后的結(jié)果 、<url,CrawlDatum>outlinks
五、org.apache.nutch.crawl.CrawlDb:
??? 主要根據(jù)crawld_fatch輸出更新crawldb。
??? 1,map對(duì)crawld_fatch、crawldb地址進(jìn)行標(biāo)準(zhǔn)化(nomalizer)和攔截操作(filte);
??? 2,reduce在對(duì)兩crawld_fatch和crawldb進(jìn)行合并更新。
六、org.apache.nutch.crawl.LinkDb:
?? ?這個(gè)類(lèi)的作用是管理新轉(zhuǎn)化進(jìn)來(lái)的鏈接映射,并列出每個(gè)url的外部鏈接(incoming links)。
??? 1,先是對(duì)每一個(gè)url取出它的outLinks,作map操作把這個(gè)url作為每個(gè)outLinks的incoming link,
??? 2,在reduce里把根據(jù)每個(gè)key來(lái)把一個(gè)url的所有incoming link都加到inlinks里。
??? 3,這樣就把每個(gè)url的外部鏈接統(tǒng)計(jì)出來(lái)了,注意,系統(tǒng)對(duì)只對(duì)外部鏈接進(jìn)行統(tǒng)計(jì),什么叫外部鏈接呢,就是只對(duì)不同host進(jìn)行統(tǒng)計(jì),
?? ??? ?記住javaeye.com和biaowen.javaeye.com是兩個(gè)不同的host哦。 --> boolean ignoreInternalLinks = true;
??? 4,然后一步是對(duì)這些新加進(jìn)來(lái)的鏈接進(jìn)行合并。
七、 org.apache.nutch.crawl.Indexer:
?? ?這個(gè)類(lèi)的任務(wù)是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是為前面爬蟲(chóng)抓取回來(lái)的數(shù)據(jù)進(jìn)行索引好讓用戶可以搜索到這些數(shù)據(jù)。
?? ?這里的輸入就比較多了,有segments下的fetch_dir,parseData和parseText,還有crawldb下的 current_dir和linkdb下的current_dir。
??? 1,在這個(gè)類(lèi)里,map將所有輸入都裝載到一個(gè)容器里邊,
??? 2,再到reduce進(jìn)行分類(lèi)處理,
??? 3,實(shí)現(xiàn)攔截 --> this.filters.filter(doc, parse, key, fetchDatum, inlinks);
??? 4,打分 --> this.scfilters.indexerScore(key, doc, dbDatum,fetchDatum, parse, inlinks, boost);
??? 5,當(dāng)然要把這些數(shù)據(jù)體組合成一個(gè) lucene的document讓它索引了。
??? 6,在reduce里組裝好后收集時(shí)是<url,doc>,最后在輸出的OutputFormat類(lèi)里進(jìn)行真正的索引。
?? ???? doc里有如下幾個(gè)field
?? ??? ???? content(正文)
?? ??? ???? site??? (所屬主地址)
?? ??? ???? title??? (標(biāo)題)
?? ??? ???? host??? (host)
?? ??? ??? ?segement??? (屬于哪個(gè)segement)
?? ??? ???? digest??? (MD5碼,去重時(shí)候用到)
?? ??? ???? tstamp??? (時(shí)間戳)
?? ??? ??? ?url??? (當(dāng)前URL地址)
?? ??? ???? 載了一個(gè)例子:
?? ??? ??? ??? ?doc =
?? ??? ??? ??? ??? ?{content=[biaowen - JavaEye技術(shù)網(wǎng)站 首頁(yè) 新聞 論壇 博客 招聘 更多 ▼ 問(wèn)答 ………………(內(nèi)容省略)………… biaowen 永NF/ICP備05023328號(hào)],
?? ??? ??? ??? ??? ?site=[biaowen.javaeye.com],
?? ??? ??? ??? ??? ?title=[biaowen - JavaEye技術(shù)網(wǎng)站],
?? ??? ??? ??? ??? ?host=[biaowen.javaeye.com],
?? ??? ??? ??? ??? ?segment=[20090725083125],
?? ??? ??? ??? ??? ?digest=[063ba8430fa84e614ce71276e176f4ce],
?? ??? ??? ??? ??? ?tstamp=[20090725003318265],
?? ??? ??? ??? ??? ?url=[http://biaowen.javaeye.com/]}
八、 org.apache.nutch.crawl.DeleteDuplicates:
?? ?這個(gè)類(lèi)的作用就是這它的名字所寫(xiě)的意思--去重。
?? ?前面索引后(當(dāng)然不是一次時(shí)的情況)會(huì)有重復(fù),所以要去重。為什么呢,在一次索引時(shí)是不重復(fù)的,可是多次抓取后就會(huì)有重復(fù)了。
?? ?就是這個(gè)原因才要去重。當(dāng)然去重的規(guī)則有兩種一個(gè)是以時(shí)間為標(biāo)準(zhǔn),一種是以內(nèi)容的md5值為標(biāo)準(zhǔn)。
九、org.apache.nutch.indexer.IndexMerger:
??? 這個(gè)類(lèi)就相對(duì)簡(jiǎn)單了,目的將多個(gè)indexes合并為一個(gè)index,直接調(diào)用lucene方法實(shí)現(xiàn)!
附帶些參考資料:
??? 一、crawldb??? 下載的url,以及下載日期,用來(lái)進(jìn)行頁(yè)面更新
??? 二、segements??? 存放抓取頁(yè)面和分析結(jié)果
?? ??? ??? ??? ??? ???? 1、crawl_generate:待下載url
?? ??? ??? ??? ??? ???? 2、crawl_fetch:每個(gè)下載url的狀態(tài)
?? ??? ??? ??? ??? ???? 3、content:每個(gè)下載頁(yè)面的內(nèi)容
?? ??? ??? ??? ??? ???? 4、parse_text:包含每個(gè)解析過(guò)的url文本內(nèi)容
?? ??? ??? ??? ??? ???? 5、parse_data:每個(gè)url解析出的外部鏈接和元數(shù)據(jù)
?? ??? ??? ??? ??? ???? 6、crawl_parse:用來(lái)更新crawl的外部鏈接庫(kù)
??? 三、linkdb??? 存放url的互聯(lián)關(guān)系
??? 四、indexes:存放每次下載的獨(dú)立索引目錄
??? 五、index:符合lucene格式的索引目錄,是indexes里所有index合并后的完整索引
轉(zhuǎn)載于:https://www.cnblogs.com/clarkchen/archive/2011/02/22/1960892.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的nutch源代码阅读心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IIS7 设置 UrlRewrite
- 下一篇: 我错了……