有些网站为了追求数据的实时更新,很多时候会采用 websocket 的方式,例如股票交易数据、数据货币交易数据等。
那什么是websocket?
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
爬取目标
打开网址后F12-->再次刷新页面-->点击WS,就会出现一条目录。
点击目录右边的Headers就能找到websocket的请求url。
点击Message就能看到真正的数据交互了,绿箭头是客户端传给服务器的数据,红箭头则是服务器传给客户端的数据。
那到底这些数据如何才能爬取到呢?
http请求可以用requests库,但是websocket就需要用到websocket库。
第一步 安装websocket
第二步 看交互数据
因为websocket只发生一次握手,所以需要确认网络请求和握手数据。这个可以根据开发者工具搞定(但是有的网站会将数据加密)-
第三步 写代码
import websocket wbsocket_url = 'wss://api-v1.eosflare.io/socket.io/?EIO=3&transport=websocket' #创建websocket请求 ws = websocket.create_connection(url=wbsocket_url,timeout=10) #接收 服务器发过来的两条信息 for i in range(2): content = ws.recv() print(content) #注意:握手数据应注意格式与准确性,别以为赋值粘贴就完事了,下面的数据就有一个坑 data = '42["message","{\\"_url\\":\\"/chain/get_user_whales\\",\\"_method\\":\\"POST\\",\\"_headers\\":{\\"content-type\\":\\"application/json\\"},\\"page\\":' + str(page) + ',\\"limit\\":50,\\"sortBy\\":\\"total\\",\\"ascending\\":false,\\"lang\\":\\"zh-CN\\"}"]' #客户端发送握手数据 ws.send(data) #客户端接收服务器返回的数据 content = ws.recv() #关闭请求 ws.close()
如果你够仔细的话就会发现一个规律,下一页数据的握手请求数据就只是page后面的数字改变了一下,所以再次修改代码,获取前5页的数据。
import websocket
import json
from time import sleep
wbsocket_url = 'wss://api-v1.eosflare.io/socket.io/?EIO=3&transport=websocket'
ws = websocket.create_connection(url=wbsocket_url,timeout=10)
for i in range(2):
content = ws.recv()
print(content)
# 爬取前5页数据
for page in range(5):
sleep(3)
data = '42["message","{\\"_url\\":\\"/chain/get_user_whales\\",\\"_method\\":\\"POST\\",\\"_headers\\":{\\"content-type\\":\\"application/json\\"},\\"page\\":' + str(page) + ',\\"limit\\":50,\\"sortBy\\":\\"total\\",\\"ascending\\":false,\\"lang\\":\\"zh-CN\\"}"]'
ws.send(data)
content = ws.recv()
str_dic = list(eval(content[2:]))[1]
data = json.loads(str_dic)['holders']
for i in data:
print(i)
ws.close()