天天看點

WebSocket反爬蟲

WebSocket 側重點在Socket。在用戶端與伺服器之間交換資料,當兩者連接配接成功時,就可以保持長期連接配接,伺服器可以直接向用戶端推送資料,無需通過用戶端發送多次請求。

  對于某些網站,伺服器需要給用戶端(浏覽器)不斷更新資訊,對于這些實時更新的資訊(如:伺服器每1秒推送一次),大多以WebSocket技術為主。

  在請求網站時,當網頁一加載,在請求中,可以發現狀态為101,Type 為 websocket 的響應中,在其Messages中,首先看到用戶端改善1條或n條資訊給伺服器,之後伺服器就給用戶端不停的推送資訊,在此期間,用戶端也會在一段時間(如:3秒)内給伺服器發送資訊,用來确認用戶端還在再伺服器連接配接,如下圖。

WebSocket反爬蟲

  而每次伺服器推送回來的資料正是我們想要的資訊。此時不得不去探究。

WebSocket 特點:

  1. URL位址以 ws 或 wss 開頭;
  2. 資料在Messages中不停的推送與驗證;
  3. 請求/響應頭資訊:
  • 請求頭:
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: hsbccunVBv4NEdroi/OWcw==
Sec-WebSocket-Version: 13

           
  • 響應頭:
Connection: upgrade
Upgrade: WebSocket
Date: Sun, 15 Mar 2020 13:57:23 GMT
Sec-WebSocket-Accept: ELbu6ydVcJK2fT0RwiV1TvYTJ7g=
           

  ++相比平常的請求/響應頭資訊,它們多出以上資訊。++

Connection: Upgrade
Upgrade: websocket
           

  聲明這是一個websoket協定。

Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: hsbccunVBv4NEdroi/OWcw==
Sec-WebSocket-Version: 13

Sec-WebSocket-Accept: ELbu6ydVcJK2fT0RwiV1TvYTJ7g=
           

  用來驗證用戶端與伺服器之間的驗證。

WebSocket 簡單說明:

  • 伺服器:

      在伺服器中,伺服器建立socket服務,使伺服器監聽用戶端發送的請求,當用戶端給伺服器發送請求(握手請求)後,伺服器将請求的資訊進行驗證,如果驗證成功,傳回101,并與用戶端建立連接配接,這時用戶端與伺服器之間就可以互相通信,否則其它操作(403)。

  • 用戶端:

      在用戶端中,用戶端按照WebSocket規範生成請求資訊(握手資訊),并向伺服器發送請求,然後對伺服器讀取伺服器響應資訊,最後驗證用戶端與伺服器的握手結果。

爬蟲采集(Python):

  對于此類,爬蟲如何去采集資料呢?代碼中難點無非是怎樣保持連接配接、消息發送與連接配接。

  在Python中,我們常使用的urllib、requests等庫已經無法滿足要求。但是對強大Python中,怎麼可能沒有解決的呢。

  Python中連接配接 WebSocket的庫有很多,但是易用、穩定的有 websocket-client(非異步)、websockets(異步)、aiowebsocket(異步)。這裡推薦使用aiowebsocket。Github

WebSocket 争對爬蟲:

  相比平常的網站,Socket技術在爬蟲上面已經是一個坎。但是這個坎不是太深,要想挖更深的坎,需要與JavaScript或其它技術的結合。讓爬蟲工程師覺得成本>資訊。

  • 挖深坑方式:

    1. 添加請求時資訊驗證難度。

     如:在URl中添加加密資訊,在請求中添加加密資訊

    2. 在握手成功之後添加資訊驗證。

     如:連接配接成功之後,需要用戶端發送給服務加密資訊驗證

    3. 連接配接成功後,連接配接中期間不時添加資訊用戶端消息驗證。

     如:連接配接成功之後,伺服器可以向用戶端正常發送資訊,但是需要用戶端每隔斷時間給伺服器發送資訊。

WebSocket Ping

  WebSocket 的保持長時間有憂點也有缺點,就是在長時間連接配接上,耗費的資源比較大,為了解決這個問題,是以WebSocket Ping産生了。

  WebSocket 協定規範約定,伺服器可以向用戶端發送Ping幀,當用戶端收到Ping時應當回複Pong幀。如果用戶端不回複或者回複的并不是Pong幀,那麼伺服器就可以認為用戶端異常,主動關閉連接配接。WebSocket Ping以接收/回複的方式,使其在工作性能上優于WebSocket。

參考文章:

Websocket原理

基于websocket爬蟲