我是新的搜索引擎和網絡爬蟲。現在我想將所有原始頁面作爲html文件存儲在特定網站中,但使用Apache Nutch,我只能獲取二進制數據庫文件。我如何使用Nutch獲取原始html文件?如何保存原點HTML文件與Apache的Nutch
是否Nutch的支持呢?如果沒有,我可以用什麼樣的工具來實現我的目標。(支持分佈式抓取工具更好。)
我是新的搜索引擎和網絡爬蟲。現在我想將所有原始頁面作爲html文件存儲在特定網站中,但使用Apache Nutch,我只能獲取二進制數據庫文件。我如何使用Nutch獲取原始html文件?如何保存原點HTML文件與Apache的Nutch
是否Nutch的支持呢?如果沒有,我可以用什麼樣的工具來實現我的目標。(支持分佈式抓取工具更好。)
好,Nutch的會寫以二進制形式抓取的數據,所以如果你想,要保存在html格式,你將不得不修改代碼。 (如果你是新手,這會很痛苦)。
如果你想要得到的HTML頁面快速和簡單的解決方案:
wget
腳本完成的URL列表每個網址。編輯:
寫你自己的Nutch的插件將是巨大的。你的問題將得到解決,你可以通過提交你的作品來貢獻給nutch!如果你是nutch的新手(根據代碼&設計),那麼你將不得不投入大量的時間來構建一個新的插件......否則它很容易做到。
幫助您主動幾個要點:
Here是在談論自己編寫插件Nutch的頁面。
開始Fetcher.java。見行647-648。這是您可以根據網址獲取獲取內容的地方(對於獲取成功的頁面)。
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
updateStatus(content.getContent().length);
您應該在此之後添加代碼以調用您的插件。通過content
對象。到現在爲止,你會猜想content.getContent()
是你想要的url的內容。在插件代碼中,將其寫入某個文件。文件名應該基於url名稱,否則很難處理。網址可以通過fit.url
獲得。
您必須run Nutch in Eclipse做修改。
當你能夠運行,打開Fetcher.java之間添加行「內容保護」命令行。
case ProtocolStatus.SUCCESS: // got a page
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS, fit.outlinkDepth);
updateStatus(content.getContent().length);'
//------------------------------------------- content saver ---------------------------------------------\\
String filename = "savedsites//" + content.getUrl().replace('/', '-');
File file = new File(filename);
file.getParentFile().mkdirs();
boolean exist = file.createNewFile();
if (!exist) {
System.out.println("File exists.");
} else {
FileWriter fstream = new FileWriter(file);
BufferedWriter out = new BufferedWriter(fstream);
out.write(content.toString().substring(content.toString().indexOf("<!DOCTYPE html")));
out.close();
System.out.println("File created successfully.");
}
//------------------------------------------- content saver ---------------------------------------------\\
使用這種方法會跳過創建二進制文件嗎? – 2012-12-26 00:06:29
不,這只是在創建二進制文件之前保存原始HTML文件。如果需要,您必須排除二進制文件創建行。不過,我認爲這將是一項艱鉅的工作,因爲Nutch是一個非常龐大而複雜的項目。 – 2012-12-26 00:16:56
要更新這個答案 -
它可以從你的crawldb段文件夾上傳過程中的數據,並在閱讀HTML(包括其他數據Nutch的已存儲)直接。
Configuration conf = NutchConfiguration.create();
FileSystem fs = FileSystem.get(conf);
Path file = new Path(segment, Content.DIR_NAME + "/part-00000/data");
SequenceFile.Reader reader = new SequenceFile.Reader(fs, file, conf);
try
{
Text key = new Text();
Content content = new Content();
while (reader.next(key, content))
{
System.out.println(new String(content.GetContent()));
}
}
catch (Exception e)
{
}
在apache Nutch 2.3中。1
您可以保存編輯原始的HTML代碼的Nutch首先通過以下https://wiki.apache.org/nutch/RunNutchInEclipse
您結束在eclipse編輯文件FetcherReducer.java ruunning後的Nutch在Eclipse中運行Nutch的,這個代碼添加到輸出方法,運行ant再次蝕重建類
最後,原始的HTML將加入到reportUrl列在你的數據庫
if (content != null) {
ByteBuffer raw = fit.page.getContent();
if (raw != null) {
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(raw.array(), raw.arrayOffset() + raw.position(), raw.remaining());
Scanner scanner = new Scanner(arrayInputStream);
scanner.useDelimiter("\\Z");//To read all scanner content in one String
String data = "";
if (scanner.hasNext()) {
data = scanner.next();
}
fit.page.setReprUrl(StringUtil.cleanField(data));
scanner.close();
}
謝謝你,TejasP。我剛剛聽說Nutch有一個插件機制來擴展它的功能。我想知道我是否可以編寫一些插件來實現它? – Freedom 2012-04-09 09:10:06
@Freedom:看到我上面的編輯。希望能幫助你。 – 2012-04-09 17:53:10
感謝您的詳細信息,這對我非常有幫助。這是我跳入Nutch的指南。非常感謝! – Freedom 2012-04-10 02:25:03