【Python】websocketで受け取ったデータがgzipされたものだった場合の対処法

Python

仮想通貨の取引所データはwebsocketで配信

取引所などの価格データの更新はwebsocketを通じて配信されることが多くなってきています。

websocketでデータを受け取るのはhttpsヘッダーなどの余計なもののやり取り(オーバーヘッド)がないため大変軽くて便利です。

websocket通信をデベロッパーツールで手軽に確認

Chrome ⇒ 表示 ⇒ 開発/管理 ⇒ デベロッパーツール

websocketの通信を見ることができます。

WSというところクリックするとWebSocketの通信のみを表示します。

Dataというところの緑の部分がサーバーにアップロードされたデータで黄色のところがダウンロードされたデータです。

Chromeのデベロッパーツールで見るとバイナリメッセージ(Binary Message)という形で配信されているものがあります。そこをクリックすると下の欄に数字が表示されます。

1f8bはgzip圧縮されたデータに特徴的な値

1f8bという値が見えると思いますが、それらはgzipデータに特徴的な値です。

送信するデータをより小さくするために、データがgzipで圧縮されています。

pythonでwebsocket-clientを使えば簡単にデータを取得できますが、この例のようにgzipで圧縮されたケースでは解凍しなければデータを読み取れません。

pythonのgzipモジュールにはdecompressという関数があってこれを使えばデータを解凍することができます。

rawdata = gzip.decompress(data)
data を解凍し、解凍データを含む bytes オブジェクトを返します。

これでprint(rawdata)とすれば中身が表示されます。

コメント