Python 无法完全读取 "warc.gz" 文件

Python cannot read "warc.gz" file completely

对于我的工作,我抓取网站并将它们写入 gzip 网络存档(扩展名为 "warc.gz")。我使用 Python 2.7.11 和 warc 0.2.1 库。

我注意到对于大多数文件,我无法使用 warc 库完全读取它们。例如,如果 warc.gz 文件有 517 条记录,我只能读取其中的大约 200 条。

经过一些研究,我发现这个问题只发生在 gzip 文件中。扩展名为"warc"的文件没有这个问题。

我发现有些人也有这个问题(https://github.com/internetarchive/warc/issues/21),但没有找到解决方案。

我猜测 Python 2.7.11 中的 "gzip" 可能存在错误。是否有人有这方面的经验,并且知道如何解决这个问题?

提前致谢!

示例:

我像这样创建新的 warc.gz 文件:

import warc
warc_path = "\some_path\file_name.warc.gz"
warc_file = warc.open(warc_path, "wb")

写记录我使用:

record = warc.WARCRecord(payload=value, headers=headers)
warc_file.write_record(record)

这将创建完美的 "warc.gz" 文件。他们没有问题。所有,包括“\r\n”都是正确的。但是当我阅读这些文件时问题就开始了。

阅读我使用的文件:

warc_file = warc.open(warc_path, "rb")

循环访问我使用的记录:

for record in warc_file:
    ...

问题是,在 "warc.gz" 文件的循环过程中,并非所有记录都找到了,而 "warc" 文件却找到了所有记录。使用这两种类型的文件在 warc 库本身中得到解决。

似乎 warc.gzip2.GzipFile, file splitting with warc.utils.FilePart and reading in warc.warc.WARCReader is broken as a whole (tested with python 2.7.9, 2.7.10 and 2.7.11). It stops short when it receives no data instead of a new header 中的自定义 gzip 处理。

基本的 stdlib gzip 似乎可以很好地处理链接文件,所以这也应该有效:

import gzip
import warc

with gzip.open('my_test_file.warc.gz', mode='rb') as gzf:
    for record in warc.WARCFile(fileobj=gzf):
        print record.payload.read()