如何解码Selenium采集获取的WebSocket通信消息
Selenium采集WebSocket Base64编码消息解码方案
你遇到的是Socket.IO框架的二进制消息拆分机制:451-开头的消息是Socket.IO控制帧,标记后续帧为实际二进制负载,Puppeteer默认做了帧拼接解码,Selenium的性能日志仅返回原始独立帧,因此需要自行关联解码。
步骤1:消息帧规则说明
你捕获的消息固定成对出现:
- 控制帧:以
451-["updateStream",{"_placeholder":true,"num":0}]格式呈现,标记下一条消息为对应事件的二进制负载 - 负载帧:以等号结尾的Base64编码字符串,存储实际业务数据
步骤2:编写解码函数
引入Python内置Base64库实现解码,同时关联成对的控制帧和负载帧:
import base64 import json # 全局变量存储上一条控制帧的事件信息 last_control_event = None def parse_ws_payload(payload: str): global last_control_event # 处理Socket.IO控制帧 if payload.startswith("451-"): control_content = json.loads(payload[4:]) # 识别二进制占位符标记,存储事件名 if len(control_content) >= 2 and "_placeholder" in control_content[1]: last_control_event = control_content[0] return None # 处理Base64负载帧 if last_control_event and payload.endswith("="): # Base64解码转UTF-8字符串再解析JSON decoded_bytes = base64.b64decode(payload) decoded_data = json.loads(decoded_bytes.decode("utf-8")) # 重置控制帧标记 temp_event = last_control_event last_control_event = None # 返回结构化解析结果 return { "event": temp_event, "data": decoded_data } # 普通消息直接返回 return {"event": "common", "data": payload}
步骤3:集成到原有Selenium代码
修改原WebSocketLog函数调用解码逻辑即可:
def WebSocketLog(): for wsData in driver.get_log('performance'): wsJson = json.loads(wsData['message']) msg_method = wsJson["message"]["method"] if msg_method == "Network.webSocketFrameReceived": raw_payload = wsJson["message"]["params"]["response"]["payloadData"] parsed_result = parse_ws_payload(raw_payload) if parsed_result: print(f"Rx解析结果:{json.dumps(parsed_result, ensure_ascii=False)}") elif msg_method == "Network.webSocketFrameSent": raw_payload = wsJson["message"]["params"]["response"]["payloadData"] print(f"Tx原始内容:{raw_payload}")
解码效果示例
你给出的样例Base64字符串W1siQVVEQ0hGIiwxNjMzNTI1MDg2LjM2NiwwLjY3Mjc4XV0=解码后结果为:
[["AUDCHF", 1633525086.366, 0.67278]]
分别对应交易对名称、数据时间戳、报价数值。
内容的提问来源于stack exchange,提问作者saeed shiroo
相关产品推荐
相关产品推荐

