Как перебрать файлы WARC с помощью HeaderedArchiveRecord с Heritrix 3.1

Я использую библиотеку Heritrix 3.1 Java. Просто для ясности, я не заинтересован в сканировании, а только в обработке данных из сжатых файлов WARC (*.warc.gz), созданных другой группой. Для каждого WWW-документа, хранящегося в файле WARC, мне нужна некоторая информация из заголовка записи, некоторая информация из заголовков 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 теперь все закрытые или защищенные, поэтому я не ожидал бы, что это придется делать с более новой библиотекой.

1 ответ

Я имел успех со следующим кодом:

Iterator<ArchiveRecord> archIt = WARCReaderFactory.get(new File(args[0])).iterator();
while (archIt.hasNext()) {
     handleRecord(archIt.next());
}
Другие вопросы по тегам