1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網營銷解決方案
      Python怎么爬取實時變化的WebSocket數據-創(chuàng)新互聯(lián)

      這篇文章給大家分享的是有關Python怎么爬取實時變化的WebSocket數據的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

      站在用戶的角度思考問題,與客戶深入溝通,找到始興網站設計與始興網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網站建設、成都網站建設、企業(yè)官網、英文網站、手機端網站、網站推廣、申請域名、網頁空間、企業(yè)郵箱。業(yè)務覆蓋始興地區(qū)。

      一、前言

      作為一名爬蟲工程師,在工作中常常會遇到爬取實時數據的需求,比如體育賽事實時數據、股市實時數據或幣圈實時變化的數據。如下圖:

      Python怎么爬取實時變化的WebSocket數據

      Python怎么爬取實時變化的WebSocket數據

      Python怎么爬取實時變化的WebSocket數據

      Web 領域中,用于實現(xiàn)數據'實時'更新的手段有輪詢和 WebSocket 這兩種。輪詢指的是客戶端按照一定時間間隔(如 1 秒)訪問服務端接口,從而達到 '實時' 的效果,雖然看起來數據像是實時更新的,但實際上它有一定的時間間隔,并不是真正的實時更新。輪詢通常采用 拉 模式,由客戶端主動從服務端拉取數據。

      WebSocket 采用的是 推 模式,由服務端主動將數據推送給客戶端,這種方式是真正的實時更新。

      二、什么是 WebSocket

      WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。它使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數據傳輸。

      WebSocket 優(yōu)點

      • 較少的控制開銷:只需要進行一次握手,攜帶一次請求頭信息即可,后續(xù)只傳輸數據即可,相比 HTTP 每次請求都攜帶請求頭,WebSocket 非常省資源。

      • 更強的實時性:由于服務器可以主動推送消息,這使得延遲變得可以忽略不計,相比 HTTP 輪詢的時間間隔,WebSocket 可以在相同的時間內進行多次傳輸。

      • 二進制支持:WebSocket 支持二進制幀,這意味著傳輸更節(jié)省。

      • ……

      爬蟲面對 HTTP 和 WebSocket

      Python 中的網絡請求庫非常多,Requests 是最常用的請求庫之一,它可以模擬發(fā)送網絡請求。但是這些請求都是基于 HTTP 協(xié)議的。在面對 WebSocket 的時候 Requests 就發(fā)揮不料作用了,必須使用能夠連接 WebSocket 的庫。

      三、爬取思路

      這里以萊特幣官網 http://www.laiteb.com/ 實時數據為例。WebSocket 的握手只發(fā)生一次,所以如果需要通過瀏覽器開發(fā)者工具觀察網絡請求,則需要在打開頁面的情況下,打開瀏覽器開發(fā)者工具,定位到 NewWork 選項卡,并輸入或刷新當前頁面,才能觀察到 WebSocket 的握手請求和數據傳輸情況。這里以 Chrome 瀏覽器為例:

      Python怎么爬取實時變化的WebSocket數據

      在開發(fā)者工具中提供了篩選功能,其中 WS 選項代表只顯示 WebSocket 連接的網絡請求。

      這時候可以看到請求記錄列表中有一條名為 realTime 的記錄,鼠標左鍵點擊它后,開發(fā)者工具會分為左右兩欄,右側列出本條請求記錄的詳細信息:

      Python怎么爬取實時變化的WebSocket數據

      與 HTTP 請求不同的是,WebSocket 連接地址以 ws 或 wss 開頭。連接成功的狀態(tài)碼不是 200,而是 101。

      Headers 標簽頁記錄的是 Request 和 Response 信息,而 Frames 標簽頁中記錄的則是雙方互傳的數據,也是我們需要爬取的數據內容:

      Python怎么爬取實時變化的WebSocket數據

      Frames 圖中綠色箭頭向上的數據是客戶端發(fā)送給服務端的數據,橙色箭頭向下的數據是服務端推送給客戶端的數據。

      從數據順序中可以看到,客戶端先發(fā)送:

      {"action":"subscribe","args":["QuoteBin5m:14"]}

      然后服務端才會推送信息(一直推送):

      復制代碼 代碼如下:

      {"group":"QuoteBin5m:14","data":[{"low":"55.42","high":"55.63","open":"55.42","close":"55.59","last_price":"55.59","avg_price":"55.5111587372932781077","volume":"40078","timestamp":1551941701,"rise_fall_rate":"0.0030674846625766871","rise_fall_value":"0.17","base_coin_volume":"400.78","quote_coin_volume":"22247.7621987324"}]}

      所以,從發(fā)起握手到獲得數據的整個流程為:

      Python怎么爬取實時變化的WebSocket數據

      那么,現(xiàn)在問題來了:

      • 握手怎么弄?

      • 連接保持怎么弄?

      • 消息發(fā)送和接收怎么弄?

      • 有什么庫可以輕松實現(xiàn)嗎?

      四、aiowebsocket

      Python 庫中用于連接 WebSocket 的有很多,但是易用、穩(wěn)定的有 websocket-client(非異步)、websockets(異步)、aiowebsocket(異步)。

      可以根據項目需求選擇三者之一,今天介紹的是異步 WebSocket 連接客戶端 aiowebsocket。其 Github 地址為: https://github.com/asyncins/aiowebsocket

      ReadMe中介紹到: AioWebSocket是一個遵循 WebSocket 規(guī)范的 異步 WebSocket 客戶端,相對于其他庫它更輕、更快。

      它的安裝和其他庫一樣簡單,使用 pip install aiowebsocket 即可。安裝好后,我們可以根據 ReadMe 中提供的示例代碼來測試:

      import asyncio
      import logging
      from datetime import datetime
      from aiowebsocket.converses import AioWebSocket
      
      
      async def startup(uri):
       async with AioWebSocket(uri) as aws:
        converse = aws.manipulator
        message = b'AioWebSocket - Async WebSocket Client'
        while True:
         await converse.send(message)
         print('{time}-Client send: {message}'
           .format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message=message))
         mes = await converse.receive()
         print('{time}-Client receive: {rec}'
           .format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rec=mes))
      
      
      if __name__ == '__main__':
       remote = 'ws://echo.websocket.org'
       try:
        asyncio.get_event_loop().run_until_complete(startup(remote))
       except KeyboardInterrupt as exc:
        logging.info('Quit.')

      運行后的結果輸出為:

      2019-03-07 15:43:55-Client send: b'AioWebSocket - Async WebSocket Client'
      2019-03-07 15:43:55-Client receive: b'AioWebSocket - Async WebSocket Client'
      2019-03-07 15:43:55-Client send: b'AioWebSocket - Async WebSocket Client'
      2019-03-07 15:43:56-Client receive: b'AioWebSocket - Async WebSocket Client'
      2019-03-07 15:43:56-Client send: b'AioWebSocket - Async WebSocket Client'
      ……

      send 表示客戶端向服務端發(fā)送的消息

      recive 表示服務端向客戶端推送的消息

      五、編碼獲取數據

      回到這一次的爬取需求,目標網站是萊特幣官網:

      Python怎么爬取實時變化的WebSocket數據

      從剛才的網絡請求記錄中,我們得知目標網站的 WebSocket 地址為: wss://api.bbxapp.vip/v1/ifcontract/realTime ,從地址中可以看出目標網站使用的是 wss,也就是 ws 的安全版,它們的關系跟 HTTP/HTTPS 一樣。aiowebsocket 會自動處理并識別 ssl,所以我們并不需要作額外的操作,只需要將目標地址賦值給連接 uri 即可:

      import asyncio
      import logging
      from datetime import datetime
      from aiowebsocket.converses import AioWebSocket
      
      
      async def startup(uri):
       async with AioWebSocket(uri) as aws:
        converse = aws.manipulator
        while True:
         mes = await converse.receive()
         print('{time}-Client receive: {rec}'
           .format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rec=mes))
      
      
      if __name__ == '__main__':
       remote = 'wss://api.bbxapp.vip/v1/ifcontract/realTime'
       try:
        asyncio.get_event_loop().run_until_complete(startup(remote))
       except KeyboardInterrupt as exc:
        logging.info('Quit.')

      運行代碼后觀察輸出,你會發(fā)現(xiàn)什么都沒有發(fā)生。既沒有內容輸出,也沒有斷開連接,程序一直在運行,但是什么都沒有:

      Python怎么爬取實時變化的WebSocket數據

      這是為什么呢?

      是對方不接受我方的請求嗎?

      還是有什么反爬蟲限制呢?

      實際上,剛才的流程圖可以解釋這個問題:

      Python怎么爬取實時變化的WebSocket數據

      整個流程中有一步是需要客戶端給服務端發(fā)送指定的消息,服務端驗證后才會不停推送數據。所以,應該在消息讀取前、握手連接后加上消息發(fā)送的代碼:

      import asyncio
      import logging
      from datetime import datetime
      from aiowebsocket.converses import AioWebSocket
      
      
      async def startup(uri):
       async with AioWebSocket(uri) as aws:
        converse = aws.manipulator
        # 客戶端給服務端發(fā)送消息
        await converse.send('{"action":"subscribe","args":["QuoteBin5m:14"]}')
        while True:
         mes = await converse.receive()
         print('{time}-Client receive: {rec}'
           .format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rec=mes))
      
      
      if __name__ == '__main__':
       remote = 'wss://api.bbxapp.vip/v1/ifcontract/realTime'
       try:
        asyncio.get_event_loop().run_until_complete(startup(remote))
       except KeyboardInterrupt as exc:
        logging.info('Quit.')

      保存后運行,就會看到數據源源不斷的推送過來:

      Python怎么爬取實時變化的WebSocket數據

      到這里,爬蟲就能夠獲取到想要的數據了。

      aiowebsocket 做了什么

      代碼不長,使用的時候只需要將目標網站 WebSocket 地址填入,然后按照流程發(fā)送數據即可,那么 aiowebsocket 在這個過程中做了什么呢?

      • 首先,aiowebsocket 根據 WebSocket 地址,向指定的服務端發(fā)送握手請求,并校驗握手結果。

      • 然后,在確認握手成功后,將數據發(fā)送給服務端。

      • 整個過程中為了保持連接不斷開,aiowebsocket 會自動與服務端響應 ping pong。

      • 最后,aiowebsocket 讀取服務端推送的消息

      【奎因:】如果你認為 aiowebsocket 幫助了你,那么請你到 Github https://github.com/asyncins/aiowebsocket 上給一個 Star。如果在使用當中發(fā)現(xiàn)問題或者希望給 aiowebsocket 提建議,那么也可以到 Github 上提出。只要你提出建議,就一定能夠幫助 aiowebsocket 變的更好,而 aiowebsocket 也能夠繼續(xù)為你服務。

      感謝各位的閱讀!關于“Python怎么爬取實時變化的WebSocket數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


      網頁名稱:Python怎么爬取實時變化的WebSocket數據-創(chuàng)新互聯(lián)
      文章源于:http://www.ef60e0e.cn/article/gjips.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        丰原市| 思茅市| 武胜县| 宁城县| 梅河口市| 平果县| 三门峡市| 桂林市| 武宁县| 沭阳县| 喀喇沁旗| 通许县| 务川| 京山县| 深水埗区| 南川市| 莱西市| 宝兴县| 山阴县| 景洪市| 吉隆县| 晴隆县| 永吉县| 顺昌县| 南木林县| 广宗县| 高雄县| 扎囊县| 苍山县| 东城区| 华亭县| 玉林市| 星子县| 肃宁县| 渭源县| 定边县| 玉屏| 郑州市| 江口县| 句容市| 万安县|