bilibili直播间观察
现在直播平台很多,对这些平台的数据攫取相信也有很多 .一些很深的技术不讲也不会,可以大概说下我的思路,以及实现过程,这是一个简单的系统,包括了前台与后台的全部工作.很丑.不嫌弃…
- 系统架构
- 实现细节
- 踩过的坑
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直播间观察相关推荐
- 哔哩哔哩bilibili 直播间全屏发弹幕
我们知道哔哩哔哩直播间目前没有全屏发弹幕.发礼物功能, 可以通过这个插件实现, 以chrome为例, 首先, 安装chrome油猴插件, https://chrome.google.com/webst ...
- bilibili直播间利用python爬虫自动发送弹幕
打开bilibili,在已登录状态下随便进入一个直播间,发送弹幕666 关于时间戳: 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒) ...
- 虚幻引擎获取bilibili直播间弹幕插件的使用教程
1.首先启用插件 2.在任意地方编写如下代码 并填入房间ID,并通过UpdateList设置更新频率 GetBiliHandle 获取bilibili句柄BindEventtoOnResult 绑定返 ...
- bilibili直播间接收监听和发送弹幕api
参考文: https://blog.csdn.net/fei347795790/article/details/111164254 Python实现自动发送B站直播弹幕软件 https://blog. ...
- 极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件
极简式 Unity 获取 bilibili 直播弹幕.SC.上舰.礼物等 1. 声明 下载链接 软件均仅用于学习交流,请勿用于任何商业用途! 2. 介绍 该项目为Unity实时爬取B站直播弹幕. 项目 ...
- 乐视直播api编写java,GitHub - czp3009/bilibili-live-api: bilibili 直播弹幕协议 API Java 版(deprecated)...
Deprecated 本仓库已废弃. 本项目使用 Bilibili Web 协议, 随着 Bilibili 前端的更新, 已经无法正常使用. 本项目仅提供 Bilibili 直播间的弹幕获取有关 AP ...
- 小程序直播间页面路径怎么访问直播间_以小程序为例,在线教育产品的直播间有哪些功能设计?...
直播兴起已经很久,在线教育玩直播的也有很多.本文作者从工作实践出发,结合案例分享了小程序直播间都做了哪些功能设计,为什么要这么设计,及对设计的复盘. 一.直播间都需要搭建哪些功能模块? 在收集了业务的 ...
- 别天天看看直播了,你知道如何用jmeter对直播间做压测吗
01 安装插件 Jmeter本身是支持HTTP方法,要测试WebSocket的接口,首先要安装插件. 安装插件的方法: 1.首先下载插件管理器 访问网站:https://jmeter-plugins. ...
- 优化云课堂直播间性能的一些思考与总结
本文来自网易云社区. 一.本文背景 云课堂Android端的Native直播间模块,聊天面板滑动有些卡顿,在弹起.收起输入键盘的时候页面有明显的闪动,另外在横竖屏切换的时候也不流畅.同时在播放视频的时 ...
最新文章
- 鲜为人知的静态、命令式编程语言——Nimrod
- oracle insert 数组,oracle 数组 批量insert
- C#基础第三天-作业-集合-冒泡排序-模拟名片
- AI应用开发实战系列之四 - 定制化视觉服务的使用
- PAT甲题题解-1091. Acute Stroke (30)-BFS
- Android开发学习笔记-GridView的动态显示
- Allegro画焊盘
- getBoundingClientRect()来获取页面元素的位置”
- JDK11竟然不支持字体斜体
- Pyqt5_QPushButton
- 常用RF连接器SMA/SMB/SMP/MMCX/BNC/TNC/2.92/2.4
- WPS Office V15.3.2绿化版免费下载
- java实现百度识图后台
- CentOS利用WebHook实现PHP自动部署Git代码
- android app闪退的原因分析,打开一个app就闪退解决方法
- 熵相似_南哲思享 | 张一兵:人类纪的“熵”、“负熵”和“熵增” ——张一兵对话贝尔纳斯蒂格勒...
- 一文揭开ALBERT的神秘面纱
- MCE公司:免疫治疗新课题——好心情,要保持!
- 给企业微信成员不同人发不同的文件
- 文档格式转换工具对比