??? 由于信息所有很大的容量、帶寬資源閑置,要將其利用起來,在網(wǎng)絡(luò)上收集與特定領(lǐng)域相關(guān)的資料,這就需要使用到網(wǎng)羅爬蟲方面的技術(shù)了。在經(jīng)過一段時(shí)間的調(diào)研之后,發(fā)現(xiàn)Apache已經(jīng)有一個(gè)開源的搜索引擎---Nutch了,對(duì)其特定需求地改造將為我們節(jié)約了很多的時(shí)間與精力。
??? 在java.net社區(qū)中有兩篇文章對(duì)Nutch進(jìn)行了詳盡的介紹。
Introduction to Nutch, Part 1: Crawling
Introduction to Nutch, Part 2: Searching
如有需求請(qǐng)好好研究它
??? 在nutch0.8的源代碼org.apache.nutch.crawl包中包含了nutch爬蟲最開始調(diào)用的類---cralw,在其main函數(shù)中,分別調(diào)用了
Injector(job).inject(crawlDb, rootUrlDir);
Generator(job).generate(crawlDb, segments, -1, topN, System.currentTimeMillis());
Fetcher(job).fetch(segment, threads, Fetcher.isParsing(job));
ParseSegment(job).parse(segment);
CrawlDb(job).update(crawlDb, segment);
LinkDb(job).invert(linkDb, segments);
Indexer(job).index(indexes, crawlDb, linkDb, fs.listPaths(segments));
DeleteDuplicates(job).dedup(new Path[] { indexes });
IndexMerger(fs, fs.listPaths(indexes), index, tmpDir, job).merge();
??? 以上方法,其中Generator、Fetcher、ParseSegment、CrawlDb是根據(jù)輸入的參數(shù)循環(huán)運(yùn)行的,根據(jù)爬行日志我們可以看到各個(gè)類及其方法的調(diào)用過程。
??? Nutch是支持插件擴(kuò)展的,這樣就可以滿足各個(gè)不同使用群體的特定需求,例如是要做垂直搜索,并收集特定信息的收集,那么我們可以在其nutch-default.xml文件中找到如下一段:
?1?<property>
?2???<name>plugin.includes</name>
?3???<value>protocol-http|urlfilter-regex|parse-(text|html|js)|index-basic|query-(basic|site|url)|summary-basic|scoring-opic</value>
?4???<description>Regular?expression?naming?plugin?directory?names?to
?5???include.??Any?plugin?not?matching?this?expression?is?excluded.
?6???In?any?case?you?need?at?least?include?the?nutch-extensionpoints?plugin.?By
?7???default?Nutch?includes?crawling?just?HTML?and?plain?text?via?HTTP,
?8???and?basic?indexing?and?search?plugins.
?9???</description>
10?</property>
11?
12?<property>
13???<name>plugin.excludes</name>
14???<value></value>
15???<description>Regular?expression?naming?plugin?directory?names?to?exclude.??
16???</description>
17?</property>

??? 并將plugin.includes拷貝到nutch-site.xml文件中,在plugin.includes的value中加入自己編寫的插件即可。
??? 要進(jìn)行Nutch的二次開發(fā),在國內(nèi)首先要解決的問題是中文的分詞問題。這是各大搜索公司非常重視的問題,對(duì)于我現(xiàn)在所屬的單位來說,分詞的精度不需要達(dá)到那么高,能夠?qū)⑻囟I(lǐng)域中的詞語分析出來即可,而且對(duì)于本領(lǐng)域來說詞匯比較特殊,能夠很好的和其他詞匯區(qū)分開來,而且不容易有歧義發(fā)生,但是要求的分詞速度需要達(dá)到一定程度才能夠有實(shí)用價(jià)值。因此,多線程方面的分詞程序勢在必行,能夠達(dá)到每秒20萬字以上的分詞速度才能滿足一般需求。




本文依據(jù)《創(chuàng)作共用約定》之“署名-禁止派生-非商業(yè)用途”方式發(fā)布,即你可以免費(fèi)拷貝、分發(fā)、呈現(xiàn)和表演當(dāng)前作品,但是必須基于以下條款:

  • 署名:你必須明確標(biāo)明作者的名字。

  • 非商業(yè)用途:你不可將當(dāng)前作品用于商業(yè)目的。

  • 禁止派生:你不可更改、轉(zhuǎn)變或者基于此作品重新構(gòu)造為新作品。

對(duì)于任何二次使用或分發(fā),你必須讓其他人明確當(dāng)前作品的授權(quán)條款。

在得到作者的明確允許下,這里的某些條款可以放棄。