调用斗鱼API爬取直播间弹幕信息(用户昵称及弹幕内容)

查看《斗鱼弹幕服务器第三方接入协议v1.4.1》,了解斗鱼API的使用方法,即如何连接斗鱼弹幕服务器、维持连接及获取弹幕信息

Python调用斗鱼API爬取直播间弹幕信息代码和注释

爬取结果示例

1. 查看《斗鱼弹幕服务器第三方接入协议v1.4.1》,了解斗鱼API的使用方法,即如何连接斗鱼弹幕服务器、维持连接及获取弹幕信息

1.1 登陆授权

欲从后台获取弹幕信息的客户端在于服务器建立TCP连接后,需发起登陆请求(包括相关验证信息),后台验证请求信息无误后,返回登陆成功相应。

1.2 房间分组

为管理斗鱼的直播间及弹幕,后台服务器有两个重要概念:房间号和分组号。

房间号与主播的直播间地址为一一对应关系。一般直播间房间号可在其 URL地址中找到,例如 http://www.douyutv.com/301712其中301712即为房间号。

分组号为某特定直播间不同观众所在弹幕交流群体的标识。其意义主要为将人数过多弹幕信息量过大的直播间观众进行切割分片管理,以防止观众接收过多弹幕而导致机器负载过重。分组号为整数,一般从 0 开始动态增加改变。特别注意-9999 特殊分组号,该组成员将接受对应直播间全部弹幕,即“海量弹幕”分组。

登陆授权为获取弹幕的基础,而加入房间及其分组为获取指定直播间弹幕的必要条件。

1.3 弹幕信息

弹幕信息包括以下类型:

文字弹幕

领取在线鱼丸暴击消息

赠送礼物消息

用户进房通知消息(为感谢大力支持斗鱼平台的用户而设置的进房提示信息)

用户赠送酬勤通知消息

用户信息

房间开关播提醒

广播排行榜消息

超级弹幕消息

房间内礼物广播

房间用户抢红包

房间内 top10 变化消息

1.4 心跳信息

斗鱼的弹幕协议是建立在TCP长连接服务上的,为管理这些长连接,保证及时销毁无用的连接以释放资源服务于有需的用户,斗鱼后台需要与客户端保持心跳。(目前后台设置每45秒向后台发送一条心跳信息)

1.5 斗鱼后台协议头设计

客户端向斗鱼弹幕服务器发起请求时,发送的信息必须包括如下设计的协议头。

斗鱼后台协议头

字段说明:

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

消息类型:2 字节小端整数,表示消息类型。取值如下:

689 客户端发送给弹幕服务器的文本格式数据

(我们客户端向服务器发送的协议头要包括689)

690 弹幕服务器发送给客户端的文本格式数据。

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

保留字段:暂时未用,默认为 0。(消息类型,加密字段,保留字段三个字段加在一起4字节)

数据部分:斗鱼独创序列化文本数据,结尾必须为'\0'。(即发送的请求信息最后一个字符必须为'\0')

1.6 序列化

详情见文档

2. Python调用斗鱼API爬取直播间弹幕信息代码和注释

第三方客户端通过 TCP 协议连接到弹幕服务器(依据指定的 IP 和端口);

第三方接入弹幕服务器列表:

IP 地址:openbarrage.douyutv.com 端口:8601

发送请求的数据部分格式:

客户端心跳消息:

心跳信息

登陆请求消息:

登录请求信息

入组消息

入组消息

获取收到的数据中的文字弹幕信息,文字弹幕信息的格式:

文字弹幕信息格式

参考资料:

'''

文件名:爬取斗鱼直播间信息到jsonline文件.py

参考的github:https://github.com/rieuse

'''

from __future__ import unicode_literals

import multiprocessing

import socket

import time

import re

import requests

from bs4 import BeautifulSoup

import json

# 配置socket的ip和端口

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostbyname("openbarrage.douyutv.com")

port = 8601

client.connect((host, port))

# 获取用户昵称及弹幕信息的正则表达式

danmu = re.compile(b'type@=chatmsg.*?/nn@=(.*?)/txt@=(.*?)/')

def sendmsg(msgstr):

'''

客户端向服务器发送请求的函数,集成发送协议头的功能

msgHead: 发送数据前的协议头,消息长度的两倍,及消息类型、加密字段和保密字段

使用while循环发送具体数据,保证将数据都发送出去

'''

msg = msgstr.encode('utf-8')

data_length = len(msg) + 8

code = 689

msgHead = int.to_bytes(data_length, 4, 'little') \

+ int.to_bytes(data_length, 4, 'little') + int.to_bytes(code, 4, 'little')

client.send(msgHead)

sent = 0

while sent < len(msg):

tn = client.send(msg[sent:])

sent = sent + tn

def start(roomid):

'''

发送登录验证请求后,获取服务器返回的弹幕信息,同时提取昵称及弹幕内容

登陆请求消息及入组消息末尾要加入\0

'''

msg = 'type@=loginreq/roomid@={}/\0'.format(roomid)

sendmsg(msg)

msg_more = 'type@=joingroup/rid@={}/gid@=-9999/\0'.format(roomid)

sendmsg(msg_more)

print('---------------欢迎连接到{}的直播间---------------'.format(get_name(roomid)))

while True:

data = client.recv(1024)

danmu_more = danmu.findall(data)

if not data:

break

else:

with open('bullet_curtain.jl', 'a') as f:

try:

for i in danmu_more:

dmDict={}

dmDict['昵称'] = i[0].decode(encoding='utf-8', errors='ignore')

dmDict['弹幕内容'] = i[1].decode(encoding='utf-8', errors='ignore')

dmJsonStr = json.dumps(dmDict, ensure_ascii=False)+'\n'

print(dmDict['昵称'])

f.write(dmJsonStr)

danmuNum = danmuNum + 1

except:

continue

def keeplive():

'''

发送心跳信息,维持TCP长连接

心跳消息末尾加入\0

'''

while True:

msg = 'type@=keeplive/tick@=' + str(int(time.time())) + '/\0'

sendmsg(msg)

time.sleep(10)

def get_name(roomid):

'''

利用BeautifulSoup获取直播间标题

'''

r = requests.get("http://www.douyu.com/" + roomid)

soup = BeautifulSoup(r.text, 'lxml')

return soup.find('a', {'class', 'zb-name'}).string

# 启动程序

if __name__ == '__main__':

room_id = input('请输入房间ID: ')

p1 = multiprocessing.Process(target=start, args=(room_id,))

p2 = multiprocessing.Process(target=keeplive)

p1.start()

p2.start()

3. 爬取结果示例

爬取结果示例

python 爬取直播弹幕视频_调用斗鱼API爬取直播间弹幕信息(用户昵称及弹幕内容)...相关推荐

  1. python爬取付费直播的视频_教你用20行代码爬取直播平台弹幕(附源码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  2. python爬斗鱼直播_从零开始写Python爬虫 --- 爬虫应用: 利用斗鱼Api抓取弹幕

    七月末的南京简直开启了「微波炉」模式,白天要学车的我,晚上自然选择宅在家看直播,看着狗贼叔叔满屏幕的弹幕,我就想着能不能把弹幕爬下来呢?说干就干 结果的展示: 这里只抓到弹幕内容和发送用户 并输出在终 ...

  3. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  4. python对excel表统计视频_列表常见统计方式2_【曾贤志】用Python处理Excel数据 - 第1季 基础篇_Excel视频-51CTO学院...

    ---------------------------------------------------------------- 学完本课程可继续巩固篇:https://edu.51cto.com/c ...

  5. python对excel表统计视频_元组常用统计方法_【曾贤志】用Python处理Excel数据 - 第1季 基础篇_Excel视频-51CTO学院...

    ---------------------------------------------------------------- 学完本课程可继续巩固篇:https://edu.51cto.com/c ...

  6. 易语言取java路径模块_易语言API模块制作进程取程序路径

    易语言API模块制作进程取程序路径,提高进程的PID获取程序的所在路径. 进程_取程序路径 1.CreateToolhelp32Snapshot 快照句柄 = CreateToolhelp32Snap ...

  7. java实现文本纠错功能_调用百度API进行文本纠错

    毕设做的是文本纠错方面,然后今天进组见研究生导师 .老师对我做的东西蛮感兴趣.然后介绍自己现在做的一些项目,其中有个模块需要有用到文本纠错功能. 要求1:有多人同时在线编辑文档,然后文档功能有类似Wo ...

  8. python爬取网站教学视频_零基础Python爬取网页文章和图片详细教学(内附源码、教学视频)...

    Python爬虫,这个我相信对于很多人来说都不陌生! 今天小编给大家提供一份零基础Python爬取网页图片以及小说的代码并且详细的和大家讲解一下! 开发环境:版本Python3.6.2!(2版本会在2 ...

  9. python爬人人贷代码视频_【IT专家】人人贷网的数据爬取(利用python包selenium)

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 人人贷网的数据爬取(利用 python 包 selenium ) 2016/12/31 0 记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合 ...

最新文章

  1. redissession有容量上限吗_空气炸锅值得买吗?
  2. 如何选择一线城市和二线城市?
  3. 3 calender python_python3笔记二十一:时间操作datetime和calendar
  4. python使用imbalanced-learn的RandomUnderSampler方法进行下采样处理数据不平衡问题
  5. 一周的微信公众平台接口开发总结
  6. CentOS中怎样安装mysql并修改密码、设置开机启动、配置远程连接
  7. leetcode674. 最长连续递增序列
  8. [Python學習筆記] 使用xlwings 插入註解 (forked 版本)
  9. leetcode刷题日记-两数之和系列
  10. 自定义小型ajax框架-ajax讲义二
  11. JanusGraph基础知识
  12. c语言中scanf的用法
  13. 【预防流感】冬春之交推荐吃香菜
  14. 亲自面试汇丰银行面试题目总结
  15. SAP Data Service操作简介
  16. Codeforces 1144 D
  17. 通过C#生成支付宝收款码 三(支付宝官方SDK配合沙箱调试扫条码支付)
  18. PHP 简单案例[4]
  19. 机器人女友亮相科技展,未来智能美女机器人有可能会成为一种潮
  20. Ubuntu8.04安装Realplayer11

热门文章

  1. 【圆梦云巨献 更新至7.5】全网首发小程序开发视频
  2. 液压基础知识01 —— 压力单位换算
  3. MPU6050 - 陀螺仪 - 技术总结
  4. 用docker-compose构建mysql主从结构
  5. 软件 VSCODE详细下载教程
  6. M401a系列:armbian下docker安装openwrt做旁路由
  7. Microsoft Edge是一款现代化的浏览器,它拥有众多功能和强大的性能
  8. Android ART虚拟机
  9. UnityRPG游戏中的球形检测范围
  10. python没有pygame_Python制作十款经典的童年游戏(附源码)