我想从使用SOCKET.IO和WS协议的网站(具有OHLC价格的股票交易网站)获取数据。 到目前为止,这是我尝试过的:
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}
session = requests.Session()
r = session.get("http://api.example.com/socket.io/?EIO=3&transport=polling&t=NKJ9lK8", headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
struc = re.findall('"([^"]*)"', soup.text)
session_id = struc[1]
在这里,我从第一个请求中提取会话ID。然后,我将尝试使用该会话ID打开Websocket连接:
def on_message(ws, message):
print('message received ..')
print(message)
def on_error(ws, error):
print('error happened .. ')
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
print('Opening Websocket connection to the server ... ')
def run(*args):
for i in range(3):
time.sleep(1)
ws.send("Hello %d" % i)
time.sleep(1)
ws.close()
print("thread terminating...")
thread.start_new_thread(run, ())
headers['Sec-WebSocket-Key'] = str(base64.b64encode(bytes([random.randint(0, 255) for _ in range(16)])), 'ascii')
headers['Sec-WebSocket-Version'] = '13'
cookies = session.cookies.get_dict()
if __name__ == "__main__":
websocket.enableTrace(True)
ws = websocket.WebSocketApp('ws://api.example.com/socket.io/?EIO=3&transport=websocket&sid=' + session_id,
header=headers,
on_message = on_message,
on_error = on_error,
on_close = on_close,
cookie="; ".join(["%s=%s" %(i, j) for i, j in cookies.items()]))
ws.on_open = on_open
ws.run_forever()
问题是它会打开websocket连接并立即关闭它而不返回消息。我想保持连接状态并继续接收数据。 这是返回的数据:
--- request header ---
GET /socket.io/?EIO=3&transport=websocket&sid=bjVy-kjRSF12-8jWAAHn HTTP/1.1
Upgrade: websocket
Host: api.example.com
Origin: http://api.example.com
Connection: upgrade
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Sec-WebSocket-Key: VeYPFifoqW2Ety8oaOiLqA==
Sec-WebSocket-Version: 13
Cookie: io=bjVy-kjRSF12-8jWAAHn
-----------------------
--- response header ---
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: W5cri3H2jgGirGqkaOdNZsJF3J4=
-----------------------
Opening Websocket connection to the server ...
send: b'\x81\x87\x04\tg\x93Ll\x0b\xffk)W'
send: b'\x88\x82\xe1\t\xab\x8a\xe2\xe1'
### closed ###
我在哪里做错了?