python爬取斗鱼弹幕_【Python3爬虫】斗鱼弹幕爬虫
在网上找到了一份斗鱼弹幕服务器第三方接入协议v1.6.2,有了第三方接口,做起来就容易多了。
一、协议分析
斗鱼后台协议头设计如下:
这里的消息长度是我们发送的数据部分的长度和头部的长度之和,两个消息长度是一样。然后要注意的是该协议使用的是小端整数,所以我们要对数据进行处理后再发送,这里可以使用int.to_bytes()将整数转变成小端整数的形式。示例如下:
int.to_bytes(12,4,'little') # b'\x0c\x00\x00\x00'
int.to_bytes(12,4,'big') # b'\x00\x00\x00\x0c'
然后消息类型是689(689表示客户端发送给服务器,690表示服务器发送给客户端),加密字段和保留字段都是默认为0。这里由于消息类型是两个字节的,加密字段和保留字段都是一个字节,但是因为加密字段和保留字段都是0,所以这四个字节可以使用int.to_bytes(689,4,'little')来表示。最后该协议使用的是utf-8编码,所以我们需要对整个数据进行编码后再发送。
二、具体步骤
1、连接服务器
第三方客户端通过 TCP 协议连接到弹幕服务器(依据指定的 IP 和端口),其中IP 地址为openbarrage.douyutv.com,端口为8601,相关代码如下:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("openbarrage.douyutv.com")
port = 8601
client.connect((host, port))
2、发送登录请求
客户端向弹幕服务器发送登录请求,登录弹幕服务器,格式如下:
type@=loginreq/roomid@=房间号/
3、发送加组请求
客户端收到登录成功消息后发送进入弹幕分组请求给弹幕服务器,格式如下:
type@=joingroup/rid@=房间号/gid@=-9999/
gid表示分组号,第三方平台建议选择-9999即海量弹幕模式。
4、接收广播消息
接收服务器发送的广播消息,包括用户发的弹幕和送的礼物信息,然后解析得到具体的内容。但这些数据里只有礼物的id而没有具体的礼物名称,然后我通过抓包找到了两个链接,里面包含了礼物id和名称的对应关系,相关代码如下:
1 gift_dict ={}2 headers ={3 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/68.0.3440.75 Safari/537.36"
4 }5 url1 = "https://webconf.douyucdn.cn/resource/common/gift/flash/gift_effect.json"
6 res1 = requests.get(url1, headers=headers)7 js1 = json.loads(res1.text.lstrip('DYConfigCallback(').rstrip(');'))8 gift_data1 = js1['data']['flashConfig'] 9 for i ingift_data1.keys():10 gift_dict[gift_data1[i]['id']] = gift_data1[i]['name']11
12 url2 = "https://webconf.douyucdn.cn/resource/common/prop_gift_list/prop_gift_config.json"
13 res2 = requests.get(url2, headers=headers)14 js2 = json.loads(res2.text.lstrip('DYConfigCallback(').rstrip(');'))15 gift_data2 = js2['data']16 for i ingift_data2.keys():17 gift_dict[int(i)] = gift_data2[i]['name']
5、发送心跳消息
客户端每隔45秒给服务器发送一次心跳消息,用于维护和服务器后台间的联系,格式如下:
keep_msg = "type@=keeplive/tick@=十位时间戳" # 旧版心跳消息
keep_msg = "mrkl/" # 新版心跳消息
6、核心代码
在发送数据的时候,有可能会出现一次无法发送完的情况,所以就需要多发送几次,确保把数据都发送出去:
1 msg = msg + '\0' #数据以'\0'结尾
2 msg = msg.encode('utf-8') #使用utf-8编码
3 length = len(msg) + 8 #消息长度
4 code = 689 #消息类型
5 #消息头部:消息长度+消息长度+消息类型+加密字段(默认为0)+保留字段(默认为0)
6 head = int.to_bytes(length, 4, 'little') + int.to_bytes(length, 4, 'little') + int.to_bytes(code, 4, 'little')7 #发送头部部分
8 client.send(head)9 #发送数据部分
10 sent =011 while sent
13 sent = sent + n
三、运行结果
运行截图:
进入数据库查看结果:
db.getCollection('DouYu-6039226').find({"data_type":"gift"})
结果如下:
还可以看看大家都发了什么弹幕:
db.getCollection('DouYu-6039226').find({"data_type":"chat"},{"user_name":1,"chat_txt":1,"_id":0})
结果如下:
完整代码已上传到GitHub!
python爬取斗鱼弹幕_【Python3爬虫】斗鱼弹幕爬虫相关推荐
- python爬取京东书籍_一个scrapy框架的爬虫(爬取京东图书)
我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...
- python爬取路况信息_北京市交通管理局实时路况爬虫 | 学步园
最近无人车项目需要用到交通管理局的实时路况信息,导师要求将实时路况信息爬下来. 我的想法是,因为路况信息是实时更新的,有最新的路况他们会更新,因此需要让程序隔一段时间运行一次,检查这次爬下的内容与上一 ...
- python爬取高德地图_爬虫实战:如何爬取高德地图?
提起高德地图,咱们每一个人都不会陌生,高德地图是一款非常好用的地区服务软件,很多用户在出行的时候都会使用这款软件,日程用来导航,也可以用来打车,一次呼叫多种车型,用户可以在这里获得更好的服务,随时都可 ...
- python爬取地图地址_网络爬虫-python爬取高德地图地点
python爬取你想要的数据,近期由于业务需求,用python爬取了高德地图一些地点的数据,爬出来数据大致情况如下: image 下面是基本流程: 2.安装网络爬取第三方库,主要是下面三个(pip i ...
- python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片
前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...
- python爬取携程网旅游_爬虫之携程网旅游信息爬取
最近手又有点闲,闲着无聊就爬取了携程的信息,这个爬虫是我随手写的,各位可以看看. # -*- encoding=utf-8 -*- #爬取携程旅游信息 #2017/8/14 from bs4 impo ...
- python爬取bilibili数据_如何使用Python爬取bilibili视频(详细教程)
Python爬取bilibili视频 摘要 为了解决PC端的bilibili无法下载视频的问题,使用python语言可以实现一个能够爬取bilibili某个视频资源(不包括会员视频)的程序.采用整个视 ...
- python爬取电影评分_用Python爬取猫眼上的top100评分电影
代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...
- Python爬取哔哩哔哩实时直播弹幕
用Python爬取哔哩哔哩直播弹幕,关键在于找到哔哩哔哩网站的一个POST网址,和应该POST的数据.代码不长,十分简单.关键在于浏览器开发者工具的使用.希望对于新入门的萌新有一定的借鉴意义. 1.找 ...
- python爬取百度搜索_使用Python + requests爬取百度搜索页面
想学一下怎样用python爬取百度搜索页面,因为是第一次接触爬虫,遇到一些问题,把解决过程与大家分享一下 1.使用requests爬取网页 首先爬取百度主页www.baidu.com import r ...
最新文章
- 【iOS7开发笔记】tableview之通过代码自定义cell(cell的高度不一致)
- 学习如何用自己的 appender 来扩展 log4j 框架
- 操作多个表_3_查询两个表共同的行
- xmx java_为什么我的Java进程比Xmx消耗更多的内存?
- 在Payara Server和GlassFish中配置密码
- ] 求鉴定:《终于知道ramdisk 4g是如何使用4G以上内存了,慎用!》
- CodeMirror动态加载和表单提交
- SQL 增删改查(具体)
- 计算机软考网络工程师,软考之网络工程师总结
- android无效安装包,无效的apk文件是怎么回事_无效的apk文件问题解析
- 英雄联盟服务器维修中启动游戏失败,电脑登录英雄联盟失败的八种解决方法
- 友善之臂mini2440使用日志1
- java用线程做小球碰撞_多线程之碰撞小球
- ubuntu 安装java运行环境,Ubuntu 安装java环境搭建
- 能哄老婆睡觉的小故事
- 【算法】最直接的算法——穷举法详解
- QT+OSG/osgEarth编译之三十八:Snappy+Qt编译(一套代码、一套框架,跨平台编译,版本:Snappy-1.1.9)
- Operators in MXNet-Dropout
- 什么是GPRS,CMWAP,CMNET-移动网络介绍
- webStorm 3.0配置使用主题背景色等
热门文章
- java可视化编程软件有哪些_几款Java开发者必备常用的工具,准点下班不在话下...
- 恢复win7开机动画
- linux系统怎么改输入法,linux系统输入法怎么切换
- 申万一级行业日指数_2017年申万一级行业分类表
- linux运维零基础学习,没有基础怎么学习Linux运维?Linux学习
- Jmeter安装TPS插件
- DSP28335串口打印 printf
- C#建立手机号段全库
- 01-SQL基本语句
- 【MCM-2017】2017年数学建模美赛题目原文及翻译-A (个人思路)