用python打开warc文件

Posted

技术标签:

【中文标题】用python打开warc文件【英文标题】:open warc file with python 【发布时间】:2014-09-11 10:16:09 【问题描述】:

我正在尝试使用以下链接中的工具箱使用 python 打开一个 warc 文件: http://warc.readthedocs.org/en/latest/

打开文件时:

import warc
f = warc.open("00.warc.gz")

一切都很好,f 对象是:

<warc.warc.WARCFile instance at 0x1151d34d0>

但是,当我尝试使用以下方式读取文件中的所有内容时:

for record in f:
     print record['WARC-Target-URI'], record['Content-Length']

出现如下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/xxx/anaconda/lib/python2.7/site-packages/warc/warc.py", line 390, in         __iter__
record = self.read_record()
File "/Users/xxx/anaconda/lib/python2.7/site-packages/warc/warc.py", line 373, in read_record
header = self.read_header(fileobj)
File "/Users/xxx/anaconda/lib/python2.7/site-packages/warc/warc.py", line 331, in read_header
raise IOError("Bad version line: %r" % version_line)
IOError: Bad version line: 'WARC/0.18\n'

这是因为我正在使用的 warc 工具箱或其他东西不支持我的 warc 文件版本吗?

【问题讨论】:

这就是错误所说的。 【参考方案1】:

ClueWeb09 数据集以 WARC 0.18 格式提供。但是,它有几个问题。一些记录是malformed。

最普遍的问题是 WARC 标头中的额外换行符。还有一些其他格式错误的标头的情况。

此外,它不使用标准的 \r\n 行尾标记,这实际上是您的问题。

warc-clueweb library 可以处理。这是一个特殊的 python 库,用于处理 ClueWeb09 WARC 文件。根据文档

仅对原始库进行了少量修改。 warc 库的原始文档仍然保留

【讨论】:

您好,谢谢您的回答。抱歉耽搁了,但我暂时搁置了这个项目。但我一回来就会对此进行测试。再次感谢您。【参考方案2】:

是的,感谢@eyelash 对此问题的解释。

实际上,Clueweb-09 中的一些记录格式错误。但是官方的warc库和上面推荐的git repowarc-clueweb library都存在一些问题。

这个 fork repo 无法处理 Clueweb12 数据集,另一个问题是它在处理每个 .warc.gz 文件时可能会丢失 1-2 个文档。

所以我更改了一些代码来支持 Clueweb09 和 Cluewe12 数据集。这是我的 repo,它已经在 1000 亿页上进行了测试,my warc tools 从 warc-clueweb 库和官方 repo 分叉和更改。

【讨论】:

以上是关于用python打开warc文件的主要内容,如果未能解决你的问题,请参考以下文章

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

Python:如何拆分WARC文件?

如何在python3中使用lzma(* .warc.xz)压缩warc记录?

WARC 文件中的记录数

如何解析 WARC 文件?

在StormCrawler上获取拓扑以正确编写warc文件