python實現基於websocket協議的網路爬蟲
WebSocket是一種在單個TCP連線上進行全雙工通訊的協議,簡單來說就是建立一個TCP長連線之後,你可以伺服器隨時可以給客戶端傳送訊息,客戶端隨時可以給伺服器傳送訊息,而以前只能是客戶端給伺服器傳送訊息,伺服器返回訊息。
## 學習Python中有不明白推薦加入交流群
號:960410445
群裡有志同道合的小夥伴,互幫互助,
群裡有不錯的視訊學習教程和PDF!
websocket協議我們簡稱為ws,ws的網路爬蟲其原理和普通爬蟲沒有其他區別,都是模擬客戶端與伺服器進行對話,不同的是我們要用到websocket庫。
測試網址是websocket官網提供的demo, http://demos.kaazing.com/echo/index.html

image
image.gif
我們抓包看看ws協議的通訊特點:

image
image.gif
一次連線雙向通訊,在瀏覽器開發者工具中,點選ws資料包在彈出的詳情中點選Frames,這裡面是通訊的資料。知道了大致的工作原理以後我們來實現一個簡單的無驗證、無加密內容的ws爬蟲,目標網址還是上面那個。
我們實現和目標網址之前的資料互動,常見方法如下:
# -*- coding:utf-8 -*- import websocket url = 'ws://demos.kaazing.com/echo' ws = websocket.create_connection(url=url, timeout=15) ws.send("以字串傳送資料")# 以字串傳送訊息 ws.recv()# 接收訊息,如果無訊息將會堵塞,直到15s超時等待結束 ws.send_frame("以幀形式傳送資料")# 以幀形式傳送資料 ws.recv_data_frame()# 接收以幀傳送的資料 ws.send_binary("以二進位制格式傳送資料".encode())# 以二進位制格式傳送資料 ws.send_close()# 向伺服器傳送關閉連線請求,傳入狀態碼及其原因 ws.close()# 關閉連線
image.gif
ws = websocket.create_connection(url=url, timeout=15) ws.send("以字串傳送資料") 30 ws.recv() '以字串傳送資料' ws.send_frame("以幀形式傳送資料") 8 data = ws.recv_data_frame() data (8, <websocket._abnf.ABNF object at 0x07FD4C90>) data[1].data b'\x03\xea'
image.gif
看似很簡單,但在實際中會伴隨著很多通訊的加密,這個需要在具體問題中具體分析,主要就三個方面:建立ws連線、傳送訊息、接收訊息。
ws的應用在即時性較強的資訊傳播行業,如股票、彩票、賽事、通訊中用的很普遍,但是其難度並不大。