本文给大家分享的是基于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 弹幕数据。

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

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

  1. python 协程和异步的关系_python协程与异步协程

    在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...

  2. Python异步协程

    Python asyncio 异步协程百万并发 协程(coroutine) 本质就是一个函数 事件循环--(event_loop) 协程函数,不是像普通函数那样直接调用运行的,必须添加到事件循环中,然 ...

  3. asyncio异步IO--协程(Coroutine)与任务(Task)详解

    摘要:本文翻译自Coroutines and Tasks,主要介绍asyncio中用于处理协程和任务的方法和接口.在翻译过程中,译者在官方文档的基础上增加了部分样例代码和示意图表,以帮助读者对文档的理 ...

  4. Python Asyncio 所有异步协程库用法详解

    title: Asyncio并发编程 copyright: true top: 0 date: 2019-04-03 14:09:24 tags: Asyncio categories: Python ...

  5. 爬虫的单线程+多任务异步协程:asyncio 3.6

    单线程+多任务异步协程:asyncio 3.6 事件循环 无限循环的对象.事件循环中最终需要将一些 特殊的函数(被async关键字修饰的函数) 注册在该对象中. 协程 本质上是一个对象.可以把协程对象 ...

  6. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片

    python爬虫 asyncio aiohttp aiofiles 多任务异步协程爬取图片 main.py """=== coding: UTF8 ==="&q ...

  7. python爬虫02-提升爬取效率、多线程,多线程传参,多进程,线程及线程池概念,协程,多任务异步协程,异步请求aiohttp模块,视频站工作原理

    1.提升爬取效率 使用多线程,多进程,携程,异步 2.多线程 进程是资源单位,每个进程,都会有一个默认的主线程 线程是执行单位 执行多线程需要导包: from threading import Thr ...

  8. 5 爬虫 异步协程 梨视频

    # 如何提升requests模块爬取数据的效率?- 多进程或多线程(不建议) 太耗费资源- 线程池或进程池(适当使用) - 单线程 + 异步协程(推荐) # 线程池使用案例 # 梨视频 下载作业 im ...

  9. 送书 | aiohttp异步协程爬取同程旅行酒店评论并作词云图

    大家好!我是啃书君! Python并发编程有三种方式:多线程(Threading).多进程(Process).协程(Coroutine),使用并发编程会大大提高程序的效率,今天我们将学习如何选择多线程 ...

最新文章

  1. FFmpeg实现获取USB摄像头视频流测试代码
  2. CSS的一些基础知识
  3. EventLoopGroup 与Reactor 关联
  4. 关于64位Linux编译hadoop2
  5. 修改wordpress上传文件大小限制
  6. Falsy Bouncer-freecodecamp算法题目
  7. linux5怎么删除目录,Linux中目录的创建与删除命令使用说明
  8. mysql有符号数_mysql里面有符号整数类型有关问题,请指点,多谢
  9. elm具体实现过程_函数式编程中的战斗机(二)---elm语言MUV设计模式应用实例...
  10. matlab虚拟现实之使用V-Realm Builder2建模
  11. stringByReplacingCharactersInRange: withString: 实现字符串删除,替换
  12. 输入三角形的三c语言程序,输入三角形的三边 a,b,c,计算三角形的面积的公式是 C++...
  13. 计算机培训营,计算机学院举办科创训练营第三期培训
  14. gbase oracle mysql_项目从Oracle数据迁移到GBase数据库时解决适配遇到的问题
  15. C# 自定义Json解析工具
  16. 删除vlan 华为s5720_华为S5720系列交换机快速配置手册常用命令
  17. 高中计算机工作成效,学年工作成效与反思
  18. Qt常见make编译错误:/usr/bin/ld:cannot find -lxxx
  19. python word 合并单元格_在word文档选项卡中检测合并单元格
  20. excel中插入文档

热门文章

  1. 缩进一个字符_解析Word——Word段落格式中的几种缩进(中)
  2. Java黑皮书课后题第10章:10.24(实现Character类)在Java库中提供了Character类,给出你自己对这个类的实现(将新类命名为MyCharacter)
  3. cropper.js 图像旋转问题_快速提高前端开发效率:10个JavaScript图像处理库
  4. 【2012百度之星/资格赛】E:C++ 与Java
  5. PHP索引数组+unset使用不当导致的问题
  6. Python之路番外(第二篇):PYTHON基本数据类型和小知识点
  7. 一个查看Cookie的便捷工具——EditThisCookie
  8. python爬虫(4)--Cookie的使用
  9. .net core 集成 autofac.
  10. USACO 保护花朵 Protecting the Flowers, 2007 Jan