2014-02-09 62 views
1

我正在使用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中的相關方法現在都是私有的或者是受保護的,所以我不希望新的庫需要這樣做。

回答

1

我用下面的代碼的成功:

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