python通過wss抓取BiKi網站上面的虛擬幣實時交易數據

最近在研究爬蟲和虛擬幣交易數據,突然看到這個貌似能當做練習。(文末附有代碼)

首先用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
    本次數據比較簡單,如何抓取看這個就行了。

  4. 我在寫的過程彙總碰到過幾次ssl的問題,後來就沒了。

  5. 可以參考另一篇文章 如何解決ssl的問題

  6. 以下 是代碼

以下是github地址

##[email protected]
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")
    if ('ping' in ret):
        return
    text = demjson.decode(ret)
    print(text)
    for index in range(len(text['tick']['data'])):
        print('ds='+str(text['tick']['data'][index]['ds']))
        print('price='+str(text['tick']['data'][index]['price']))
        print('side='+str(text['tick']['data'][index]['side']))
        print('vol='+str(text['tick']['data'][index]['vol']))
        print('###################分割線#############################')
    # print(text.keys())
    # print('amount='+str(text['tick']['data'][0]['amount']) )
    # print('ds='+str(text['tick']['data'][0]['ds']))
    # print('id='+str(text['tick']['data'][0]['id']))
    # print('price='+str(text['tick']['data'][0]['price']))
    # print('side='+str(text['tick']['data'][0]['side']))
    # print('ts='+str(text['tick']['data'][0]['ts']))
    # print('vol='+str(text['tick']['data'][0]['vol']))

# 程序報錯時,就會觸發on_error事件
def on_error(ws, error):
    print(error)

# 程序關閉後觸發close時間
def on_close(ws):
    print("Connection closed ……")

# 連接到服務器之後就會觸發on_open事件
def on_open(ws):
    # ws.send('{"event":"req","params":{"channel":"review"}}') #獲取review數據
    # 獲取btcusdt
    ws.send('{"event": "sub", "params": {"channel": "market_btcusdt_trade_ticker", "cb_id": "btcusdt", "top": 100}}')

if __name__ == "__main__":
    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('{"event": "sub", "params": {"channel": "market_btcusdt_trade_ticker", "cb_id": "btcusdt", "top": 100}}')

這行數據是因爲我要採集btc的交易數據,所以才這麼寫的。代碼比較簡單,也沒有持久化處理。
如果需要採集其他數據的話,可以參照我上面的教程去找。

以下是結果數據
在這裏插入圖片描述
結果數據:
在這裏插入圖片描述

希望這篇文章能給更多人帶來啓發。

當然不能用來幹壞事!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章