#前回のおさらい
前回はweb上で取得されているxhr(XMLHttpRequest)の値をpythonに渡してみた(1/2)を参照して下さい
前回は、Webでのxhrをモニターしてpythonでその値を取得してみる概略の説明と実際にWebでxhrをモニタする所まで説明しましたが、今回は実際に取得したxhrをWebSocket通信でpythonに渡す方法の説明を行っていきます。
#4 WebSocket通信をどう実装するか?
WebSocketを出来るだけ簡単に実装するには、どれがいいんだろうと色々調べてみました。今回の使用方法では簡単なデータ送信しかしないので出来るだけ簡単な方法を探した結果、WebSocketのサーバーとクライアントは以下の物を使う事にしました。
- xhrを取得するWeb側
selenium2+JavaScriptで実施。余程古いchromeでない限りサポートされているので問題ないと思います。
参考 wikipedia WebSocket 4.実装状況 - WebSocketサーバー
pythonで実装。多機能である必要もないのと、実装が楽そうなので以下を使いました。
Pithikos/python-websocket-server - WebSocketクライアント
pythonで実装が楽そうなので。後イベント・ドリブン型でなくても書けそうなので(short type?)これにしてみました。
websocket client for python - 今回は一つPC内で実行しているのでソケットは127.0.0.1:8089にしています。外部(ローカルネット外)と行う場合は認証とか実装した方がいいと思います。
ポートが他で使用中の場合は適宜変えてみて下さい。(psutil等で最初に起動するサーバースクリプトで未使用ポートを調べて結果をファイルなんかに書き出して他のスクリプトが参照するとか出来そうですが今回はそこまで実装していません。)
#5. 実行スクリプト
- Web側での実行スクリプトは前回3 xhrのモニタの実行スクリプトのxhr_mon.pyを使って下さい
- WebSocketサーバー
from websocket_server import WebsocketServer
def new_client(client, server):
server.send_message_to_all("Hey all, a new client has joined us")
def send_msg_allclient(client, server,message):
server.send_message_to_all(message)
server = WebsocketServer(8089, host='127.0.0.1')
server.set_fn_new_client(new_client)
server.set_fn_message_received(send_msg_allclient)
server.run_forever()
- WebSocketクライアント
import json
from websocket import create_connection
ws = create_connection("ws://127.0.0.1:8089/")
ask_val = [0]*6
datetime = ['0']*6
name =["","BTC","ETH","BCH","LTC","XRP"]
while(True):
#ws.send("Hello, World")
#time.sleep(1)
try:
ret = json.loads(ws.recv())
except:
continue
for nn in range(1,6):
if(ret['data'][nn]['askValidFlag']==1):
ask_val[nn] = ret['data'][nn]['bid']
datetime[nn] = ret['data'][nn]['createDatetime']
print(name[nn],datetime[nn],ask_val[nn])
#6. 実行方法
最初にWebSockサーバーを立ち上げます。
python -m server.py
これは終了しない&させないので、別のターミナル等でxhrのモニターを立ち上げます。
python -m xhr_mon.py
これも終了しない&させないので、別のターミナル等でWebClientを立ち上げます
python -m client.py
すると以下のような結果が延々と出て来くると成功です。
BTC 2017-12-10T06:59:29Z 1621631
ETH 2017-12-10T06:59:29Z 50844
BCH 2017-12-10T06:59:29Z 150615
LTC 2017-12-10T06:59:29Z 16139
XRP 2017-12-10T06:59:29Z 26.579
BTC 2017-12-10T06:59:29Z 1621631
ETH 2017-12-10T06:59:29Z 50844
BCH 2017-12-10T06:59:29Z 150615
LTC 2017-12-10T06:59:29Z 16139
XRP 2017-12-10T06:59:29Z 26.579
BTC 2017-12-10T06:59:31Z 1621882
ETH 2017-12-10T06:59:31Z 50853
BCH 2017-12-10T06:59:31Z 150642
LTC 2017-12-10T06:59:31Z 16142
XRP 2017-12-10T06:59:31Z 26.588
#最後に
XHRでリアルタイムにデータを受けているWebページのデータを比較的簡単にpython側で得る事が出来ました。また今回の方法はxhrで通信しているwebページでそのまま使えそうな気がしています。
株式や先物等のデータは送受信した時のデータなので、全部の取引データではない事を考慮した方がいいと思います。大きく値が動いたかどうか等の監視用とかには使えるかなと思っています。