美文网首页
Websocket爬虫(初级)

Websocket爬虫(初级)

作者: 隐墨留白 | 来源:发表于2019-06-26 18:05 被阅读0次

    有些网站为了追求数据的实时更新,很多时候会采用 websocket 的方式,例如股票交易数据、数据货币交易数据等。

    那什么是websocket?

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    爬取目标
    • 目标网址:https://eosflare.io/whales

    • 打开网址后F12-->再次刷新页面-->点击WS,就会出现一条目录。

    • 点击目录右边的Headers就能找到websocket的请求url。

    • 点击Message就能看到真正的数据交互了,绿箭头是客户端传给服务器的数据,红箭头则是服务器传给客户端的数据。

    那到底这些数据如何才能爬取到呢?

    http请求可以用requests库,但是websocket就需要用到websocket库。

    • 第一步 安装websocket

    • 第二步 看交互数据
      因为websocket只发生一次握手,所以需要确认网络请求和握手数据。这个可以根据开发者工具搞定(但是有的网站会将数据加密)

    • 第三步 写代码

      import websocket
      
      wbsocket_url = 'wss://api-v1.eosflare.io/socket.io/?EIO=3&transport=websocket'
      #创建websocket请求
      ws = websocket.create_connection(url=wbsocket_url,timeout=10)
      #接收 服务器发过来的两条信息
      for i in range(2):
          content = ws.recv()
          print(content)
      #注意:握手数据应注意格式与准确性,别以为赋值粘贴就完事了,下面的数据就有一个坑
      data = '42["message","{\\"_url\\":\\"/chain/get_user_whales\\",\\"_method\\":\\"POST\\",\\"_headers\\":{\\"content-type\\":\\"application/json\\"},\\"page\\":' + str(page) + ',\\"limit\\":50,\\"sortBy\\":\\"total\\",\\"ascending\\":false,\\"lang\\":\\"zh-CN\\"}"]' 
      #客户端发送握手数据
      ws.send(data)
      #客户端接收服务器返回的数据
      content = ws.recv()
      #关闭请求
      ws.close()
      

    如果你够仔细的话就会发现一个规律,下一页数据的握手请求数据就只是page后面的数字改变了一下,所以再次修改代码,获取前5页的数据。

    import websocket
    import json
    from time import sleep
    wbsocket_url = 'wss://api-v1.eosflare.io/socket.io/?EIO=3&transport=websocket'
    ws = websocket.create_connection(url=wbsocket_url,timeout=10)
    for i in range(2):
        content = ws.recv()
        print(content)
    # 爬取前5页数据
    for page in range(5):
        sleep(3)
        data = '42["message","{\\"_url\\":\\"/chain/get_user_whales\\",\\"_method\\":\\"POST\\",\\"_headers\\":{\\"content-type\\":\\"application/json\\"},\\"page\\":' + str(page) + ',\\"limit\\":50,\\"sortBy\\":\\"total\\",\\"ascending\\":false,\\"lang\\":\\"zh-CN\\"}"]'
        ws.send(data)
        content = ws.recv()
        str_dic = list(eval(content[2:]))[1]
        data = json.loads(str_dic)['holders']
        for i in data:
            print(i)
    ws.close()

    相关文章

      网友评论

          本文标题:Websocket爬虫(初级)

          本文链接:https://www.haomeiwen.com/subject/jzchcctx.html