在我的工作中,我抓取网站并将其写入gzip web档案(扩展名为"warc.gz")。我使用Python 2.7.11和warc 0.2.1库。
我注意到,对于大多数文件,我无法使用warc库完全阅读它们。例如,如果warc.gz文件有517条记录,我只能读取其中的200条。
经过一些研究,我发现这个问题只发生在gzipped文件中。扩展名为"warc"的文件不存在此问题。
我发现有些人也有这个问题(https://github.com/internetarchive/warc/issues/21),但没有找到解决方案。
我想Python 2.7.11中的"gzip"可能有一个错误。也许有人对此有经验,知道该怎么办吗?
提前感谢!
示例:
我创建新的warc.gz文件如下:
import warc
warc_path = "\some_pathfile_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测试)。当它没有接收到数据而不是新的头时,它会短暂停止。
基本的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()