コンテンツの圧縮

XMLデータ等々を取得する場合、そのデータを圧縮し取得できるようだ。話には聞いていたが詳しく知らなかった。

>>> import urllib2, httplib
>>> httplib.HTTPConnection.debuglevel = 1
>>> request = urllib2.Request('取得するXMLデータのURL')
>>> request.add_header('Accept-encoding', 'gzip')
>>> opener = urllib2.build_opener()
>>> f = opener.open(request)
>>> compresseddata = f.read()
>>> len(compresseddata)
8427
>>> import StringIO
>>> compressedstream = StringIO.StringIO(compresseddata)
>>> import gzip
>>> gzipper = gzip.GzipFile(fileobj=compressedstream)
>>> data = gzipper.read()
>>> print data
・・・
>>> len(data)
24102

面白いね。これって「gzip」がサーバ側でサポートされていないと使えないよね。まあLinux系ならサポートされているだろうが、Windows系は注意が必要だよね。コンテンツ側で利用するXMLデータやその他データにも利用できそうだよね。勉強になった。

他の言語でもできるよね。これってリクエストの「Accept-encoding」に「gzip」を設定すれば、要求された側はコンテンツを指定された方式で圧縮してレスポンスを返すって事ですよね。

またクライアント側では「Conntent-Encoding」のヘッダーを見て送信されてきたデータが圧縮されているのか、されていないのかが判断できるので処理を書き分ける事も可能。

ん〜HTTPヘッダを意識したコーディングをやって覚えがないのは痛いな。これからは注意しよ。

参考その1:http://www.kawa.net/works/perl/contenc/gzip-test.html
参考その2:http://www.dengeki.ne.jp/soft/cgi/ziptrans.html