検索エンジンと Web クローラーは初めてです。特定の Web サイトのすべての元のページを html ファイルとして保存したいのですが、Apache Nutch ではバイナリ データベース ファイルしか取得できません。Nutch で元の html ファイルを取得するにはどうすればよいですか?
Nutch はそれをサポートしていますか? そうでない場合、目標を達成するために他にどのようなツールを使用できますか (分散クロールをサポートするツールの方が優れています)。
検索エンジンと Web クローラーは初めてです。特定の Web サイトのすべての元のページを html ファイルとして保存したいのですが、Apache Nutch ではバイナリ データベース ファイルしか取得できません。Nutch で元の html ファイルを取得するにはどうすればよいですか?
Nutch はそれをサポートしていますか? そうでない場合、目標を達成するために他にどのようなツールを使用できますか (分散クロールをサポートするツールの方が優れています)。
さて、nutchはクロールされたデータをバイナリ形式で書き込むので、それをhtml形式で保存したい場合は、コードを変更する必要があります。(これは、あなたがナッチに慣れていない場合は苦痛になります)。
HTMLページを取得するための迅速で簡単なソリューションが必要な場合:
wget
使用する予定のページ/URLのリストが非常に少ない場合は、URLごとに呼び出すスクリプトを使用して実行することをお勧めします。編集:
独自のnutchプラグインを作成するのは素晴らしいことです。あなたの問題は解決されるでしょう、そしてあなたはあなたの仕事を提出することによってnutchに貢献することができます!!! (コードとデザインの点で)ナッチに慣れていない場合は、新しいプラグインの構築に多くの時間を費やす必要があります...そうでなければ、簡単に実行できます。
あなたのイニシアチブを支援するためのいくつかの指針:
これは、独自のnutchプラグインの作成について説明しているページです。
Fetcher.javaから始めます。647〜648行目を参照してください。これは、URLごとにフェッチされたコンテンツを取得できる場所です(正常にフェッチされたページの場合)。
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
updateStatus(content.getContent().length);
プラグインを呼び出すには、この直後にコードを追加する必要があります。content
オブジェクトを渡します。content.getContent()
今では、それが必要なURLのコンテンツであると推測しているでしょう。プラグインコード内で、それをいくつかのファイルに書き込みます。ファイル名はURL名に基づいている必要があります。そうでない場合、それを操作するのは困難になります。URLはによって取得できますfit.url
。
この回答を更新するには -
あなたの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)
{
}
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 ---------------------------------------------\\