簡體   English   中英

如何使用帶有Heritrix 3.1的HeaderedArchiveRecord遍歷WARC文件

[英]How to loop through WARC files using HeaderedArchiveRecord with Heritrix 3.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(...)方法中的代碼曾經引發類似的異常,但是在我移動hrecord.skipHttpHeader();之前Failed to find WARC_MAGIC hrecord.skipHttpHeader(); Header[] httpHeader = record.getContentHeaders(); 在里面。

我曾嘗試在網上搜索代碼示例以遍歷WARC文件中的記錄,但沒有找到任何示例,並且我還記得幾年前我使用heritrix 1.14做類似的事情時,我不得不做一些奇怪的事情來處理文件中的偏移量,但是WARCReader中的相關方法現在都是私有的或受保護的,因此我不希望必須使用較新的庫來執行此操作。

我成功完成了以下代碼:

Iterator<ArchiveRecord> archIt = WARCReaderFactory.get(new File(args[0])).iterator();
while (archIt.hasNext()) {
     handleRecord(archIt.next());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM