天天看点

WebSocket反爬虫

WebSocket 侧重点在Socket。在客户端与服务器之间交换数据,当两者连接成功时,就可以保持长期连接,服务器可以直接向客户端推送数据,无需通过客户端发送多次请求。

  对于某些网站,服务器需要给客户端(浏览器)不断更新信息,对于这些实时更新的信息(如:服务器每1秒推送一次),大多以WebSocket技术为主。

  在请求网站时,当网页一加载,在请求中,可以发现状态为101,Type 为 websocket 的响应中,在其Messages中,首先看到客户端改善1条或n条信息给服务器,之后服务器就给客户端不停的推送信息,在此期间,客户端也会在一段时间(如:3秒)内给服务器发送信息,用来确认客户端还在再服务器连接,如下图。

WebSocket反爬虫

  而每次服务器推送回来的数据正是我们想要的信息。此时不得不去探究。

WebSocket 特点:

  1. URL地址以 ws 或 wss 开头;
  2. 数据在Messages中不停的推送与验证;
  3. 请求/响应头信息:
  • 请求头:
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爬虫