python通过wss抓取BiKi网站上面的虚拟币实时交易数据
顾大潼
2020年08月29日 08:00

最近在研究爬虫和虚拟币交易数据,突然看到这个貌似能当做练习。(文末附有代码)

首先用Chrome打开网址 BiKi的官方网址 https://www.biki.com/zh_CN/trade/BTC_USDT 发现中间有echart画的图,左边是币种的选择,右边是实时交易买入卖出的内容,也就是我们要抓取的内容。

这些红框画出来的数据,就是我们的目标。 我们先要观察它的特性。 1.动态数据 2.F12进去发现页面上没有数据

用F12进去之后发现这个数据是动态生成的。而且界面上的数据也是参考这个数据。所以得出结论 这个就是我们要寻找的元数据的地方。

Elements看完了,没什么收获,接下来找到network。看有没有什么js文件或者数据是一直在请求的。

我们发现了里面有个叫ws的请求。感觉到这个可能用的是用websocket和服务端 建立的长连接,一直推数据过来。 而且里的request url 是wss ,表明是通过ssl加密的。

然后我们点开message 发现里面会一直收到二进制文件。大多都在200b左右,持续刷新,这个就是我们要的数据。

此时,刷新一下界面。发现有很多绿色的json数据。这个就是网页向服务端请求的数据。请求了之后,服务端才会向你发送想要的数据。

ok 。以上就是怎么寻找我们要的实时交易数据。

那么接下来就是怎么抓取数据

  1. 打开vscode ,新建一个 python文件。

  2. 安装websocket-client 包:sudo pip3 install websocket-client 或者自己去pip官网下载。

  3. 然后看websocket-client包怎么用。前辈们写过很多: 例如:很好的介绍如何基本地使用websocket-client:https://blog.csdn.net/Darkman_EX/article/details/82592118 本次数据比较简单,如何抓取看这个就行了。

  4. 我在写的过程汇总碰到过几次ssl的问题,后来就没了。

  5. 可以参考另一篇文章  如何解决ssl的问题:https://blog.csdn.net/Lazybones_3/article/details/81662980?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

  6. 以下 是代码

以下是github地址:https://github.com/GuYang0902/BiKiCrawler

##13482198105@163.com

import websocket

import ssl

import gzip

import time

import datetime

import json

import demjson

 

def on_message(ws, message):  # 服务器有数据更新时,主动推送过来的数据

    # print(message)

    ret = gzip.decompress(message).decode("utf-8&#​34;)

    if ('ping&#​39; in ret):

        return

    text = demjson.decode(ret)

    print(text)

    for index in range(len(text['tick&#​39;]['data&#​39;])):

        print('ds=&#​39;+str(text['tick&#​39;]['data&#​39;][index]['ds&#​39;]))

        print('price=&#​39;+str(text['tick&#​39;]['data&#​39;][index]['price&#​39;]))

        print('side=&#​39;+str(text['tick&#​39;]['data&#​39;][index]['side&#​39;]))

        print('vol=&#​39;+str(text['tick&#​39;]['data&#​39;][index]['vol&#​39;]))

        print('#​##################分割线#​############################&#​39;)

    # print(text.keys())

    # print(&#​39;amount='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;amount']) )

    # print(&#​39;ds='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;ds']))

    # print(&#​39;id='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;id']))

    # print(&#​39;price='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;price']))

    # print(&#​39;side='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;side']))

    # print(&#​39;ts='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;ts']))

    # print(&#​39;vol='+str(text[&#​39;tick'][&#​39;data'][0][&#​39;vol']))

 

# 程序报错时,就会触发on_error事件

def on_error(ws, error):

    print(error)

 

# 程序关闭后触发close时间

def on_close(ws):

    print("Connection closed ……&#​34;)

 

# 连接到服务器之后就会触发on_open事件

def on_open(ws):

    # ws.send(&#​39;{"event&#​34;:"req&#​34;,"params&#​34;:{"channel&#​34;:"review&#​34;}}') #​获取review数据

    # 获取btcusdt

    ws.send('{&#​34;event": &#​34;sub", &#​34;params": {&#​34;channel": &#​34;market_btcusdt_trade_ticker", &#​34;cb_id": &#​34;btcusdt", &#​34;top": 100}}&#​39;)

 

if __name__ == "__main__&#​34;:

    websocket.enableTrace(True)

    ws = websocket.WebSocketApp("wss://wspool.mpuuss.top/kline-api/ws",

                                on_message=on_message,

                                on_error=on_error,

                                on_close=on_close)

    ws.on_open = on_open

    ws.run_forever()

 

ws.send('{&#​34;event": &#​34;sub", &#​34;params": {&#​34;channel": &#​34;market_btcusdt_trade_ticker", &#​34;cb_id": &#​34;btcusdt", &#​34;top": 100}}&#​39;)

 

这行数据是因为我要采集btc的交易数据,所以才这么写的。代码比较简单,也没有持久化处理。

如果需要采集其他数据的话,可以参照我上面的教程去找。

以下是结果数据

结果数据:

希望这篇文章能给更多人带来启发。

当然不能用来干坏事!