我正在使用Heritrix 3.1 Java库。为了清楚起见,我对抓取并不感兴趣,但只处理来自其他团队生成的压缩WARC(* .warc.gz)文件的数据。对于存储在WARC文件中的每个WWW文档,我需要来自记录头的一些信息,一些来自HTTP头,以及HTTP有效内容/正文的全部内容,所以我认为我需要使用HeaderedArchiveRecord类。如何使用Heritrix使用HeaderedArchiveRecord来遍历WARC文件3.1
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中的相关方法现在都是私有的或者是受保护的,所以我不希望新的库需要这样做。