WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,,簡單來說就是建立一個TCP長連接之后,,你可以服務(wù)器隨時可以給客戶端發(fā)送消息,客戶端隨時可以給服務(wù)器發(fā)送消息,,而以前只能是客戶端給服務(wù)器發(fā)送消息,,服務(wù)器返回消息。 websocket協(xié)議我們簡稱為ws,,ws的網(wǎng)絡(luò)爬蟲其原理和普通爬蟲沒有其他區(qū)別,,都是模擬客戶端與服務(wù)器進行對話,不同的是我們要用到websocket庫,。 測試網(wǎng)址是websocket官網(wǎng)提供的demo,,demos.kaazing.com/echo/index.html 我們抓包看看ws協(xié)議的通信特點: 一次連接雙向通信,在瀏覽器開發(fā)者工具中,,點擊ws數(shù)據(jù)包在彈出的詳情中點擊Frames,,這里面是通信的數(shù)據(jù)。知道了大致的工作原理以后我們來實現(xiàn)一個簡單的無驗證,、無加密內(nèi)容的ws爬蟲,,目標網(wǎng)址還是上面那個。 我們實現(xiàn)和目標網(wǎng)址之前的數(shù)據(jù)交互,,常見方法如下: # -*- coding:utf-8 -*- import websocket url = 'ws://demos.kaazing.com/echo'ws = websocket.create_connection(url=url, timeout=15) ws.send('以字符串發(fā)送數(shù)據(jù)') # 以字符串發(fā)送消息ws.recv() # 接收消息,,如果無消息將會堵塞,直到15s超時等待結(jié)束 ws.send_frame('以幀形式發(fā)送數(shù)據(jù)') # 以幀形式發(fā)送數(shù)據(jù)ws.recv_data_frame() # 接收以幀發(fā)送的數(shù)據(jù) ws.send_binary('以二進制格式發(fā)送數(shù)據(jù)'.encode()) # 以二進制格式發(fā)送數(shù)據(jù) ws.send_close() # 向服務(wù)器發(fā)送關(guān)閉連接請求,傳入狀態(tài)碼及其原因 ws.close() # 關(guān)閉連接 ws = websocket.create_connection(url=url, timeout=15)ws.send('以字符串發(fā)送數(shù)據(jù)')30ws.recv()'以字符串發(fā)送數(shù)據(jù)'ws.send_frame('以幀形式發(fā)送數(shù)據(jù)')8data = ws.recv_data_frame()data(8, <websocket._abnf.ABNF object at 0x07FD4C90>)data[1].datab'\x03\xea' 看似很簡單,,但在實際中會伴隨著很多通信的加密,,這個需要在具體問題中具體分析,主要就三個方面:建立ws連接、發(fā)送消息,、接收消息,。 ws的應(yīng)用在即時性較強的信息傳播行業(yè),如股票,、彩票,、賽事、通信中用的很普遍,,但是其難度并不大,。 |
|