说起来,弹幕这种东西的出现,真的给众多网友带来无数的欢乐源泉。

当然,密集恐惧症患者慎入,毕竟某些视频的弹幕可谓是刷得密密麻麻的。

整个屏幕看的不是剧情,是弹幕。

以前是磕CP很快乐,现在是磕着弹幕也满满快乐。

分分钟带动网络新兴流行语言。

既然是在学Pythobn爬虫技术,那么,我们又能不能通过爬虫抓取这些有意识的弹幕呢?

不如接下来跟着小千一起来学一学吧!

结果的展示:

这里只抓到弹幕内容和发送用户

并输出在终端上,有兴趣的小伙伴

可以在这个基础上接着开发,

搜集弹幕做做数据分析也是很ok的啊!

下面是展示图:

资料的搜集

面向Google编程的我,第一件事当然是键入关键词:「Python 弹幕」

吃惊的是,网上已经有了炒鸡完善的弹幕第三方库:「DanMU」

使用起来也是炒鸡简单,十几行代码就能轻松获取直播间的弹幕了,

有兴趣的同学可以去搜索看看。

本着练手和不折腾会死的态度,我还是想尝试自己写一个版本出来,

然后就找到了 斗鱼居然开放了Api,

这样的话,只要稍微处理一下,就能愉快的获取想要的信息了。

斗鱼Api接口文档和接入协议

仔细观察文档之后,我发现只要自己实现一下协议头,就能接入弹幕服务器了,接着构造弹幕请求,就能实时的获取每一条弹幕了。

请求头的构造

先看文档的要求:

简而言之呢:请求一共分为三个部分:长度,头部,数据部

分别按照文档的要求构造就行,

需要注意的是,获取和返回的类型是都是 Bytes代码:

def send_req_msg(msgstr):

'''构造并发送符合斗鱼api的请求'''

msg = msgstr.encode('utf8')

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 DM_start(roomid):

# 构造登录授权请求

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

send_req_msg(msg)

# 构造获取弹幕消息请求

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

send_req_msg(msg_more)

while True:

# 服务端返回的数据

data = client.recv(1024)

# 通过re模块找发送弹幕的用户名和内容

danmu_username = username_re.findall(data)

danmu_content = danmu_re.findall(data)

if not data:

break

else:

for i in range(0, len(danmu_content)):

try:

# 输出信息

print('[{}]:{}'.format(danmu_username[0].decode(

'utf8'), danmu_content[0].decode(encoding='utf8')))

except:

continue

def keeplive():

'''

保持心跳,15秒心跳请求一次

'''

while True:

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

send_req_msg(msg)

print('发送心跳包')

time.sleep(15)

tricky 的部分

上面的内容,说起来都不是很难,

但是想要完整的实现需求,

这里需要的知识还是比较多的:socket相关

正则表达式相关

signal相关

多线程、多进程相关

比如我想要实现捕捉「ctrl+c」的信号,

好在我们退出程序的时候,能够正确的处理

这时候就要用到signal相关的知识

说起来,在今天之前,我完全不知道还可以这样用。

总之越是学到后面,

越是会觉得自己的知识储备不足,

Python 作为一门十分强大和容易上手的语言,

能够帮助我们迅速的实现需求,

但是不要认为他单单只能写爬虫哦~

完整的代码

有详细的注释哦:

'''

利用斗鱼弹幕 api

尝试抓取斗鱼tv指定房间的弹幕

'''

import multiprocessing

import socket

import time

import re

import signal

# 构造socket连接,和斗鱼api服务器相连接

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

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

port = 8601

client.connect((host, port))

# 弹幕查询正则表达式

danmu_re = re.compile(b'txt@=(.+?)/cid@')

username_re = re.compile(b'nn@=(.+?)/txt@')

def send_req_msg(msgstr):

'''构造并发送符合斗鱼api的请求'''

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 DM_start(roomid):

# 构造登录授权请求

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

send_req_msg(msg)

# 构造获取弹幕消息请求

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

send_req_msg(msg_more)

while True:

# 服务端返回的数据

data = client.recv(1024)

# 通过re模块找发送弹幕的用户名和内容

danmu_username = username_re.findall(data)

danmu_content = danmu_re.findall(data)

if not data:

break

else:

for i in range(0, len(danmu_content)):

try:

# 输出信息

print('[{}]:{}'.format(danmu_username[0].decode(

'utf8'), danmu_content[0].decode(encoding='utf8')))

except:

continue

def keeplive():

'''

保持心跳,15秒心跳请求一次

'''

while True:

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

send_req_msg(msg)

print('发送心跳包')

time.sleep(15)

def logout():

'''

与斗鱼服务器断开连接

关闭线程

'''

msg = 'type@=logout/'

send_req_msg(msg)

print('已经退出服务器')

def signal_handler(signal, frame):

'''

捕捉 ctrl+c的信号 即 signal.SIGINT

触发hander:

登出斗鱼服务器

关闭进程

'''

p1.terminate()

p2.terminate()

logout()

print('Bye')

if __name__ == '__main__':

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

# 狗贼的房间号

room_id = 208114

# 开启signal捕捉

signal.signal(signal.SIGINT, signal_handler)

# 开启弹幕和心跳进程

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

p2 = multiprocessing.Process(target=keeplive)

p1.start()

p2.start()

说真的,Python爬虫技术的运用及其广泛,不仅仅是可以在我们日常生活中提供不少便利。

Python爬虫可以做的事情很多,如搜索引擎、采集数据、广告过滤等,Python爬虫还可以用于数据分析,在数据的抓取方面可以作用巨大!

python采集直播_天天再看斗鱼直播?教你如何用Python技术抓取弹幕相关推荐

  1. 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...

  2. python手把手入门_新手必看:手把手教你入门 Python

    首先,Python是什么?据它的创始人Guido van Rossum而言, "Python是一种高级编程语言,它的核心设计思想是代码可读性和允许程序员用几行代码来表达观点的语法." ...

  3. python画企鹅_相信你也可以,一文学会如何用Python绘制分块图

    最近咱们一直在聊Python的相关东东,有朋友私信问我能否聊一下其他编程语言的,比如Java相关的内容,其他编程语言咱们后面会聊哦,前期咱们先把Python相关的实用技能给讲清楚哦! 好啦,今天咱们继 ...

  4. python批量检索文献_快解锁新姿势,教你如何用Python搞定文献搜索和科研图片!...

    相比实验论文,发表SCI应该更让科研狗们重视和焦虑. 起初看到读博的同学发表SCI论文,心里面就已经酸了,后来「本科生发数篇 SCI」的新闻屡见不鲜,现在甚至连小学生都跑出来分一杯羹-- 前段时间,B ...

  5. python获取最新学术文献_快解锁新姿势,教你如何用Python搞定文献搜索和科研图片!...

    相比实验论文,发表SCI应该更让科研狗们重视和焦虑. 起初看到读博的同学发表SCI论文,心里面就已经酸了,后来「本科生发数篇 SCI」的新闻屡见不鲜,现在甚至连小学生都跑出来分一杯羹-- 前段时间,B ...

  6. python编程怎么建立工程_教你如何用Python脚本快速创建项目

    相信初学Cocos2D者对Python还很陌生,今天本篇教程教你如何用Python脚本快速创建项目. 在Cocos2d-x2.1.4以上的版本中,取消了使用vs模版创建项目的方法,开始使用python ...

  7. win7服务器系统很卡,win7系统看斗鱼直播很卡的解决方法

    很多小伙伴都遇到过win7系统看斗鱼直播很卡的困惑吧,一些朋友看过网上零散的win7系统看斗鱼直播很卡的处理方法,并没有完完全全明白win7系统看斗鱼直播很卡是如何解决的,今天小编准备了简单的解决办法 ...

  8. python excel 打印文档_教你如何用Python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!...

    原标题:教你如何用Python轻轻松松操作Excel.Word.CSV,一文就够了,赶紧码住!!! 作者:奈何缘浅wyj Python 操作 Excel 常用工具 数据处理是 Python 的一大应用 ...

  9. python怎么画人像_教你如何用Python画出心目中的自己

    原标题:教你如何用Python画出心目中的自己 引言:人脸图像的生成在各个行业有着重要应用,例如刑事调查.人物设计.教育培训等.然而一幅逼真的人脸肖像,对于职业画家也要至少数小时才能绘制出来:对于从未 ...

最新文章

  1. 李开复从不缺席的AI夏令营开营:今年周志华俞勇张潼授课,1万人报名仅600入选...
  2. oracle12c导11g,Oracle12c的数据库如何向11g导入
  3. Shell 学习笔记之运算符
  4. 用友U9执行JS代码。
  5. c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...
  6. FMI在仿真软件SkyEye中的应用
  7. 【程序员面试干货】资深面试官告诉你:测试工程师面试要注意什么?
  8. wps临时文件不自动删除_今天才发现,原来C盘这些文件夹可以删除,难怪你的电脑越用越卡...
  9. 学习Python+numpy数组运算和矩阵运算看这254页PPT就够了
  10. 用Flask封装下Ansible提供后端API
  11. 前端学习之touch.js与swiper学习
  12. 计算机阅卷系统 流程,河北鑫众博电脑阅卷系统六步操作过程
  13. 计算机操作员评分标准,计算机操作员EXCEL操作竞赛样卷与评分标准.doc
  14. angular2 + XLSX 导出一张工作簿中包含多张表格
  15. 带表情字符插入mysql字段报错问题处理 Incorrect string value: ‘\xF0\xA5\x8C\x93\xE5\x85...‘ for column ‘nickName‘
  16. jquery点击事件写法
  17. SpringMVC个人零碎总结
  18. 悲剧的与幽默的人生态度——宗白华
  19. 如何利用在线工具更改寸照底色
  20. 数学不行计算机选什么专业好,数学差合适什么专业能学计算机吗?对数学要求低的专业有哪些...

热门文章

  1. ios 播放声音 播放震动
  2. AVI转换成MP4格式的教程方法集合
  3. Behance 大神推荐2019 年所有设计领域的最新趋势!
  4. GLKGPDIYKGVYQFKSVEFD|232598-19-5
  5. 2分钟搭建自己的飞书多维表格
  6. java:100以内的所有质数的输出
  7. Heic图片转换精灵无损转换JPG/PNG/BMP方法
  8. 华为鸿蒙邀请函,华为鸿蒙系统6月下旬发布?邀请函首次曝光,但未获官方确认...
  9. 最新IEDA2021安装图文步骤
  10. Can you give my Apex Legends a net name