斗鱼弹幕数据爬取

斗鱼弹幕数据抓取

主要参考斗鱼的文档 dev-bbs.douyutv.com/forum.php?m…

建立连接

通过socket与弹幕服务器建立连接

第三方接入弹幕服务器列表:
IP 地址: openbarrage.douyutv.com 端口: 8601
复制代码

发送消息

协议组成

消息长度: 4 字节小端整数,表示整条消息(包括自身)长度(字节数)。消息长度出现两遍,二者相同

消息类型: 2 字节小端整数, 表示消息类型。取值如下: 689 客户端发送给弹幕服务器的文本格式数据 690 弹幕服务器发送给客户端的文本格式数据

加密字段: 暂时未用,默认为 0。 保留字段: 暂时未用,默认为 0。

数据部分:斗鱼独创序列化文本数据,结尾必须为‘\0’。

msg是要发送的数据部分,实际是要加上长度4头部4+4个字节长度的,也就是12个但是实际发出去的时候会自动加4个,所以+8

msg = msg.encode()
code = 689 # 客户端发送给弹幕服务器
msg_length = len(msg) + 8  # 加 8 就行 不行换12
head = struct.pack('i',msg_length) + struct.pack('i',msg_length) + struct.pack('i',code)
self.socket.sendall(head+msg)
复制代码

登录

登录弹幕服务器,不需要输入用户名和密码,应该是和游客模式一样

login = f"type@=loginreq/roomid@={self.room_id}/\x00"
复制代码

加入弹幕组

默认加入弹幕组-9999,海量弹幕组

joingroup = f"type@=joingroup/rid@={self.room_id}/gid@=-9999/\x00"
复制代码

心跳消息

保持于弹幕服务器的连接 每隔45秒发送心跳信息

msg = f"type@=keeplive/tick@={t}/\x00"
复制代码

解析消息

正则匹配返回的内容,然后转成Python对象,其中会存在不能转为utf-8的表情符号UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 75: invalid continuation byte 忽略这个错误

content_obj = {}
# print(content)
content = content.decode(errors='replace').strip()
tmp_kv_list = content.split('/')
for kv in tmp_kv_list:
    kv = kv.strip()
    if len(kv) == 0:
        continue
    kv = kv.split("@=")
    content_obj[kv[0]]=kv[1]
return content_obj
    
复制代码

之后可能会做

暂时就是为了好玩,没有做持久化处理,之后可能会做

代码地址

douyu

猜你喜欢

转载自juejin.im/post/5c0b7952f265da616f6fc893