首先本篇文章的主要目的是了解websocket協(xié)議,并將其使用在爬蟲領(lǐng)域
什么是websocket
websocket(簡(jiǎn)稱ws)是一個(gè)基礎(chǔ)tcp連接的通信協(xié)議,通過http(一次握手)建立連接,與http協(xié)議最大不同的是: websocket是全雙工通信,服務(wù)器可以主動(dòng)向客戶端發(fā)送消息,而http1.1是半雙工,只能等待客戶端請(qǐng)求給響應(yīng)。
協(xié)議標(biāo)識(shí)符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL。
ws://example.com:80/some/path
那么與爬蟲又有什么關(guān)系呢?
在web爬蟲,我們經(jīng)常會(huì)JavaScript逆向分析一個(gè)參數(shù)的生成,大部分的做法是把相關(guān)代碼扣到本地調(diào)試分析,補(bǔ)充瀏覽器環(huán)境,使用node開發(fā)一個(gè)express接口,供爬蟲調(diào)用。
使用了websocket之后,我們只需找到參數(shù)加密函數(shù)入口,使用中間人攻擊方式向?yàn)g覽器注入js(讓瀏覽器成為websocket客戶端),使用python編寫websocket服務(wù)端,并開發(fā)一個(gè)api,爬蟲向這個(gè)api提交參數(shù),該api將參數(shù)轉(zhuǎn)給服務(wù)端函數(shù),服務(wù)端將參數(shù)發(fā)送給瀏覽器(前面注入的js),瀏覽器拿到參數(shù),會(huì)調(diào)用加密函數(shù)對(duì)參數(shù)進(jìn)行處理,得到結(jié)果返回給服務(wù)端。
websocket的使用
1. 客戶端API
使用JavaScript實(shí)現(xiàn),使用中間人攻擊將這段腳本注入
阮大寫的很全,這里做簡(jiǎn)單記錄
// 創(chuàng)建一個(gè)websocket實(shí)例
var ws = new WebSocket('ws://localhost:8080');
- webSocket.onopen 用于指定
連接成功后的回調(diào)函數(shù) - webSocket.onclose 用于指定
連接關(guān)閉后的回調(diào)函數(shù) - webSocket.onmessage 用于指定
收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù) - webSocket.send 用于向服務(wù)器發(fā)送數(shù)據(jù)
- webSocket.readyState 返回實(shí)例對(duì)象的當(dāng)前狀態(tài)
具體案例
haha
服務(wù)端API
使用python實(shí)現(xiàn)