<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    泰仔在線

    java學習,心情日記,繽紛時刻
    posts - 100, comments - 34, trackbacks - 0, articles - 0

    nutch源代碼閱讀心得

    Posted on 2010-04-23 11:05 泰仔在線 閱讀(1055) 評論(0)  編輯  收藏 所屬分類: 云計算相關

    主要類分析:
    一、 org.apache.nutch.crawl.Injector:
        1,注入url.txt
        2,url標準化
        3,攔截url,進行正則校驗(regex-urlfilter.txt)
        4,對符URL標準的url進行map對構造<url, CrawlDatum>,在構造過程中給CrawlDatum初始化得分,分數可影響url host的搜索排序,和采集優(yōu)先級!
        5,reduce只做一件事,判斷url是不是在crawldb中已經存在,如果存在則直接讀取原來CrawlDatum,如果是新host,則把相應狀態(tài)存儲到里邊(STATUS_DB_UNFETCHED(狀態(tài)意思為沒有采集過))

    二、org.apache.nutch.crawl.Generator:
        1,過濾不及格url (使用url過濾插件)
        2,檢測URL是否在有效更新時間里
        3,獲取URL metaData,metaData記錄了url上次更新時間
        4,對url進行打分
        5,將url載入相應任務組(以host為分組)
        6,計算url hash值
        7,收集url, 直至到達 topN 指定量

    三、 org.apache.nutch.crawl.Fetcher:
        1,從segment中讀取<url, CrawlDatum>,將它放入相應的隊列中,隊列以queueId為分類,而queueId是由 協(xié)議://ip 組成,在放入隊列過程中,
            如果不存在隊列則創(chuàng)建(比如javaeye的所有地址都屬于這個隊列:http://221.130.184.141)  --> queues.addFetchItem(url, datum);
        2,檢查機器人協(xié)議是否允許該url被爬行(robots.txt) --> protocol.getRobotRules(fit.url, fit.datum);
        3,檢查url是否在有效的更新時間里 --> if (rules.getCrawlDelay() > 0)
        4,針對不同協(xié)議采用不同的協(xié)議采用不同機器人,可以是http、ftp、file,這地方已經將內容保存下來(Content)。 --> protocol.getProtocolOutput(fit.url, fit.datum);
        5,成功取回Content后,在次對HTTP狀態(tài)進行識別(如200、404)。--> case ProtocolStatus.SUCCESS:
        6,內容成功保存,進入ProtocolStatus.SUCCESS區(qū)域,在這區(qū)域里,系統(tǒng)對輸出內容進行構造。 --> output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
        7,在內容構造過程中,調取內容解析器插件(parseUtil),如mp3\html\pdf\word\zip\jsp\swf……。 --> this.parseUtil.parse(content); --> parsers[i].getParse(content);
        8,我們現在研究html解析,所以只簡略說明HtmlParser,HtmlParser中,會解析出text,title, outlinks, metadata。 
            text:過濾所有HTML元素;title:網頁標題;outlinks:url下的所有鏈接;metadata:這東西分別做那么幾件事情 首先檢測url頭部的meta name="robots" 看看是否允許蜘蛛爬行,
            其次通過對meta http-equiv refresh等屬性進行識別記錄,看頁面是否需要轉向。

    四、 org.apache.nutch.parse.ParseSegment:
        1,這個類邏輯就相對簡單很多了哦,它對我們也是很有價值的,它只做一件事情,就是對爬行下來的Content(原始HTML)進行解析,具體解析通過插件來實現。
            比如我們要做的數據分析、數據統(tǒng)計都可以在這進行實現。
        2,執(zhí)行完成后,輸出三個Map對<url,ParseText>解析內容、<url,ParseData>包含所有鏈接的分析后的結果 、<url,CrawlDatum>outlinks

    五、org.apache.nutch.crawl.CrawlDb:
        主要根據crawld_fatch輸出更新crawldb。
        1,map對crawld_fatch、crawldb地址進行標準化(nomalizer)和攔截操作(filte);
        2,reduce在對兩crawld_fatch和crawldb進行合并更新。

    六、org.apache.nutch.crawl.LinkDb:
        這個類的作用是管理新轉化進來的鏈接映射,并列出每個url的外部鏈接(incoming links)。
        1,先是對每一個url取出它的outLinks,作map操作把這個url作為每個outLinks的incoming link,
        2,在reduce里把根據每個key來把一個url的所有incoming link都加到inlinks里。
        3,這樣就把每個url的外部鏈接統(tǒng)計出來了,注意,系統(tǒng)對只對外部鏈接進行統(tǒng)計,什么叫外部鏈接呢,就是只對不同host進行統(tǒng)計,
            記住javaeye.com和biaowen.javaeye.com是兩個不同的host哦。 --> boolean ignoreInternalLinks = true;
        4,然后一步是對這些新加進來的鏈接進行合并。

    七、 org.apache.nutch.crawl.Indexer:
        這個類的任務是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是為前面爬蟲抓取回來的數據進行索引好讓用戶可以搜索到這些數據。
        這里的輸入就比較多了,有segments下的fetch_dir,parseData和parseText,還有crawldb下的 current_dir和linkdb下的current_dir。
        1,在這個類里,map將所有輸入都裝載到一個容器里邊,
        2,再到reduce進行分類處理,
        3,實現攔截 --> this.filters.filter(doc, parse, key, fetchDatum, inlinks);
        4,打分 --> this.scfilters.indexerScore(key, doc, dbDatum,fetchDatum, parse, inlinks, boost);
        5,當然要把這些數據體組合成一個 lucene的document讓它索引了。
        6,在reduce里組裝好后收集時是<url,doc>,最后在輸出的OutputFormat類里進行真正的索引。
            doc里有如下幾個field
                content(正文)
                site    (所屬主地址
                title    (標題)
                host    (host)
                segement    (屬于哪個segement)
                digest    (MD5碼,去重時候用到)
                tstamp    (時間戳)
                url    (當前URL地址)
                載了一個例子:
                    doc =
                        {content=[biaowen - JavaEye技術網站 首頁 新聞 論壇 博客 招聘 更多 ▼ 問答 ………………(內容省略)………… biaowen 永NF/ICP備05023328號],
                        site=[biaowen.javaeye.com],
                        title=[biaowen - JavaEye技術網站],
                        host=[biaowen.javaeye.com],
                        segment=[20090725083125],
                        digest=[063ba8430fa84e614ce71276e176f4ce],
                        tstamp=[20090725003318265],
                        url=[http://biaowen.javaeye.com/]}

    八、 org.apache.nutch.crawl.DeleteDuplicates:
        這個類的作用就是這它的名字所寫的意思--去重。
        前面索引后(當然不是一次時的情況)會有重復,所以要去重。為什么呢,在一次索引時是不重復的,可是多次抓取后就會有重復了。
        就是這個原因才要去重。當然去重的規(guī)則有兩種一個是以時間為標準,一種是以內容的md5值為標準。

    九、org.apache.nutch.indexer.IndexMerger:
        這個類就相對簡單了,目的將多個indexes合并為一個index,直接調用lucene方法實現!


    附帶些參考資料:

    目錄結構,參考自《Lucene+Nutch搜索引擎開發(fā)》
        一、crawldb    下載的url,以及下載日期,用來進行頁面更新
        二、segements    存放抓取頁面和分析結果
                            1、crawl_generate:待下載url
                            2、crawl_fetch:每個下載url的狀態(tài)
                            3、content:每個下載頁面的內容
                            4、parse_text:包含每個解析過的url文本內容
                            5、parse_data:每個url解析出的外部鏈接和元數據
                            6、crawl_parse:用來更新crawl的外部鏈接庫
        三、linkdb    存放url的互聯關系
        四、indexes:存放每次下載的獨立索引目錄
        五、index:符合lucene格式的索引目錄,是indexes里所有index合并后的完整索引

    轉自:nutch源代碼閱讀心得
    主站蜘蛛池模板: 亚洲色大成网站www久久九| 亚洲午夜国产精品无码老牛影视| 最新黄色免费网站| 暖暖免费日本在线中文| 国产无遮挡裸体免费视频在线观看 | 国产成人在线免费观看| 好吊妞998视频免费观看在线| 黄页网站免费观看| 成年女性特黄午夜视频免费看| 成年女人免费视频播放体验区| 最近中文字幕免费mv视频7| 色婷婷7777免费视频在线观看| 一个人免费观看视频www| 久久久久免费看黄A片APP| 四虎影视免费在线| 四虎AV永久在线精品免费观看| 亚洲AV无码乱码在线观看性色扶 | 久久青草91免费观看| 8090在线观看免费观看| 67194熟妇在线永久免费观看| 免费观看的毛片大全| 免费无码一区二区三区蜜桃大| 国产三级免费电影| 久久亚洲高清综合| 亚洲AV日韩AV鸥美在线观看| 亚洲的天堂av无码| 亚洲色大18成人网站WWW在线播放| 亚洲av综合av一区二区三区 | 亚洲人成www在线播放| 亚洲va中文字幕| 国产成人自产拍免费视频| 久久久精品免费国产四虎| 成人午夜免费福利视频| 日韩视频免费在线| 中文字幕不卡亚洲| 亚洲激情黄色小说| MM1313亚洲精品无码久久| 久久er国产精品免费观看2| 成年免费大片黄在线观看岛国| 国产一精品一aⅴ一免费| 亚洲国产无套无码av电影|