b站弹幕姬python_基于asyncio异步协程框架实现收集B站直播弹幕详细介绍

本文介绍了如何使用Python的asyncio框架构建一个收集B站直播弹幕的系统,包括连接管理、心跳机制、数据库存储和异常处理,实现了对等级top100直播间的全天弹幕收集。
摘要由CSDN通过智能技术生成

本文给大家分享的是基于asyncio 异步协程框架实现收集B站直播弹幕收集系统的简单设计,并附上源码,有需要的小伙伴可以参考下

">

前言

虽然标题是全站,但目前只做了等级 top 100 直播间的全天弹幕收集。

弹幕收集系统基于之前的B 站直播弹幕姬 Python 版修改而来。具体协议分析可以看上一篇文章。

直播弹幕协议是直接基于 TCP 协议,所以如果 B 站对类似我这种行为做反制措施,比较困难。应该有我不知道的技术手段来检测类似我这种恶意行为。

我试过同时连接 100 个房间,和连接单个房间 100 次的实验,都没有问题。>150 会被关闭链接。

直播间的选取

现在弹幕收集系统在选取直播间上比较简单,直接选取了等级 top100。

以后会修改这部分,改成定时去 http://live.bilibili.com/all 查看新开播的直播间,并动态添加任务。

异步任务和弹幕存储

收集系统仍旧使用了 asyncio 异步协程框架,对于每一个直播间都使用如下方法来加进 loop 中。danmuji = bilibiliClient(url, self.lock, self.commentq, self.numq)

task1 = asyncio.ensure_future(danmuji.connectServer())

task2 = asyncio.ensure_future(danmuji.HeartbeatLoop())

其实若将心跳任务 HeartbeatLoop 放入 connectorServer 中去启动,代码看起来更优雅一些。但这么做是因为我需要维护一个任务列表,后面会有描述。

在弹幕存储上我花了些时间选择。

数据库存储是一个同步 IO 的过程,Insert 的时候会阻塞弹幕收集的任务。虽然有 aiomysql 这种异步接口,但配置数据库太麻烦,我的设想是这个小系统能够方便地部署。

最终我选择使用自带的 sqlite3。但 sqlite3 无法做并行操作,故开了一个线程单独进行数据库存储。在另一个线程中,100 * 2 个任务搜集所有的弹幕、人数信息,并塞进队列 commentq, numq 中。存储线程每隔 10s 唤醒一次,将队列中的数据写进 sqlite3 中,并清空队列。

在多线程和异步的配合下,网络流量没有被阻塞。

可能的连接失败场景处理

弹幕协议是直接基于 TCP,位与位直接关联性较强,一旦解析错误,很容易就抛 Exception(个人感觉,虽然 TCP 是可靠传输,但B站服务器自身发生错误也是有可能的)。所以有必要设计一个自动重连机制。

在 asyncio 文档中提到,

Done means either that a result / exception are available, or that the future was cancelled.

函数正常返回、抛出异常或者是被 cancel,都会退出当前任务。可以使用 done() 来判断。

每一个直播间对应两个任务,解析任务是最容易挂的,但并不会影响心跳任务,所以必须找出并将对应心跳任务结束。

在创建任务的时候使用字典记录每个房间的两个任务,

self.tasks[url] = [task1, task2]

在运行过程中,每隔 10s 做一次检查,for url in self.tasks:

item = self.tasks[url]

task1 = item[0]

task2 = item[1]

if task1.done() == True or task2.done() == True:

if task1.done() == False:

task1.cancel()

if task2.done() == False:

task2.cancel()

danmuji = bilibiliClient(url, self.lock, self.commentq, self.numq)

task11 = asyncio.ensure_future(danmuji.connectServer())

task22 = asyncio.ensure_future(danmuji.HeartbeatLoop())

self.tasks[url] = [task11, task22]

实际我只见过一次任务失败的场景,是因为主播房间被封了,导致无法进入直播间。

结论B站人数是按照连接弹幕服务器的链接数量统计的。通过操纵链接量,可以瞬间增加任意人数观看,有商机?

运行的这几天中,发现即使大部分房间不在直播,也能有 >5 的人数,包括凌晨。我只能猜测也有和我一样的人在 24h 收集弹幕。

top100 平均一天 40M 弹幕数据。

收集的弹幕能做什么?还没想好,可能可以拿来做用户行为分析 -_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫是一种自动化程序,可以模拟用户在网页上的操作行为,例如打开网页、点击按钮、填写表单等,还可以提取网页上的数据进行分析和处理。下面是一个详细Python爬虫爬取B站弹幕的过程: 第一步,导入所需的库:我们需要使用requests库来发送HTTP请求,以获取网页内容,还需要使用BeautifulSoup库来解析网页。 第二步,发送HTTP请求并获取网页内容:使用requests库的get方法发送HTTP GET请求,获取B站视频的网页内容。 第三步,解析网页内容:使用BeautifulSoup库来解析网页内容,以便于提取所需的数据。 第四步,提取弹幕数据:根据B站的网页结构,我们可以找到弹幕数据所在的HTML元素,并使用BeautifulSoup库提供的方法来提取这些数据。 第五步,保存数据:将提取到的弹幕数据保存到本地文件或数据库中,以便后续分析和处理。 以上就是用Python爬虫爬取B站弹幕的基本步骤。需要注意的是,爬取网站可能有一些反爬机制,例如验证码、IP封锁等,还需要注意爬取速度,避免给服务器带来过大的负载。另外,合法合规地使用爬虫是非常重要的,需要遵守相关的法律法规,并且尊重网站的规则和隐私权。 总之,Python爬虫是一种强大的工具,可以用来爬取各种网站的数据,包括B站弹幕数据。通过合理的编写代码和处理数据,可以实现弹幕数据的获取和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值