1

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 の関連するメソッドはすべてプライベートまたは保護されているため、新しいライブラリでそれを行う必要はないと思います。

4

1 に答える 1

1

次のコードで成功しました:

Iterator<ArchiveRecord> archIt = WARCReaderFactory.get(new File(args[0])).iterator();
while (archIt.hasNext()) {
     handleRecord(archIt.next());
}
于 2014-02-19T09:51:03.727 に答える