现在直播平台很多,对这些平台的数据攫取相信也有很多 .一些很深的技术不讲也不会,可以大概说下我的思路,以及实现过程,这是一个简单的系统,包括了前台与后台的全部工作.很丑.不嫌弃…

  1. 系统架构
  2. 实现细节
  3. 踩过的坑

1.系统架构


说明 :
bilibili弹幕机:爬虫,爬取直播间的弹幕信息
数据处理服务:以合适的方式检索redis数据库中的数据,生成目标通过Redis的消息服务发布.
Redis:本项目中使用的数据库,提供存储服务与消息服务.
界面:动态可视化目标数据.

2.实现细节

bilibili弹幕机
基于aiohttp,能够异步处理大量并发,效果非常好,后期也计划支持动态删减任务.
主要代码:

async def fetch_all_danmu(roomlist):tasks = []for i in roomlist:danmuji = bilibiliClient()r = redis.Redis(host='172.17.0.2', port=6379,db=11)q = queue.Queue()task = asyncio.ensure_future(danmuji.connectServer(r,q,roomid=i,w=True))tasks.append(task)task = asyncio.ensure_future(danmuji.HeartbeatLoop())tasks.append(task)print("this is romm ",i)# _=await asyncio.gather(*tasks)async def print_hello(i):await asyncio.sleep(10)print("this is ",i)if __name__ == '__main__':scheduler = AsyncIOScheduler()# scheduler.add_job(fetch_all, args=[URL_LIST], trigger='interval', seconds=2)lists = []lists.append("865138")lists.append("5269")scheduler.add_job(fetch_all_danmu, args=[lists])# scheduler.add_job(print_hello,args=[1])scheduler.start()print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))# Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.try:asyncio.get_event_loop().run_forever()except (KeyboardInterrupt, SystemExit):pass

没有贴爬虫的具体内容,网上方法也比较多.我是参考GIT上的bilibili_danmu实现的.

数据处理服务
由redis中读取数据
使用redis_timeseries作为时间序列数据的存储的工具.

pip install redis_timeseries

这个工具的存储方式其实也比较简单,通过检索keys可以发现,其实是对数据以及时间进行了封装.封装结构为

':'.join([self.base_key, granularity, str(timestamp_key), str(key)])

所以在定义了你想要的数据结构后,也可以使用redis的原生检索方法进行检索.
定义key:"roomid{0}:{1}".format(roomid,data)

data = redis.Redis(host='172.17.0.2', port=6379,db=11)
def mess_pub():my_granularities={}my_granularities['1second']={'ttl': redis_timeseries.days(1), 'duration': redis_timeseries.seconds(1)}ts = redis_timeseries.TimeSeries(data,base_key="lyt",granularities=my_granularities)while True:count = len(ts.scan_keys("1second",10,"roomid5269:*"))wcount = ts.scan_keys('1second',60,'roomwatcher5269:*')[-1].split(":")[-1]print("pub count and wcount :{0},{1}".format(count ,wcount))s=json.dumps({"count":float(count),"wcount":float(wcount)})#变为bytes数组data.publish('summary', u'%s' % (s))time.sleep(2)if __name__ == '__main__':mess_pub()

Redis

数据存储服务:已经说过了,最终选择了redis_timeseries作为存储工具,能够很好的支持时间序列数据.
消息发布服务:使用redis原生的消息发布订阅组件.

界面

使用Flask+echarts实现.这一部分代码比较多,重点是可视化部分.前端本人不太会,所以很丑.
效果:

HTML代码:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Proudly presented by ECharts</title>{% for jsfile_name in script_list %}<script src="{{host}}/{{jsfile_name}}.js"></script>{% endfor %}<script>var source = new EventSource("{{ url_for('live.stream') }}");source.onmessage = function (event) {var summary = JSON.parse(event.data);document.getElementById("text").value =  summary.count.toString() + " " + summary.wcount.toString();};</script>
</head><body><form><input type="text" id="text" size="35" /><a id="update">0</a><div style="width: 800px;height: 100px;"><textarea id="info"  style="width: 700px;height: 90px;"></textarea></div><a>bilibili直播间观看人数与活跃人数对比(勿对号入座)</a><div id="main" style="width: 800px;height:300px;"></div><script language=javascript>function create_graph() {document.getElementById("text").value="test";var myChart = echarts.init(document.getElementById('main'));function randomData() {now = new Date(+now + oneMin);value = value + Math.random() * 21 - 10;return {name: now.toString(),value: [time_str(now),Math.round(0)]}}var data = [];var data1 = [];var t = new Date()var now = +new Date(t.getFullYear(), t.getMonth()+1, t.getDate(),0,0,0);var oneDay = 24 * 3600 * 1000;var oneMin = 60 * 1000;var value = Math.random() * 1000;for (var i = 0; i < 60; i++) {data.push(randomData());data1.push(randomData());}var option = {title: {text: ''},legend: {    //图表上方的类别显示show:true,data:['观看人数','活跃人数']},tooltip: {trigger: 'axis',formatter: function (params) {document.getElementById("info").innerText = "观看人数:" + params[0].value + "\n"+"活跃人数:" + params[1].value;params = params[0];
{#                            var date = new Date(params.name);#}
{#                            return "观看人数:" + params[0].value + "\n"+"活跃人数:" + params[1].value;#}},axisPointer: {animation: false}},xAxis: {type: 'time',splitLine: {show: false}},yAxis: {type: 'value',boundaryGap: [0, '100%'],splitLine: {show: false}},series: [{name: '观看人数',type: 'line',showSymbol: false,hoverAnimation: false,data: data},{name: '活跃人数',type: 'line',showSymbol: false,hoverAnimation: false,data: data1}]};myChart.setOption(option)window.line = self.setInterval(function () {var ele = document.getElementById("text");var value = ele.value.toString().split(" ")now = new Date(+now + oneMin);data.shift();data.push({name: now.toString(),value: [time_str(now),Math.round(value[1])]});data1.shift();data1.push({name: now.toString(),value: [time_str(now),Math.round(value[0])]});myChart.setOption({series: [{data: data},{data: data1}]});}, 2000);};function time_str(now) {Y = now.getFullYear()+'/';M = (now.getMonth()+1)+'/';D = now.getDate()+" ";h = now.getHours()+":";m = now.getMinutes();return Y+M+D+h+m;}create_graph();</script></form>
</body>
</html>

网页中使用eventHandle处理来自Redis消息,代码为

def event_stream():pubsub = red.pubsub()pubsub.subscribe('summary')mess = ""for message in pubsub.listen():if message['data']!=1:# print(message['data'].decode("utf-8"))mess = {k : v  for k, v in json.loads(message['data'].decode("utf-8")).items()}yield 'data:{0}\n\n'.format(json.dumps(mess))
@live.route('/stream')
def stream():return flask.Response(event_stream(),mimetype="text/event-stream")

坑:
爬虫需要很长的时间调试参数
整个流程虽然简单,也是消耗了一天的时间,废…
…很多 ,不想写了

以上…..

bilibili直播间观察相关推荐

  1. 哔哩哔哩bilibili 直播间全屏发弹幕

    我们知道哔哩哔哩直播间目前没有全屏发弹幕.发礼物功能, 可以通过这个插件实现, 以chrome为例, 首先, 安装chrome油猴插件, https://chrome.google.com/webst ...

  2. bilibili直播间利用python爬虫自动发送弹幕

    打开bilibili,在已登录状态下随便进入一个直播间,发送弹幕666 关于时间戳: 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒) ...

  3. 虚幻引擎获取bilibili直播间弹幕插件的使用教程

    1.首先启用插件 2.在任意地方编写如下代码 并填入房间ID,并通过UpdateList设置更新频率 GetBiliHandle 获取bilibili句柄BindEventtoOnResult 绑定返 ...

  4. bilibili直播间接收监听和发送弹幕api

    参考文: https://blog.csdn.net/fei347795790/article/details/111164254 Python实现自动发送B站直播弹幕软件 https://blog. ...

  5. 极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件

    极简式 Unity 获取 bilibili 直播弹幕.SC.上舰.礼物等 1. 声明 下载链接 软件均仅用于学习交流,请勿用于任何商业用途! 2. 介绍 该项目为Unity实时爬取B站直播弹幕. 项目 ...

  6. 乐视直播api编写java,GitHub - czp3009/bilibili-live-api: bilibili 直播弹幕协议 API Java 版(deprecated)...

    Deprecated 本仓库已废弃. 本项目使用 Bilibili Web 协议, 随着 Bilibili 前端的更新, 已经无法正常使用. 本项目仅提供 Bilibili 直播间的弹幕获取有关 AP ...

  7. 小程序直播间页面路径怎么访问直播间_以小程序为例,在线教育产品的直播间有哪些功能设计?...

    直播兴起已经很久,在线教育玩直播的也有很多.本文作者从工作实践出发,结合案例分享了小程序直播间都做了哪些功能设计,为什么要这么设计,及对设计的复盘. 一.直播间都需要搭建哪些功能模块? 在收集了业务的 ...

  8. 别天天看看直播了,你知道如何用jmeter对直播间做压测吗

    01 安装插件 Jmeter本身是支持HTTP方法,要测试WebSocket的接口,首先要安装插件. 安装插件的方法: 1.首先下载插件管理器 访问网站:https://jmeter-plugins. ...

  9. 优化云课堂直播间性能的一些思考与总结

    本文来自网易云社区. 一.本文背景 云课堂Android端的Native直播间模块,聊天面板滑动有些卡顿,在弹起.收起输入键盘的时候页面有明显的闪动,另外在横竖屏切换的时候也不流畅.同时在播放视频的时 ...

最新文章

  1. 鲜为人知的静态、命令式编程语言——Nimrod
  2. oracle insert 数组,oracle 数组 批量insert
  3. C#基础第三天-作业-集合-冒泡排序-模拟名片
  4. AI应用开发实战系列之四 - 定制化视觉服务的使用
  5. PAT甲题题解-1091. Acute Stroke (30)-BFS
  6. Android开发学习笔记-GridView的动态显示
  7. Allegro画焊盘
  8. getBoundingClientRect()来获取页面元素的位置”
  9. JDK11竟然不支持字体斜体
  10. Pyqt5_QPushButton
  11. 常用RF连接器SMA/SMB/SMP/MMCX/BNC/TNC/2.92/2.4
  12. WPS Office V15.3.2绿化版免费下载
  13. java实现百度识图后台
  14. CentOS利用WebHook实现PHP自动部署Git代码
  15. android app闪退的原因分析,打开一个app就闪退解决方法
  16. 熵相似_南哲思享 | 张一兵:人类纪的“熵”、“负熵”和“熵增” ——张一兵对话贝尔纳斯蒂格勒...
  17. 一文揭开ALBERT的神秘面纱
  18. MCE公司:免疫治疗新课题——好心情,要保持!
  19. 给企业微信成员不同人发不同的文件
  20. 文档格式转换工具对比

热门文章

  1. 交叉编译Qt应用和发布
  2. qrcode生成二维码并本地下载
  3. Linux miny选择字体,linux下sed命令对文件执行文本替换
  4. 品牌和无牌液晶电视到底应该选哪个?
  5. 《利用Python进行数据分析·第2版》第2章 Python语法基础,IPython和Jupyter Notebooks...
  6. 详解霍尔元件的分类与特性
  7. 【Altium Designer 19】怎么改单位为公制
  8. 目标检测——SPPNet【含全网最全翻译】
  9. 面向Java开发者的ChatGPT提示词工程(4)
  10. Windows下安装 MongoDB