使用Python连接Socket.io并获取Winamax体育赛事及赔率数据的问题
我正尝试从Winamax的体育赛事页面获取赛事和赔率数据,我知道这些数据存在某个GET请求的响应里,就像浏览器Network标签页展示的相关请求截图那样。
不过我注意到网站使用了WebSocket协议,不确定该怎么处理。
我是Python新手(平时主要用R),对WebSocket也不太熟悉,但我已经在代码里找到了Socket.io的路径,以下是我尝试的代码:
import socketio sio = socketio.Client(logger=True, engineio_logger=True) @sio.event def connect(): print('connected!') sio.emit('add user', 'Testing') @sio.event def print_message(sid): print("Socket ID: " , sid) @sio.event def disconnect(): print('disconnected!') sio.connect('https://sports-eu-west-3.winamax.fr',transports=['websocket'], socketio_path = '/uof-sports-server/socket.io') sio.wait()
我已经成功连接上了,但不知道接下来该怎么做才能拿到目标GET请求里的实际数据。希望能得到一些提示!
我的解答:
嘿,恭喜你已经成功连上Socket.io服务啦!这已经是很棒的第一步了,接下来咱们一步步搞定数据获取的问题:
先搞懂Socket.io的核心逻辑
Socket.io和普通的GET请求不一样,它是事件驱动的——要么是你主动给服务器发特定事件请求数据,要么是服务器主动给你推送数据。你现在只是建立了连接,但还没订阅到正确的事件,也没发送服务器需要的指令,所以拿不到想要的数据。用浏览器抓包分析通信细节
回到浏览器的开发者工具,切换到WebSocket标签(或者Network里的WS分类),仔细观察已连接的Socket.io会话里的所有消息:- 看看客户端向服务器发送了哪些事件(比如可能是
subscribe、join这类,参数可能包含赛事分类ID) - 再看服务器推送的消息里,哪个事件携带了赛事和赔率数据,把这个事件名记下来
- 看看客户端向服务器发送了哪些事件(比如可能是
修改Python代码适配通信逻辑
根据你观察到的内容调整代码,举个例子:如果看到浏览器发送了订阅赛事分类的事件,就在连接成功后发送对应的请求,同时监听服务器推送数据的事件:
import socketio sio = socketio.Client(logger=True, engineio_logger=True) @sio.event def connect(): print('connected!') # 替换成你抓包看到的实际事件和参数 sio.emit('subscribe', {'sportId': 1, 'categoryId': 7, 'tournamentId': 4}) # 监听服务器推送数据的事件,这里假设事件名叫'event_data_update' @sio.event def event_data_update(data): print('拿到赛事和赔率数据啦!') print(data) # 这里可以添加数据解析、保存的逻辑 @sio.event def disconnect(): print('disconnected!') sio.connect('https://sports-eu-west-3.winamax.fr', transports=['websocket'], socketio_path='/uof-sports-server/socket.io') sio.wait()
- 注意认证问题
有些网站会要求Socket.io连接携带认证信息(比如Cookie、Token),如果连接成功但拿不到数据,大概率是这个原因。你可以在浏览器Network里看Socket.io连接的请求头,把必要的Cookie加到连接参数里:
headers = { 'Cookie': '替换成浏览器里的Cookie内容' } sio.connect('https://sports-eu-west-3.winamax.fr', transports=['websocket'], socketio_path='/uof-sports-server/socket.io', headers=headers)
另外,你提到之前看到的GET请求,如果那个请求不需要复杂的认证,其实可以先试试用requests库直接请求,对新手来说可能更简单:
import requests url = '你抓包到的目标GET请求URL' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', # 按需添加Cookie等认证信息 } response = requests.get(url, headers=headers) data = response.json() print(data)
总的来说,核心就是先通过抓包搞清楚网站和服务器的Socket.io通信规则,然后在Python里复刻这些操作就好啦!
备注:内容来源于stack exchange,提问作者M.O

