Nutch 二次開發parse紙

2021-09-06 23:59:35 字數 3656 閱讀 4312

大約nutch基礎知識可以參考lemo柱

nutch支援二次開發,為了滿足搜尋的準確性的問題,內容提取出來作為索引的內容,相應的是parse_text的資料。我使用的事nutch1.4 版本號,在cygwin下執行crawl命令進行爬取。

bin/nutch crawl urls -dir crawl -depth 3 -topn 30
爬取的流程例如以下:inject :將urls下的url文件中的url注入到資料庫。generate:從資料庫中取得url獲取須要爬取的url佇列。fetch:從url爬取佇列中爬取page,parse:解析page的內容。

從這裡看到我須要改寫的是parse對網頁解析部分,parse對網頁進行解析後將解析的text放入crawl/segments下相應的parse_text目錄下,我們能夠通過命令

bin/nutch readseg -dump crawl/segments/20120710142020 segdata
檢視詳細爬取的內容。

從系統的擴充套件點,通過實現系統中的parser擴充套件點,就可以實現自己的parse應用,而系統中對html頁面解析是通過預設的parse-html外掛程式實現的,這裡我們為了方便(但公升級nutch版本號之後就不方便了),直接在parse-html外掛程式處進行改動。

首先我們先找到parse-html實現parser藉口的getparse方法,這種方法是詳細解析網頁內容的。

public parseresult getparse(content content)  catch (malformedurlexception e) 

string text = "";

string title = "";

outlink outlinks = new outlink[0];

metadata metadata = new metadata();

// parse the content

documentfragment root;

try

root = parse(input);

} catch (ioexception e) catch (domexception e) catch (saxexception e) catch (exception e)

// get meta directives

htmlmetaprocessor.getmetatags(metatags, root, base);

if (log.istraceenabled())

// check meta directives

if (!metatags.getnoindex())

try catch (saxexception e)

sb.setlength(0);

if (log.istraceenabled())

utils.gettitle(sb, root); // extract title

title = sb.tostring().trim();

}if (!metatags.getnofollow())

utils.getoutlinks(basetag!=null?basetag:base, l, root);

outlinks = l.toarray(new outlink[l.size()]);

if (log.istraceenabled())

}parsestatus status = new parsestatus(parsestatus.success);

if (metatags.getrefresh()) );

}parsedata parsedata = new parsedata(status, title, outlinks,

content.getmetadata(), metadata);

parseresult parseresult = parseresult.createparseresult(content.geturl(),

new parseimpl(text, parsedata));

// run filters on parse

parseresult filteredparse = this.htmlparsefilters.filter(content, parseresult,

metatags, root);

if (metatags.getnocache())

return filteredparse;

}

我們從**中能夠看到詳細解析text的位置,我們須要改動的就是這個位置的**了,能夠通過檢視原始碼,nutch是 通過dom tree的方式進行解析text內容的,而我在這裡為了拿到page的正文部分的內容,我選用了開源的工具boilerpipe進行正文的提取。插入如上函式的**段為:

text = boilerpipeutils.getmainbodytextbyboilerpipe(new inputsource(

new bytearrayinputstream(content.getcontent())));

if(text.equals(""))

}else if (log.istraceenabled())

filewriter fw = new filewriter("e://mainbodypage",true);

fw.write("url::" + content.geturl() + "\n");

fw.write("text::" + text + "\n");

fw.close();

我將相應的page的url和text內容寫入到特定的path下。這樣能夠方便測試,如上**段呼叫的靜態方法類例如以下:

package org.apache.nutch.parse.html;

import org.xml.sax.inputsource;

import org.xml.sax.saxexception;

import de.l3s.boilerpipe.boilerpipeextractor;

import de.l3s.boilerpipe.boilerpipeprocessingexception;

import de.l3s.boilerpipe.document.textdocument;

import de.l3s.boilerpipe.extractors.commonextractors;

import de.l3s.boilerpipe.sax.boilerpipesaxinput;

public class boilerpipeutils

}

至此就完畢了外掛程式的功能。在eclipse下執行build project後執行如上的crawl命令,就可以得到自己想要的正文部分的parse_text資料了。假設在cwgwin下執行crawl命令,還會報noclassdeffound的runtimeexception,未指定jar包,上述三個jar包入runtime/local/lib資料夾可以。

然而boilerpipe該文字提取有改進的餘地,不理想;進一步定製,也可以用於提取特定**text資訊。

postek二次開發 POSTEK二次開發介面

例項簡介 例項截圖 核心 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using ...

mcms二次開發 YzmCMS二次開發手冊

摘要 yzmcms是採用mvc設計模式開發,基於模組和操作的方式進行訪問,採用單一入口模式進行專案部署和訪問,無論訪問任何乙個模組或者功能,只有一.yzmcms是採用mvc設計模式開發,基於模組和操作的方式進行訪問,採用單一入口模式進行專案部署和訪問,無論訪問任何乙個模組或者功能,只有乙個統一的入口...

mcms二次開發 YzmCMS二次開發手冊

yzmcms是採用mvc設計模式開發,基於模組和操作的方式進行訪問,採用單一入口模式進行專案部署和訪問,無論訪問任何乙個模組或者功能,只有乙個統一的入口。一 基本目錄結構.根目錄 cache 快取目錄 必須可寫入 common 全站公共目錄 必須可寫入 uploads 預設上傳目錄 必須可寫入 yz...