我正在尝试在 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() 组合以开始获取数据。)
