最近在研究爬虫和虚拟币交易数据,突然看到这个貌似能当做练习。(文末附有代码)
首先用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左右,持续刷新,这个就是我们要的数据。
那么接下来就是怎么抓取数据
打开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的交易数据,所以才这么写的。代码比较简单,也没有持久化处理。
如果需要采集其他数据的话,可以参照我上面的教程去找。
希望这篇文章能给更多人带来启发。
当然不能用来干坏事!