Python抓取Websocket数据

时间:2017-08-27 11:47:40

标签: python websocket web-scraping

我试图在Python中使用sockjs从网站上刮取websocket数据(框架),但我真的不知道该怎么做。

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

在Web调试器中,我可以看到此响应标头:

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>]

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

while True:
    ws.recv()

以下是在Chrome中上下移动WebSocket流量的示例。

enter image description here

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

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

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