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 回答