Python爬取斗鱼弹幕——多房间同时抓取实现(一)从单个房间开始
技能储备需求
我们从零基础出发,但前提是假设我们已经有了基本python语法基础(比如我已经会了 Hello World!)现在需要学的:
- 套接字socket
- 正则表达式
- 多线程爬虫
- requests库的使用
- json库的使用
以上五个是我们接下来会用到的,我们只要知道基本用法,如果只是单纯想实现爬弹幕功能,不需要深究。
斗鱼弹幕服务器第三方接入通讯协议
- 此文档对斗鱼平台弹幕和相关消息通讯协议格式进行了详细说明,同时附带获取弹幕的详细操作步骤,意为第三方平台获取斗鱼弹幕等信息提供帮助。
- 在谷歌上或者登陆官方论坛(http://dev-bbs.douyutv.com/forum.php) 都可以下载此文档
步入正题
Step1 建立与服务器连接
斗鱼弹幕通讯协议是一种基于 TCP 服务的应用层协议。我们可以从上文所提及文档中连接初始化的步骤。第三方客户端通过 TCP 协议连接到弹幕服务器(依据指定的 IP 和端口)。
第三方接入弹幕服务器列表:
IP 地址:openbarrage.douyutv.com 端口:8601
我们使用socket库来建立连接。
步骤很简单:
- 初始化socket
- 利用socket库中的connect方法建立连接
说明:connect方法需要的参数host我们可以通过IP地址来获取。
以下是代码
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # create a socket
host = socket.gethostbyname("openbarrage.douyutv.com") # get the host(8601) of Douyu
port = 8601
s.connect((host, port)) # connect the socket to Douyu
连接成功之后,我们可以用socket库中的recv方法获取服务器返回消息。但是到这一步,我们还不能收到弹幕消息。(房间还没进呢)
step2 登录及进入弹幕分组
根据斗鱼弹幕服务器协议要求,第三方接入需要先向服务器发送登录请求,并加入分组,服务器才会将客户端添加到请求指定弹幕分组,并返回相关消息。
这也很好理解,我们得先告诉对方我们想要获取什么,对方才好返回消息。
步骤
- 登录
客户端向弹幕服务器发送登录请求,登录弹幕服务器;弹幕服务器收到客户端登录请求并完成登录后,返回登录成功消息给客户端。
在此之前,我们需要知道斗鱼对于第三方发送的消息格式有自己的一套协议,所以,我们发送的登录请求必须符合这一规定。
斗鱼后台协议头设计如下:
字段说明如下:
消息长度:4 字节小端整数,表示整条消息(包括自身)长度(字节数)。
消息长度出现两遍,二者相同。
消息类型:2 字节小端整数,表示消息类型。取值如下:
689 客户端发送给弹幕服务器的文本格式数据
690 弹幕服务器发送给客户端的文本格式数据。
加密字段:暂时未用,默认为 0。
保留字段:暂时未用,默认为 0。
数据部分:斗鱼独创序列化文本数据,结尾必须为‘\0’。详细序列化、反
序列化算法见下节。(所有协议内容均为 UTF-8 编码)
简述
简而言之,上述协议是规定了一套协议头的格式,就是说,我们想要发送给服务器的任何消息之前都需要加上上面的协议头。所以我们接下来的工作就是要写好这一段协议头。
以下是代码:
data_length =