webSocket 是一种在单个 TCP 连接上进行全双工通信的协议, 简单来说就是建立一个 TCP 长连接之后, 你可以服务器随时可以给客户端发送消息, 客户端随时可以给服务器发送消息, 而以前只能是客户端给服务器发送消息, 服务器返回消息.
号: 960410445
群里有志同道合的小伙伴, 互帮互助,
群里有不错的视频学习教程和 PDF!
websocket 协议我们简称为 ws,ws 的网络爬虫其原理和普通爬虫没有其他区别, 都是模拟客户端与服务器进行对话, 不同的是我们要用到 websocket 库.
测试网址是 websocket 官网提供的 demo, http://demos.kaazing.com/echo/index.html
image
image.gif
我们抓包看看 ws 协议的通信特点:
image
image.gif
一次连接双向通信, 在浏览器开发者工具中, 点击 ws 数据包在弹出的详情中点击 Frames, 这里面是通信的数据. 知道了大致的工作原理以后我们来实现一个简单的无验证, 无加密内容的 ws 爬虫, 目标网址还是上面那个.
我们实现和目标网址之前的数据交互, 常见方法如下:
- # -*- coding:utf-8 -*-
- import websocket
- url = 'ws://demos.kaazing.com/echo'
- ws = websocket.create_connection(url=url, timeout=15)
- ws.send("以字符串发送数据") # 以字符串发送消息
- ws.recv() # 接收消息, 如果无消息将会堵塞, 直到 15s 超时等待结束
- ws.send_frame("以帧形式发送数据") # 以帧形式发送数据
- ws.recv_data_frame() # 接收以帧发送的数据
- ws.send_binary("以二进制格式发送数据".encode()) # 以二进制格式发送数据
- ws.send_close() # 向服务器发送关闭连接请求, 传入状态码及其原因
- ws.close() # 关闭连接
image.gif
- ws = websocket.create_connection(url=url, timeout=15)
- ws.send("以字符串发送数据")
- 30
- ws.recv()
- '以字符串发送数据'
- ws.send_frame("以帧形式发送数据")
- 8
- data = ws.recv_data_frame()
- data
- (8, <websocket._abnf.ABNF object at 0x07FD4C90>)
- data[1].data
- b'\x03\xea'
image.gif
看似很简单, 但在实际中会伴随着很多通信的加密, 这个需要在具体问题中具体分析, 主要就三个方面: 建立 ws 连接, 发送消息, 接收消息.
ws 的应用在即时性较强的信息传播行业, 如股票, 彩票, 赛事, 通信中用的很普遍, 但是其难度并不大.
来源: http://www.jianshu.com/p/042b764603b9