WebSocket是一種在單個TCP連接上進行全雙工通信的協議,簡單來說就是建立一個TCP長連接之後,你可以伺服器隨時可以給客戶端發送消息,客戶端隨時可以給伺服器發送消息,而以前只能是客戶端給伺服器發送消息,伺服器返回消息。

websocket協議我們簡稱為ws,ws的網路爬蟲其原理和普通爬蟲沒有其他區別,都是模擬客戶端與伺服器進行對話,不同的是我們要用到websocket庫。

測試網址是websocket官網提供的demo,demos.kaazing.com/echo/

我們抓包看看ws協議的通信特點:

一次連接雙向通信,在瀏覽器開發者工具中,點擊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() # 關閉連接

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
bx03xea

看似很簡單,但在實際中會伴隨著很多通信的加密,這個需要在具體問題中具體分析,主要就三個方面:建立ws連接、發送消息、接收消息。

ws的應用在即時性較強的信息傳播行業,如股票、彩票、賽事、通信中用的很普遍,但是其難度並不大。

------------------------------

ID:Python之戰

|作|者|公(zhong)號:python之戰

專註Python,專註於網路爬蟲、RPA的學習-踐行-總結

喜歡研究技術瓶頸並分享,歡迎圍觀,共同學習。

獨學而無友,則孤陋而寡聞!

---------------------------


推薦閱讀:
相關文章