在我的工作中,我抓取网站并将它们写入 gzip 压缩的网络存档(扩展名为“warc.gz”)。我使用 Python 2.7.11 和 warc 0.2.1 库。
我注意到对于大多数文件,我无法使用 warc-library 完全读取它们。例如,如果 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
中的自定义 gzip
处理,使用 warc.utils.FilePart
分割文件并阅读warc.warc.WARCReader
整体损坏(使用 python 2.7.9、2.7.10 和 2.7.11 测试)。当它 receives no data instead of a new header 时它会停止。 .
看起来基本的 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()
关于Python无法完全读取 "warc.gz"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173786/