Heritrix 3.1 Java ライブラリを使用しています。明確にするために、私はクロールには興味がありませんが、別のチームによって生成された圧縮された WARC (*.warc.gz) ファイルからのデータの処理にのみ関心があります。WARC ファイルに保存されている各 WWW ドキュメントについて、レコード ヘッダーからの情報、HTTP ヘッダーからの情報、および HTTP ペイロード/本文の完全なコンテンツが必要なので、HeaderedArchiveRecord クラスを使用する必要があると思います。
WARCReader warcReader = WARCReaderFactory.get(warcFile);
int inputSequence = -1;
ArchiveRecord record = warcReader.get();
while(record != null){
inputSequence++;
// Skip the 0th record, which is just the archive guff.
if (inputSequence == 0) {
// print some info but do not process this record
}
else if (! record.hasContentHeaders()) {
// print some info but do not process this record
}
else {
HeaderedArchiveRecord hRecord = new HeaderedArchiveRecord(record);
ArchiveRecordHeader archiveHeader = hRecord.getHeader();
gate.Document document = makeDocumentHeritrix(archiveHeader,
inputSequence, hRecord);
//...
}
record.close();
record = warcReader.get(); // line 754
}
warcReader.close();
これを実行すると、この原因で例外が発生します
Caused by: java.io.IOException: Failed to read WARC_MAGIC
at org.archive.io.warc.WARCRecord.parseHeaders(WARCRecord.java:116)
at org.archive.io.warc.WARCRecord.<init>(WARCRecord.java:90)
at org.archive.io.warc.WARCReader.createArchiveRecord(WARCReader.java:94)
at org.archive.io.warc.WARCReader.createArchiveRecord(WARCReader.java:44)
at org.archive.io.ArchiveReader.get(ArchiveReader.java:159)
at
gate.arcomem.batch.Enrichment.makeCorpusWithHeritrix(Enrichment.java:754)
私の行754は上記のとおりです。私のメソッドのコードはmakeDocumentHeritrix(...)
同様の例外をスローしていましたがFailed to find WARC_MAGIC
、その行hrecord.skipHttpHeader();
を前に移動するまではHeader[] httpHeader = record.getContentHeaders();
そうでした。
WARCファイルのレコードをループするコードの例をウェブで検索しようとしましたが、何も見つかりませんでした.数年前にheritrix 1.14を使用して同様のことをしたとき、奇妙なことをしなければならなかったことを思い出します.ファイル内のオフセットを操作する必要はありませんが、WARCReader の関連するメソッドはすべてプライベートまたは保護されているため、新しいライブラリでそれを行う必要はないと思います。