最近在研究爬蟲和虛擬幣交易數據,突然看到這個貌似能當做練習。(文末附有代碼)
首先用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 。以上就是怎麼尋找我們要的實時交易數據。
那麼接下來就是怎麼抓取數據
-
打開vscode ,新建一個 python文件。
-
安裝websocket-client 包:
sudo pip3 install websocket-client
或者自己去pip官網下載。 -
然後看websocket-client包怎麼用。
前輩們寫過很多: 例如:很好的介紹如何基本地使用websocket-client
本次數據比較簡單,如何抓取看這個就行了。 -
我在寫的過程彙總碰到過幾次ssl的問題,後來就沒了。
-
可以參考另一篇文章 如何解決ssl的問題
-
以下 是代碼
以下是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的交易數據,所以才這麼寫的。代碼比較簡單,也沒有持久化處理。
如果需要採集其他數據的話,可以參照我上面的教程去找。
以下是結果數據
結果數據:
希望這篇文章能給更多人帶來啓發。
當然不能用來幹壞事!