WebSocket 侧重点在Socket。在客户端与服务器之间交换数据,当两者连接成功时,就可以保持长期连接,服务器可以直接向客户端推送数据,无需通过客户端发送多次请求。
对于某些网站,服务器需要给客户端(浏览器)不断更新信息,对于这些实时更新的信息(如:服务器每1秒推送一次),大多以WebSocket技术为主。
在请求网站时,当网页一加载,在请求中,可以发现状态为101,Type 为 websocket 的响应中,在其Messages中,首先看到客户端改善1条或n条信息给服务器,之后服务器就给客户端不停的推送信息,在此期间,客户端也会在一段时间(如:3秒)内给服务器发送信息,用来确认客户端还在再服务器连接,如下图。
而每次服务器推送回来的数据正是我们想要的信息。此时不得不去探究。
WebSocket 特点:
- URL地址以 ws 或 wss 开头;
- 数据在Messages中不停的推送与验证;
- 请求/响应头信息:
- 请求头:
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: hsbccunVBv4NEdroi/OWcw==
Sec-WebSocket-Version: 13
- 响应头:
Connection: upgrade
Upgrade: WebSocket
Date: Sun, 15 Mar 2020 13:57:23 GMT
Sec-WebSocket-Accept: ELbu6ydVcJK2fT0RwiV1TvYTJ7g=
++相比平常的请求/响应头信息,它们多出以上信息。++
Connection: Upgrade
Upgrade: websocket
声明这是一个websoket协议。
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: hsbccunVBv4NEdroi/OWcw==
Sec-WebSocket-Version: 13
Sec-WebSocket-Accept: ELbu6ydVcJK2fT0RwiV1TvYTJ7g=
用来验证客户端与服务器之间的验证。
WebSocket 简单说明:
-
服务器:
在服务器中,服务器创建socket服务,使服务器监听客户端发送的请求,当客户端给服务器发送请求(握手请求)后,服务器将请求的信息进行验证,如果验证成功,返回101,并与客户端建立连接,这时客户端与服务器之间就可以互相通信,否则其它操作(403)。
-
客户端:
在客户端中,客户端按照WebSocket规范生成请求信息(握手信息),并向服务器发送请求,然后对服务器读取服务器响应信息,最后验证客户端与服务器的握手结果。
爬虫采集(Python):
对于此类,爬虫如何去采集数据呢?代码中难点无非是怎样保持连接、消息发送与连接。
在Python中,我们常使用的urllib、requests等库已经无法满足要求。但是对强大Python中,怎么可能没有解决的呢。
Python中连接 WebSocket的库有很多,但是易用、稳定的有 websocket-client(非异步)、websockets(异步)、aiowebsocket(异步)。这里推荐使用aiowebsocket。Github
WebSocket 争对爬虫:
相比平常的网站,Socket技术在爬虫上面已经是一个坎。但是这个坎不是太深,要想挖更深的坎,需要与JavaScript或其它技术的结合。让爬虫工程师觉得成本>信息。
-
挖深坑方式:
1. 添加请求时信息验证难度。
如:在URl中添加加密信息,在请求中添加加密信息
2. 在握手成功之后添加信息验证。
如:连接成功之后,需要客户端发送给服务加密信息验证
3. 连接成功后,连接中期间不时添加信息客户端消息验证。
如:连接成功之后,服务器可以向客户端正常发送信息,但是需要客户端每隔断时间给服务器发送信息。
WebSocket Ping
WebSocket 的保持长时间有忧点也有缺点,就是在长时间连接上,耗费的资源比较大,为了解决这个问题,所以WebSocket Ping产生了。
WebSocket 协议规范约定,服务器可以向客户端发送Ping帧,当客户端收到Ping时应当回复Pong帧。如果客户端不回复或者回复的并不是Pong帧,那么服务器就可以认为客户端异常,主动关闭连接。WebSocket Ping以接收/回复的方式,使其在工作性能上优于WebSocket。
参考文章:
Websocket原理
基于websocket爬虫