-
概念: Websocket 是HTML5出的东西(协议),也就是说HTTP协议没有变化,但HTTP是不支持持久连接的(长连接,循环连接的不算), Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说,可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁 Websocket只需要一次HTTP握手,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你), WebSocket 还是一个双通道的连接,在同一个 TCP 连接上可以多次 发 , 收 信息,由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。)内容拓展: HTTP1.0: 每次请求都要创建TCP连接(就是一个Request 对应一个Response) HTTP1.1: 进行了改进,它默认开启长连接 keep-alive(使用keep-alive参数来告知服务器端要建立一个长连接) ,也就是说,在一个TCP连接中,可以发送多个Http的Request,接收多个Response(一个TCP连接上可以传送多个HTTP请求和响应)//在请求头header里,由浏览器/服务器添加Connection:keep-alive 备注:但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response 也是 被动的,不能主动发起。建立持久连接的方式:1: ajax轮询: 让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。 request--->response , request--->response , request--->response ........ loop3: long poll :采取的是阻塞模型(一直打电话,没收到就不挂电话) request--->。。。。。。。reponse(没有消息,就不返回reponse,等待到有消息的时候,再给你(Response)) 下个消息获取再次建立连接:request--->。。。。reponse(没有消息,就不返回reponse) 所谓的 polling 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求 查询是否有新数据上面 两种方式都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性(服务端不能主动联系客户端,只能有客户端发起)。3: webscoket: 只需建立一次连接后,就可以源源不断 收 ,发 信息了,形成了通道。
-
概念: Websocket 是HTML5出的东西(协议),也就是说HTTP协议没有变化,但HTTP是不支持持久连接的(长连接,循环连接的不算), Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说,可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁 Websocket只需要一次HTTP握手,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你), WebSocket 还是一个双通道的连接,在同一个 TCP 连接上可以多次 发 , 收 信息,由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。)内容拓展: HTTP1.0: 每次请求都要创建TCP连接(就是一个Request 对应一个Response) HTTP1.1: 进行了改进,它默认开启长连接 keep-alive(使用keep-alive参数来告知服务器端要建立一个长连接) ,也就是说,在一个TCP连接中,可以发送多个Http的Request,接收多个Response(一个TCP连接上可以传送多个HTTP请求和响应)//在请求头header里,由浏览器/服务器添加Connection:keep-alive 备注:但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response 也是 被动的,不能主动发起。建立持久连接的方式:1: ajax轮询: 让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。 request--->response , request--->response , request--->response ........ loop3: long poll :采取的是阻塞模型(一直打电话,没收到就不挂电话) request--->。。。。。。。reponse(没有消息,就不返回reponse,等待到有消息的时候,再给你(Response)) 下个消息获取再次建立连接:request--->。。。。reponse(没有消息,就不返回reponse) 所谓的 polling 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求 查询是否有新数据上面 两种方式都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性(服务端不能主动联系客户端,只能有客户端发起)。3: webscoket: 只需建立一次连接后,就可以源源不断 收 ,发 信息了,形成了通道。
-
问题 由于在没连接成功前无法返回服务端任何信息,因此连接不成功需要多方面定位原因。排除方法1. 检查网络是否可用,能否连接互联网,检查url输入是否正确。2. 检查Token是否可用,检查Token的方法参考调用语音交互的API显示auth failed?3. 检查协议是否支持,目前Websocket使用tls1.2协议,Websocket库使用tls1协议就无法连接。4. 可使用Java SDK和Python SDK进行连接。
-
你好,我最近在试用华为云的实时语音识别功能,请问如何在网页上使用websocket调用呢?
-
【功能模块】智慧园区的项目使用WebSocket监听告警事件【操作步骤&问题现象】1、WebSocket监听告警事件,刚连上就断开,返回code:4004,reason:tenantId[0000000000gXmxYQsAYj] is not allowed租户:Hi-teamsunzhxiaofang【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】【操作步骤&问题现象】1、ABC预览页面:2、IOC挂载的同一个页面:之前是好好的,今天发现IOC无法接收消息,查看管理/权限配置/事件 IOC对应的角色SM_Operator的事件权限全部都勾选了的【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】广东清远项目,厂商:拓维信息,租户:Hi-zhyqtalkweb02。【操作步骤&问题现象】烦请帮忙将AR眼镜公网IP配置一下白名单,建立AR眼镜设备与华为沃土数字平台公网环境链接,支撑我们继续联调AR眼镜websocket接口。感谢!【截图信息】
-
【项目】广东清远5G智慧园区项目【功能模块】5G特种安防场景 AR眼镜设备(20.3 spc1版本,租户:Hi-chenyi)【操作步骤&问题现象】1、操作步骤:配置完AR眼镜之后,调测"仲天Arglasses"推送数据到原生服务voicebo下图1:设备侧推送原生,配置信息都是正确的。下图2:设备侧抓包,和原生服务是有数据交互的。2、失败信息如下:WebSocket connection to 'wss://studio.e.huawei.com/service/InnovateSecurityManagement/0.1.0/websocket/ar_zhongtian_dialog/ARGlasses,WEBsJxm03+uMT6g3DIyXQbTbvZEkVKcFwYfjw4FFG6YU=,abc.native.voicebo,Ms9tNnVKJJGCdn0Iyi9swQ==' failed: Error during WebSocket handshake: Unexpected response code: 404【截图信息】【求助】烦请指导定位下问题,协助调通AR眼镜基线场景。【补充说明】InnovateSecurityArGlassesMediaVoice\InnovateSecurityArGlassesMediaVoice.js --该JS中调用的wss。
-
涉及模块:ABC:【设施管理APP】现象:1. Facility Alarm List组件里注释掉了websocket相关代码:2. 我打开注释,并更新,会报错:“文件后缀不在允许的后缀白名单中,文件名是default-green.svg”问题:1. 有没有办法可以绕过更新时校验svg文件?2. 此页面本身就是无法实时接收告警消息吗?
-
功能描述:通过MQS上报一个消息,然后在App Engine的业务大屏上实时显示出来通过接口向Topic发送一个消息,消息能够被定义的数据接入和事件正常消费,但是在自定义组件使用websocket建立热联以后,无法获取到MQS的消息
-
我正常跑起来了facedetection样例,但是我的主程序不是python写的,是java写的,我想通过jsp去调用识别后的视频流,请问怎么去调用呢
-
前言我已经 2 个月没有发文了,看到有人问: '那个专注爬虫小奎因去哪了?',我就赶紧跳出来了。另外说明一下,德玛西亚之翼-奎因这个 ID 现在换成了 AsyncIns我计划在今年的夏天去北京,在去之前我需要做好技术准备,所以最近一直是在学习。我的学习方式很简单明了:看文档、读源码、造轮子。造轮子是我认为能让人进步的最快、最有效的方法。前段时间需要通过 WebSocket 爬取一些数据,网上文章介绍中,都是使用了 websocket-client 这个库。但我的项目是异步的,我希望 websocket 数据读取也能够是异步的,然后我在 github 上搜索到了 websockets 这个库,在使用和源码阅读中,我发现 websockets 仍然不是我认为理想的库,所以我决定自己开发一个异步的 WebSocket 连接客户端(async websocket client)。这一次我就跟大家分享 WebSocket 协议知识以及介绍我的开源库 aiowebsocket。WebSocket 协议和知识WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。为什么会有 WebSocket以前,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。 而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。 在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。WebSocket 有什么优点开销少、时时性高、二进制支持完善、支持扩展、压缩更优。较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。 保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有* 状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。握手是怎么回事?WebSocket 是独立的、创建在 TCP 上的协议。Websocket 通过HTTP/1.1 协议的101状态码进行握手。为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。WebSocket 协议规范WebSocket 是一个通信协议,它规定了一些规范和标准。它的协议标准为 RFC 6455,具体的协议内容可以在tools.ietf.org中查看。协议共有 14 个部分,其中包括协议背景与介绍、握手、设计理念、术语约定、双端要求、掩码以及连接关闭等内容。双端交互流程客户端与服务端交互流程如下所示:客户端 - 发起握手请求 - 服务器接到请求后返回信息 - 连接建立成功 - 消息互通所以,要解决的第一个问题就是握手问题。握手 - 客户端关于握手标准,在协议中有说明:The opening handshake is intended to be compatible with HTTP-based server-side software and intermediaries, so that a single port can be used by both HTTP clients **ing to that server and WebSocket clients **ing to that server. To this end, the WebSocket client's handshake is an HTTP Upgrade request:Upgrade: websocket Connection: Upgrade 复制代码Connection 和 Upgrade 这两个头域告知服务端,要求将通信的协议转换为 websocket。其中 Sec-WebSocket-Version、Sec-WebSocket-Protocol 这两个头域表明通信版本和协议约定, Sec-WebSocket-Key 则作为一个防止无端连接的保障(其实并没有什么保障作用,因为 key 的值完全由客户端控制,服务端并无验证机制),其他几个头域则与 HTTP 协议的作用一致。握手 - 服务端刚才只是客户端发出一个 HTTP 请求,表明想要握手,服务端需要对信息进行验证,确认以后才算握手成功(连接建立成功,可以双向通信),然后服务端会给客户端回复:"小老弟你好,没有内鬼,连接达成!"服务端需要回复什么内容呢?client: Hello, server boy server: Hello, client girl 复制代码跟我们在微信和 QQ 中发信息是一样的吗?虽然我们看到的信息是这样的,但是在传输过程中可不是这样子的。传输这部也有相应的规定:In the WebSocket Protocol, data is transmitted using a sequence of frames. To avoid confusing network intermediaries (such as intercepting proxies) and for security reasons that are further discussed in Section 10.3, a client MUST mask all frames that it sends to the server (see Section 5.3 for further details). (Note that masking is done whether or not the WebSocket Protocol is running over TLS.) The server MUST close the connection upon receiving a frame that is not masked. In this case, a server MAY send a Close frame with a status code of 1002 (protocol error) as defined in Section 7.4.1. A server MUST NOT mask any frames that it sends to the client. A client MUST close a connection if it detects a masked frame. In this case, it MAY use the status code 1002 (protocol error) as defined in Section 7.4.1. (These rules might be relaxed in a future specification.)The base framing protocol defines a frame type with an opcode, a payload length, and designated locations for "Extension data" and "Application data", which together define the "Payload data". Certain bits and opcodes are reserved for future expansion of the protocol.协议中规定传输时并不是直接使用 unicode 编码进行传输,而是使用帧(frame),数据帧协议定义了带有操作码的帧类型,有效载荷长度,以及“扩展数据”和的指定位置应用程序数据”,它们共同定义“有效载荷数据”。某些位和操作码保留用于将来的扩展协议。数据帧的格式如图所示:帧由以下几部分组成: FIN、RSV1、RSV2、RSV3、opcode、MASK、Payload length、Masking-key、Payload-Data。它们的含义和作用如下:1.FIN: 占 1bit%x0:表示一个延续帧。当 Opcode 为 0 时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个数据分片; %x1:表示这是一个文本帧(text frame); %x2:表示这是一个二进制帧(binary frame); %x3-7:保留的操作代码,用于后续定义的非控制帧; %x8:表示连接断开; %x9:表示这是一个心跳请求(ping); %xA:表示这是一个心跳响应(pong); %xB-F:保留的操作代码,用于后续定义的控制帧。 复制代码4.Mask: 1bit表示是否要对数据载荷进行掩码异或操作。0~126:数据的长度等于该值; 126:后续 2 个字节代表一个 16 位的无符号整数,该无符号整数的值为数据的长度; 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0),该无符号整数的值为数据的长度。 复制代码6.Masking-key: 0 or 4bytesimport 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.') 复制代码运行后就会得到如下结果:# 开启 ssl 即可 import asyncio import logging from datetime import datetime from aiowebsocket.converses import AioWebSocket async def startup(uri): async with AioWebSocket(uri, ssl=True) 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 = 'wss://echo.websocket.org' try: asyncio.get_event_loop().run_until_complete(startup(remote)) except KeyboardInterrupt as exc: logging.info('Quit.') 复制代码运行结果与上方运行结果类似。除此之外,aiowebsocket 还允许自定义请求头,在连接一些需要校验 origin、user-agent 和 host 头域信息的网站时,自定义请求头就非常有用了:<pre style="font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;font-size: 1em;line-height: 1.75;overflow: auto;>import asyncio import logging from datetime import datetime from aiowebsocket.converses import AioWebSocket async def startup(uri, header): async with AioWebSocket(uri, headers=header) 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://123.207.167.163:9010/ajaxchattest' header = [ 'GET /ajaxchattest HTTP/1.1', 'Connection: Upgrade', 'Host: 123.207.167.163:9010', 'Origin: http://coolaf.com', 'Sec-WebSocket-Key: RmDgZzaqqvC4hGlWBsEmwQ==', 'Sec-WebSocket-Version: 13', 'Upgrade: websocket', ] try: asyncio.get_event_loop().run_until_complete(startup(remote, header)) except KeyboardInterrupt as exc: logging.info('Quit.') 复制代码ws://123.207.167.163:9010/ajaxchattest 是一个免费的、开放的 WebSocket 连接测试接口,它在握手阶段会校验 origin 头域,如果不符合规范则不允许客户端连接。项目 Github 地址为https://github.com/asyncins/aiowebsocket欢迎各位前去 star ,如果能给出建议或者发现 bug 那就更美了。文章来源:掘金社区作者:云享专家韦世东
-
Python如何爬取实时变化的WebSocket数据 一、前言 作为一名爬虫工程师,在工作中常常会遇到爬取实时数据的需求,比如体育赛事实时数据、股市实时数据或币圈实时变化的数据。如下图: ![20190906ly0001.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/06/1031571tkuvog8zi6r0pdn.png) Web 领域中,用于实现数据'实时'更新的手段有轮询和 WebSocket 这两种。轮询指的是客户端按照一定时间间隔(如 1 秒)访问服务端接口,从而达到 '实时' 的效果,虽然看起来数据像是实时更新的,但实际上它有一定的时间间隔,并不是真正的实时更新。轮询通常采用 拉 模式,由客户端主动从服务端拉取数据。 WebSocket 采用的是 推 模式,由服务端主动将数据推送给客户端,这种方式是真正的实时更新。 二、什么是 WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 WebSocket 优点 较少的控制开销:只需要进行一次握手,携带一次请求头信息即可,后续只传输数据即可,相比 HTTP 每次请求都携带请求头,WebSocket 非常省资源。 更强的实时性:由于服务器可以主动推送消息,这使得延迟变得可以忽略不计,相比 HTTP 轮询的时间间隔,WebSocket 可以在相同的时间内进行多次传输。 二进制支持:WebSocket 支持二进制帧,这意味着传输更节省。 …… 爬虫面对 HTTP 和 WebSocket Python 中的网络请求库非常多,Requests 是最常用的请求库之一,它可以模拟发送网络请求。但是这些请求都是基于 HTTP 协议的。在面对 WebSocket 的时候 Requests 就发挥不料作用了,必须使用能够连接 WebSocket 的库。 三、爬取思路 这里以莱特币官网 http://www.laiteb.com/ 实时数据为例。WebSocket 的握手只发生一次,所以如果需要通过浏览器开发者工具观察网络请求,则需要在打开页面的情况下,打开浏览器开发者工具,定位到 NewWork 选项卡,并输入或刷新当前页面,才能观察到 WebSocket 的握手请求和数据传输情况。这里以 Chrome 浏览器为例: ![20190906ly0002.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/06/103242z9hdodjetuojam0y.png) 在开发者工具中提供了筛选功能,其中 WS 选项代表只显示 WebSocket 连接的网络请求。 这时候可以看到请求记录列表中有一条名为 realTime 的记录,鼠标左键点击它后,开发者工具会分为左右两栏,右侧列出本条请求记录的详细信息: ![20190906ly0003.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201909/06/103335dgd4dcnzyflhbilj.png) 与 HTTP 请求不同的是,WebSocket 连接地址以 ws 或 wss 开头。连接成功的状态码不是 200,而是 101。 Headers 标签页记录的是 Request 和 Response 信息,而 Frames 标签页中记录的则是双方互传的数据,也是我们需要爬取的数据内容: Frames 图中绿色箭头向上的数据是客户端发送给服务端的数据,橙色箭头向下的数据是服务端推送给客户端的数据。 从数据顺序中可以看到,客户端先发送: {"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"}]} 复制代码 所以,从发起握手到获得数据的整个流程为: 那么,现在问题来了: 握手怎么弄? 连接保持怎么弄? 消息发送和接收怎么弄? 有什么库可以轻松实现吗? 四、aiowebsocket Python 库中用于连接 WebSocket 的有很多,但是易用、稳定的有 websocket-client(非异步)、websockets(异步)、aiowebsocket(异步)。 可以根据项目需求选择三者之一,今天介绍的是异步 WebSocket 连接客户端 aiowebsocket。其 Github 地址为:https://github.com/asyncins/aiowebsocket。 ReadMe中介绍到: AioWebSocket是一个遵循 WebSocket 规范的 异步 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 表示客户端向服务端发送的消息 recive 表示服务端向客户端推送的消息 五、编码获取数据 回到这一次的爬取需求,目标网站是莱特币官网: 从刚才的网络请求记录中,我们得知目标网站的 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.') 复制代码 运行代码后观察输出,你会发现什么都没有发生。既没有内容输出,也没有断开连接,程序一直在运行,但是什么都没有: 这是为什么呢? 是对方不接受我方的请求吗? 还是有什么反爬虫限制呢? 实际上,刚才的流程图可以解释这个问题: 整个流程中有一步是需要客户端给服务端发送指定的消息,服务端验证后才会不停推送数据。所以,应该在消息读取前、握手连接后加上消息发送的代码: 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 # 客户端给服务端发送消息 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.') 复制代码 保存后运行,就会看到数据源源不断的推送过来: 到这里,爬虫就能够获取到想要的数据了。 aiowebsocket 做了什么 代码不长,使用的时候只需要将目标网站 WebSocket 地址填入,然后按照流程发送数据即可,那么 aiowebsocket 在这个过程中做了什么呢? 首先,aiowebsocket 根据 WebSocket 地址,向指定的服务端发送握手请求,并校验握手结果。 然后,在确认握手成功后,将数据发送给服务端。 整个过程中为了保持连接不断开,aiowebsocket 会自动与服务端响应 ping pong。 最后,aiowebsocket 读取服务端推送的消息 【奎因:】如果你认为 aiowebsocket 帮助了你,那么请你到 Github https://github.com/asyncins/aiowebsocket 上给一个 Star。如果在使用当中发现问题或者希望给 aiowebsocket 提建议,那么也可以到 Github 上提出。只要你提出建议,就一定能够帮助 aiowebsocket 变的更好,而 aiowebsocket 也能够继续为你服务。
-
错误日志:2018-11-06 07:46:59,746 ERROR [registry-vert.x-eventloop-thread-2][][http.ServiceRegistryClientImpl 688] watcher connect to service center server failed, microservice 19a50f38e0f411e8b1c30255ac105523, Websocket connection attempt returned HTTP status code 404问题原因:在公有云环境下,服务调用是经过网关的,不支持使用websoket,在这种场景下,使用pull机制来更新实例。 需要设置如下参数:cse: service: instance: watch: false #使用API网关访问,只能使用PULL模式公有云环境连接服务中心的说明参考:https://huaweicse.github.io/cse-java-chassis-doc/servicecomb-using-cse/connect-service-center.html
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签