大約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...