Content-Encoding:gzip-創宇について

1966 ワード

Content-Encoding:gzip-創宇について

Content-Encoding:gzipについて


2012-04-20
背景==ページキャプチャプログラム(例えば爬虫類)がページをキャプチャする際にAccept-Encoding:gzipを送信していない場合、out:今日99%を超えるページキャプチャプログラムはgzip(またはdeflate)符号化をサポートすると宣言します.
もしあなたのプログラムがこの99%に属しているなら、おめでとうございますが、あまり早く喜ばないでください.あなたのプログラムはContent-Encoding:gzipを正しく処理していますか?
問題==典型的な処理Content-Encoding:gzipのコードフラグメント(python):
html_data = GzipFile(fileobj=StringIO(html_data), mode="r").read()
仮定html_DataはWebサーバが返すContent-Encodingがgzipのデータである.
多くの場合、上記のコードは正しく処理されます.しかし、残念なことに、urlの中には、ブラウザが正常にコンテンツを表示することができますが、Webページのキャプチャプログラムが間違っていることがわかります.
分析==すべてのWebサーバ(またはアプリケーション)が規律を守る公民ではない.ごく少数のアプリケーションでは、gzip圧縮後のデータの後ろに「しっぽ」データが追加されます.PythonのGzipFileモジュールなどのデータ解凍モジュールでは、処理異常が発生します.
例外はブラウザです.現実世界の複雑さを十分に理解し、考慮すると、多くの「尻尾」を自動的に捨て、ページデータを正常に解凍し、処理します.
解決==Python GzipFileモジュールには、正常に解凍されたデータを保存するextrabufという非公開属性があります.したがって、次のコードはより互換性があります.
try:
    gf = GzipFile(fileobj=StringIO(html_data), mode="r")
    html_data = gf.read()
except:
    html_data = gf.extrabuf