websocket实时数据分析和爬取
websocket实时数据分析和爬取定义:WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。使用爬虫爬取数据其中的是步骤应为:握手—消息验证—客户端获取信息一.服务器端和客户端握手we
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.')

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

所有评论(0)