2

私の仕事では、Web サイトをスクレイピングし、gzip 圧縮された Web アーカイブ (拡張子は「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-library 自体で対処されています。

4

1 に答える 1

5

、でのファイル分割と読み込みのカスタムgzip処理が全体的に壊れているようです(python 2.7.9、2.7.10、および2.7.11でテスト済み)。新しいヘッダーの代わりにデータを受信しないと、すぐに停止します。warc.gzip2.GzipFilewarc.utils.FilePartwarc.warc.WARCReader

基本的な stdlibgzipは、連結されたファイルを問題なく処理するように見えるため、これも同様に機能するはずです。

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()
于 2016-03-23T12:32:56.020 に答える