Skip to main content
 首页 » 编程设计

Python 抓取 Websocket 数据

2024年08月19日41lexus

我正在尝试在 Python 中使用 sockjs 从网站上抓取 websocket 数据(帧),但我真的不知道该怎么做。

网址:ws://example.io/sockjs/wkzeza/websocket

在网络调试器中我可以看到这个响应头:

Date: Sun, 27 Aug 2017 09:42:15 GMT 
Connection: upgrade 
Set-Cookie: oWG+Kel2MBo0v9FQK81NvuvBZcUwChaMvG2bsv1Ofs9Q8hHN+PlTn6PolO/8MgFXh2ygqC7A8WsJ7cgZwvpwvsbSp0VCpRHqmYMhGGxr; Expires=Sun, 03 Sep 2017 09:42:15 GMT; Path=/ 
Upgrade: websocket 
Sec-WebSocket-Accept: HA0gkvrFCF7qjVYIDvSBa5sJKkg= 
Sec-WebSocket-Extensions: permessage-deflate 
Server: nginx 
CF-RAY: 394e146d34a12f65-MAD 

通常只有响应头我可以从帧中检索数据,对吧?

我试过这段代码,但我可以阅读内容:

from websocket import create_connection 
import json 
 
headers = json.dumps({'Date': 'Sun, 27 Aug 2017 09:42:15 GMT', 
'Connection': 'upgrade', 
'Set-Cookie': 'oWG+Kel2MBo0v9FQK81NvuvBZcUwChaMvG2bsv1Ofs9Q8hHN+PlTn6PolO/8MgFXh2ygqC7A8WsJ7cgZwvpwvsbSp0VCpRHqmYMhGGxr; Expires=Sun, 03 Sep 2017 09:42:15 GMT; Path=/', 
'Upgrade': 'websocket', 
'Sec-WebSocket-Accept': 'HA0gkvrFCF7qjVYIDvSBa5sJKkg=', 
'Sec-WebSocket-Extensions': 'permessage-deflate', 
'Server': 'nginx', 
'CF-RAY': '394e146d34a12f65-MAD'}) 
 
ws = create_connection('ws://example.io/sockjs/wkzeza/websocket', header=headers) 
response = ws.recv_data_frame() 
print(response) 
 
>> [1, <websocket._abnf.ABNF at 0x7efe29aa0da0>] 

感谢您的帮助。

请您参考如下方法:

检查 Chrome(或其他浏览器)中的流量,了解您应该如何协商以开始数据流。 协商确定后,您可以执行以下操作:

while True: 
    ws.recv() 

这是 Chrome 中上行/下行 WebSocket 流量的示例。

只需复制消息并在 ws.send() 中使用它。 示例:

ws.send('''{"H":"publicmaphub","M":"getData","A":[],"I":1}''') 

示例来自挪威/斯塔万格公交车的实时 View : https://www.kolumbus.no/ruter/kart/sanntidskart-internt/?c=58.974238,5.691347,14&lf=all&vt=bus,ferry
(在该页面上,您还需要先通过 HTTPS 获取 token ,连接 WebSocket 并执行另一个 HTTPS 以启动流量。在此之后,您可以执行 ws.recv() 和 ws.send() 组合以开始获取数据。)