大规模弹幕获取方法及装置与流程

文档序号:19150421发布日期:2019-11-16 00:01阅读:466来源:国知局
大规模弹幕获取方法及装置与流程
本发明涉及计算机
技术领域
,尤其涉及一种大规模弹幕获取方法及装置。
背景技术
:视频直播发展火热,截至2018年,视频直播用户人数达4.6亿人,市场规模达300亿元。弹幕这一功能的实现,提升了视频直播中用户的参与感,其具有数量大,实时性的特征。弹幕中蕴含着大量的信息,对弹幕进行分析研究,可辅助进行主播的收益预测,并可分析观众在观看直播时的情感变化,有重要的研究意义。但是,现有技术中还没有针对大规模弹幕的获取方法,因此,如何实现大规模弹幕的获取,是一个新的技术问题。技术实现要素:本发明实施例提供一种大规模弹幕获取方法及装置,用于解决现有技术中没有针对大规模弹幕的获取方法的技术问题。为了解决上述技术问题,一方面,本发明实施例提供一种大规模弹幕获取方法,包括:获取处于开播状态的视频直播房间;分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接;通过多线程从弹幕服务器获取弹幕和/或礼物数据。进一步地,所述获取处于开播状态的视频直播房间具体包括:通过第三方开放平台api获取每一视频直播房间的详细信息,视频直播房间的详细信息中包含房间的播出状态;根据房间的播出状态,确定处于开播状态的视频直播房间。进一步地,所述通过第三方开放平台api获取每一视频直播房间的详细信息之后,还包括:将视频直播房间的详细信息存储于mongodb数据库中。进一步地,所述通过多线程从弹幕服务器获取弹幕和/或礼物数据之后,还包括:以csv文件格式存储弹幕和/或礼物数据。进一步地,所述分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接之后,还包括:再建立一个线程,用于监控每一tcp连接的心跳信息。另一方面,本发明实施例提供一种大规模弹幕获取装置,包括:房间信息获取模块,用于获取处于开播状态的视频直播房间;多线程创建模块,用于分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接;数据爬取模块,用于通过多线程从弹幕服务器获取弹幕和/或礼物数据。进一步地,所述房间信息获取模块包括接口调用单元和状态确定单元,其中:接口调用单元,用于通过第三方开放平台api获取每一视频直播房间的详细信息,视频直播房间的详细信息中包含房间的播出状态;状态确定单元用于,根据房间的播出状态,确定处于开播状态的视频直播房间。进一步地,还包括数据存储模块,用于将视频直播房间的详细信息存储于mongodb数据库中,以及以csv文件格式存储弹幕和/或礼物数据。再一方面,本发明实施例提供一种电子设备,包括:存储器、处理器,以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述方法的步骤。又一方面,本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,当所述计算机程序被处理器执行时,实现上述方法的步骤。本发明实施例提供的大规模弹幕获取方法及装置,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。附图说明图1为本发明实施例提供的大规模弹幕获取方法示意图;图2为本发明实施例提供的数据采集系统设计示意图;图3为本发明实施例提供的程序运行流程示意图;图4为本发明实施例提供的大规模弹幕获取装置示意图;图5为本发明实施例提供的电子设备的结构示意图。具体实施方式为了使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。视频直播发展火热,在直播平台的主页,用户在左侧可选择观看的直播类型。在界面的中上部含有平台推荐的直播,用户可在此处进行预览,选择自己喜爱的直播间进入观看。同时,可在上方的导航栏中进行搜索,或者查看自己的观看历史与关注的主播。在直播间窗口内,最中间为正在直播的视频画面,右侧为观众发表弹幕评论的区域。用户在点击发送之后,主播与其他用户均可在窗口右侧看到其发送的弹幕。同时,弹幕会出现在视频画面上,从画面右侧移动向左侧。在直播间窗口的靠下部分,为平台的礼物系统,根据礼物的名称不同,会对应着不同的价格。普通礼物的赠送,会在右侧弹幕评论区域显示;对于部分高价值礼物,在观众赠送之后,会在视频画面上发出全栏目或全平台的通知,其他用户点击之后,即可进入到礼物赠送的房间,高价值礼物的赠送可对主播起到一种引流的效果。平台的弹幕服务器通讯协议是基于tcp服务的应用层协议,是一种分布式的文本信息系统。该协议规定了平台服务与获取弹幕客户端之间交互弹幕信息的格式及其他规定。弹幕服务器的应用层协议头如表1所示。表1弹幕服务器的应用层协议头在数据部分,平台采用了序列化数据。键和值之间采用‘@=’分割。客户端若想要获得弹幕服务器发送的弹幕消息,首先需要向弹幕服务器发送登录请求消息,其数据部分包含的字段为type@=loginreq/roomid@=房间id/,各字段含义如表2所示。表2登录请求字段说明字段名字段说明type表示为“登录请求”消息,固定为loginreqroomid获取弹幕信息的房间id弹幕服务器的通讯协议是建立在tcp的长连接上的,客户端每隔一段时间需要向弹幕服务器发送一条心跳消息以保持对应连接的维持。其数据部分包含的字段为:type@=mrkl/。弹幕服务器向客户端发送弹幕消息时,数据部分所包含的部分字段如下:type@=chatmsg/gid@=9999/rid@=889/uid@=456789/nn@=test/txt@=666/level@=0/ct@=0/cid@=0字段含义如表3所示。表3弹幕消息字段说明字段名字段说明type固定为chatmsg,表示为“弹幕”消息gid弹幕分组idrid房间iduid发送者idnn发送者昵称txt弹幕文本内容level用户等级ct客户端类型(默认为0)cid弹幕唯一id弹幕服务器在向客户端发送礼物消息时,完整的数据部分所包含字段如下:type@=dgb/gid@=9999/rid@=1/uid@=1/gfid@=1/gfcnt@=1/hits@=1/nn@=someone/gs@=1/level@=1字段含义如表4所示。表4礼物消息字段说明字段名字段说明type固定为dgb,表示为“礼物”消息gid弹幕分组idrid房间iduid发送者idgfid礼物idgfcnt礼物个数hits连击个数nn发送者昵称gs礼物显示样式level用户等级图1为本发明实施例提供的大规模弹幕获取方法示意图,如图1所示,本发明实施例提供一种大规模弹幕获取方法,其执行主体为大规模弹幕获取装置,该方法包括:步骤s101、获取处于开播状态的视频直播房间。具体来说,获取弹幕之前,首先获取处于开播状态的视频直播房间。可以通过视频直播平台第三方开放平台api先获取每一视频直播房间的详细信息,再根据房间的详细信息确定处于开播状态的视频直播房间。视频直播平台第三方开放平台api中,其提供了房间详细信息的接口。例如,斗鱼直播平台第三方开放平台api接口的url为http://open.douyucdn.cn/api/roomapi/room/房间id,对接口的调用返回成功时,会得到房间的详细信息。房间的详细信息中包含了房间当前的播出状态。步骤s102、分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接。具体来说,获取处于开播状态的视频直播房间之后,分别为每一处于开播状态的视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接。在线程的创建上,可以使用python的threading库,在每个线程建立时以房间号为其命名,并将其加入线程列表中。步骤s103、通过多线程从弹幕服务器获取弹幕和/或礼物数据。具体来说,在每一个线程创建tcp连接之后,其便会不停的从弹幕服务器接收消息,并对弹幕服务器返回的消息进行解析,完成弹幕及礼物消息的获取及写入。本发明实施例提供的大规模弹幕获取方法,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。基于上述任一实施例,进一步地,所述获取处于开播状态的视频直播房间具体包括:通过第三方开放平台api获取每一视频直播房间的详细信息,视频直播房间的详细信息中包含房间的播出状态;根据房间的播出状态,确定处于开播状态的视频直播房间。具体来说,获取弹幕之前,首先获取处于开播状态的视频直播房间。获取处于开播状态的视频直播房间的具体方法如下:首先,通过视频直播平台第三方开放平台api先获取每一视频直播房间的详细信息。视频直播平台第三方开放平台api中,其提供了房间详细信息的接口,对接口的调用返回成功时,会得到房间的详细信息。房间的详细信息如表5所示。表5房间的详细信息然后,根据房间的详细信息确定当前处于开播状态的视频直播房间。房间的详细信息中包含了房间当前的播出状态。根据每一房间当前的播出状态可确定处于开播状态的视频直播房间。本发明实施例提供的大规模弹幕获取方法,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。基于上述任一实施例,进一步地,所述通过第三方开放平台api获取每一视频直播房间的详细信息之后,还包括:将视频直播房间的详细信息存储于mongodb数据库中。具体来说,mongodb是一种面向集合的数据库,与传统数据库不同,它对数据的输入没有严格的要求,采用无模式存储的方法,可以存储复杂且具有不同类型的数据。对于房间的详细信息,可以选择使用mongodb数据库来进行存储。本发明实施例提供的大规模弹幕获取方法,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。基于上述任一实施例,进一步地,所述通过多线程从弹幕服务器获取弹幕和/或礼物数据之后,还包括:以csv文件格式存储弹幕和/或礼物数据。具体来说,csv(commaseparatedvalues)是使用逗号为间隔,对数据进行存储的文件格式,其具有文件结构简单,访问速度快的特点。对于弹幕及礼物消息,并不需要对它进行频繁的增删改查操作。因此,选择牺牲数据读取的便利性,使用csv文件格式进行存储。可以将房间按照固定的顺序排列,将它们进行分类,建立索引。提高之后对单个房间的检索速度。本发明实施例提供的大规模弹幕获取方法,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。基于上述任一实施例,进一步地,所述分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接之后,还包括:再建立一个线程,用于监控每一tcp连接的心跳信息。具体来说,通过创建了与房间数目相同的线程来完成tcp连接的建立,弹幕服务器tcp长连接的维持依赖于心跳信息,因此,对于每个tcp连接,需要一个额外的线程来监控每一tcp连接的心跳信息,负责心跳信息的发送。每个tcp连接需要一个线程来维持心跳信息的发送,以同样的方式创建线程,并将其设置为其tcp连接线程的守护线程。代码中kplive.setdaemon(true)即为守护线程的设置,其作用为在tcp连接线程(即父线程)意外结束终止后,它也会立刻终止。因python中线程具有在终止后无法重新启动的特性,在线程意外结束时,通过创建一个新的线程来实现原有的功能。实验中,通过创建thread_restart()函数来实现线程的重新启动,该函数每一分钟运行一次,对线程列表thread_list中的线程进行遍历,若某个线程意外终止,则根据线程名来获取房间号,重新创建一个新的线程。遍历结束之后对thread_list进行更新。通过监控每一tcp连接的心跳信息,保证了连接意外中断时,及时重新连接。本发明实施例提供的大规模弹幕获取方法,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。基于上述任一实施例,下面以一个具体的例子对上述实施例中的方法进行详细说明。本例子中,从斗鱼视频直播平台获取弹幕信息,选取了4月1日至4月10日期间内在“英雄联盟”栏目下直播过的房间作为采集对象。在4月10日0点至4月17日0点,进行了为期一周的数据抓取。图2为本发明实施例提供的数据采集系统设计示意图,如图2所示,本次试验使用8台阿里云服务器进行分布式采集。每台服务器通过斗鱼第三方开放平台api获取房间的开播信息,通过斗鱼弹幕服务器实时获取所需要的弹幕及礼物消息,最后将所存的数据存于数据库与csv文件中。图3为本发明实施例提供的程序运行流程示意图,如图3所示,主程序的执行流程如下:(1)为所有的采集房间分别创建一个线程(t1~tn)。每个线程负责tcp连接的建立,并对服务器返回的消息进行解析,完成弹幕及礼物消息的获取及写入。(2)创建线程ts,该线程负责对t1~tn进行状态监控。(3)创建线程tr,该线程负责对状态异常的线程进行重启。在每一个线程t创建tcp连接之后,其便会不停的从服务器接收消息。首先要识别该消息的type是否为弹幕或礼物赠送消息。之后使用正则表达式从中提取出所抓取的内容,并将其存入csv文件中。对于弹幕消息,主要关注:弹幕发送者的用户id,弹幕发送的时间,弹幕的内容。对于礼物消息,关注的内容为:礼物赠送者的用户id,礼物赠送的时间,礼物编号,礼物的个数。通过斗鱼弹幕服务器抓取到礼物信息后,只能获取到礼物的id,而无法得到礼物的价格。需要实现礼物id与价格的对应。在斗鱼第三方开放平台api中,其提供了房间详细信息的接口。该接口的url为http://open.douyucdn.cn/api/roomapi/room/房间id,对接口的调用返回成功时,会得到房间的详细信息,房间的详细信息如上表5所示。其中,礼物的json数据包含礼物id、礼物名称、礼物价值、礼物介绍、礼物图片、礼物类型以及礼物描述信息。礼物类型共由两个值构成,值为1表示为免费礼物,值为2表示为付费礼物。对于所有房间,每隔10分钟对该接口进行一次调用,以获取房间的开播状态。同时,将每个直播间的礼物信息存于字典中,实现礼物id与价格的对应。所获取的礼物详细信息如表6所示。表6礼物的详细信息在本次实验中,对斗鱼“英雄联盟”栏目的房间的弹幕及礼物消息进行了7天的爬取。获取到的数据数量如表7所示。表7数据量统计数据类别数量“英雄联盟”主播13,781名开播次数43,993次不同的观众id382万个弹幕数量3,809万条礼物赠送数据6,061.3万条礼物总价值9,019.5万元对于数据的存储,采用了mongodb数据库存储与csv文件存储两种方式进行数据的存储。mongodb是一种面向集合的数据库,与传统数据库不同,它对数据的输入没有严格的要求,采用无模式存储的方法,可以存储复杂且具有不同类型的数据。对于房间的详细信息,选择使用mongodb数据库来进行存储。csv(commaseparatedvalues)是使用逗号为间隔,对数据进行存储的文件格式,其具有文件结构简单,访问速度快的特点。对于弹幕及礼物消息,并不需要对它进行频繁的增删改查操作。选择牺牲数据读取的便利性,使用csv文件格式进行存储。将房间按照固定的顺序排列,将它们进行分类,建立索引。提高之后对单个房间的检索速度。在数据获取实验中,需要每隔10分钟进行一次房间状态信息的抓取,并重新运行一次弹幕及礼物获取程序。使用linux下的cron进程,搭配shell脚本来实现需求。每隔10分钟,cron进程便会执行杀死python进程的指令,3s后重新启动数据获取程序并将输出重定向至output.txt。在进行tcp连接建立时,cpu占用率很高,为了缓解cpu压力,选择在5分钟后,再进行房间状态信息的抓取。在进行弹幕及礼物消息的获取实验时,在tcp连接数量达到一定数量后,便无法再创建新的连接。这个问题对实验的进展造成了很大的困扰。经过多次实践,发现这个问题是由于两个原因造成的。(1)linux系统环境下,单个进程打开的文件数有限制,而每个tcp连接也要创建一个文件句柄。因此,在未对系统参数进行修改时,最多只可建立1024个tcp连接。(2)斗鱼弹幕服务器对单个ip的连接数有限制。根据测试,现在单个ip与斗鱼弹幕服务器能够创建的最大连接数约为2000。为了解决上述问题,采用以下两种方式:一、对linux内核参数进行修改,打开/etc/security/limits.conf文件,更改linux对用户关于打开文件数的软限制和硬限制。二、采用购买云服务器的方式,使用不同的公网ip进行分布式爬取。服务器配置如表8所示。表8实验环境及配置基于上述任一实施例,图4为本发明实施例提供的大规模弹幕获取装置示意图,如图4所示,本发明实施例提供一种大规模弹幕获取装置,用于执行上述任一实施例中所述的方法,具体包括房间信息获取模块401、多线程创建模块402和数据爬取模块403,其中:房间信息获取模块401用于获取处于开播状态的视频直播房间;多线程创建模块402用于分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接;数据爬取模块403用于通过多线程从弹幕服务器获取弹幕和/或礼物数据。基于上述任一实施例,进一步地,所述房间信息获取模块包括接口调用单元和状态确定单元,其中:接口调用单元,用于通过第三方开放平台api获取每一视频直播房间的详细信息,视频直播房间的详细信息中包含房间的播出状态;状态确定单元用于,根据房间的播出状态,确定处于开播状态的视频直播房间。基于上述任一实施例,进一步地,还包括数据存储模块,用于将视频直播房间的详细信息存储于mongodb数据库中,以及以csv文件格式存储弹幕和/或礼物数据。本发明实施例提供一种大规模弹幕获取装置,用于执行上述任一实施例中所述的方法,通过本实施例提供的装置执行上述某一实施例中所述的方法的具体步骤与上述相应实施例相同,此处不再赘述。本发明实施例提供的大规模弹幕获取装置,通过与弹幕服务器建立多个tcp连接,使用多线程从弹幕服务器获取弹幕和/或礼物数据,能够实现大规模弹幕的获取。图5为本发明实施例提供的电子设备的结构示意图,如图5所示,所述设备包括:处理器(processor)501、存储器(memory)502、总线503,以及存储在存储器上并可在处理器上运行的计算机程序。其中,处理器501和存储器502通过总线503完成相互间的通信;处理器501用于调用并执行存储器502中的计算机程序,以执行上述各方法实施例中的步骤,例如包括:获取处于开播状态的视频直播房间;分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接;通过多线程从弹幕服务器获取弹幕和/或礼物数据。此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。本发明实施例提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例中的步骤,例如包括:获取处于开播状态的视频直播房间;分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接;通过多线程从弹幕服务器获取弹幕和/或礼物数据。本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,当所述计算机程序被处理器执行时,实现上述各方法实施例中的步骤,例如包括:获取处于开播状态的视频直播房间;分别为每一视频直播房间创建一个对应的线程,用于建立与弹幕服务器的tcp连接;通过多线程从弹幕服务器获取弹幕和/或礼物数据。以上所描述的装置及设备等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1