websocket实时数据分析和爬取

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

使用爬虫爬取数据其中的是步骤应为:
握手—消息验证—客户端获取信息

一.服务器端和客户端握手
websocket握手时使用的协议是HTTP协议,换句话说,所有基于HTTP协议的反爬虫都可以用在websocket协议
websocket服务器端的代码逻辑如图
在这里插入图片描述
服务器端创建socket服务后监听客户端,读取客户端发送的消息,然后对服务端发送的握手请求进行验证,如果验证通过,则返回状态码为101的响应头,否则返回403响应头
实例:
在这里插入图片描述
注释:箭头朝上的绿色箭头为客户端向服务端发送的请求,箭头向下的红色箭头为服务端向客户端发送的消息。
客户端发送的请求信息之后,服务端及时回应,表明握手成功。

接着还需要一个向服务器发起握手并验证握手结果的客户端

在这里插入图片描述
握手成功后,双端就可以开始互推信息了,websocket只需要完成一次握手,就可以长期保持连接。
下面就可以开始消息验证反爬虫了!

二.服务端和客户端进行消息验证

代码逻辑如图
在这里插入图片描述
三.客户端信息获取
Python 库中用于连接 WebSocket 的有很多,但是易用、稳定的有 websocket-client(非异步)、websockets(异步)、aiowebsocket(异步)。

可以根据项目需求选择三者之一,今天介绍的是异步 WebSocket 连接客户端 aiowebsocket。

实例步骤如下:
1.打开开发者工具找到ws请求中realtime
2.查看握手和消息验证是否成功
3.写代码,解释如下

'''
    websocket网页分析和爬取
    aiowebsocket异步方法
'''

#导入模块
import asyncio
import logging
from datetime import datetime
from aiowebsocket.converses import AioWebSocket

# 此处涉及一些协程知识,有不懂的看前面的协程博客
async def startup(uri):
    # 异步获取假设AioWebSocket这个对象为aws
    async with AioWebSocket(uri) as aws:
        # 执行异步aws里面的manipulator对象
        converse = aws.manipulator
        # 客户端准备发送给服务端的信息
        message = b'AioWebSocket - Async WebSocket Client'
        # 布尔判定是否正确来确定一个循环
        while True:
            # 通过converse.send()方式客户端发送(正在发送)请求信息给服务端
            await converse.send(message)
            # 此处打印发送信息成功---此处打印出来的是格式化后的时间戳datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            print('{time}-Client send: {message}'
                  .format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message=message))
            # 此处服务端接收到客户端发送的请求即receive()则打印时间戳加mes对象
            # 此处是循环
            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__':
    #这是ws网址
    remote = 'ws://echo.websocket.org'
    # 判定是否可以执行
    try:
        '''
        此处是异步函数loop执行方法,python3.7以上支持run()方法
        asyncio.run(startup(remote))---个人倾向这个,更加简洁
        '''
        asyncio.get_event_loop().run_until_complete(startup(remote))
    except KeyboardInterrupt as exc:
        # 执行错误则返回logging库方法
        logging.info('Quit.')

在这里插入图片描述
欢迎大噶留言蛤。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐