《向往的生存》是湖南卫视一档非常舒适的生存类真人秀综艺节目,目前第三季正在更新中,常驻嘉宾退出了张子枫,深受广大观众的喜爱。而该节目的豆瓣评分也达到了7.9。这档综艺以明星艺人到村寨里体验生活为主线,融入了美食,劳动,风趣的元素,让人边看边有身临其境的感觉,好像本身也真正进入了“向往的生存”。

向往的生存豆瓣评分

近些天在看节目的时候,看到弹幕上大家探讨的特地冷落,突发奇想能不能把所有的弹幕爬下来做一下剖析呢。一方面探索一下弹幕数据抓取有没有特别之处,另一方面通过弹幕对这个节目的口碑一探到底。接下来以上周五刚更新的第5期为例,进行弹幕数据抓取。代码次要应用requests库,抓取后果存储在csv文件中。

网页剖析

在芒果TV网页版关上第5期节目,期待广告加载结束,同时关上chrome开发者工具的network选项卡。因为申请很多,而且随着时间推移,会越来越多。所以我采取了先清空再期待的形式。发现后面大多加载的都是图片,天然这不是咱们的指标。过了一会儿之后,发现一条可疑的申请,见下图所示,点击一看,真的呈现了弹幕内容。interval是60,猜想可能是示意一个距离,每60s会有一个新的申请。于是应用filter过滤了以“rdb”结尾的申请,发现这些都是弹幕,而且next都是60000的倍数,猜想示意的是60000毫秒,也就是60秒。

找到弹幕申请链接

过滤弹幕申请

接下来咱们须要确认弹幕的翻页逻辑,也就是这些弹幕链接的对立法则。这里举荐一个很好用的网页申请剖析工具postman。它不仅能够用来剖析网页的申请参数,还可能提供不同语言的申请代码,稍加批改就能够应用。把刚刚咱们找到的链接贴到postman中。如图所示,能够看到申请的参数,点击send按钮之后能看到申请的后果。因为参数很多,能够思考去掉一些无用的参数。最终发现,只须要保留vid,cid,time三个参数即可。猜想vid示意节目id,cid示意视频id,time应该是申请时刻,是一个相对值。并且申请后果中,而每一条弹幕的工夫,都要比time数值大。联合上文的剖析逻辑,能够得出每一个申请后果都是申请工夫60s内的弹幕。如果咱们要获取所有的弹幕,就能够通过扭转time的值来实现。最小的time取值应该是0,最大的应该就是和视频时长最靠近的60000倍数的毫秒数。这里的节目时长为89:49。通过验证,果然如此,接下来咱们就能够用代码来实现了。

应用postman测试申请参数

应用postman测试time申请参数

代码实现

应用requests结构网络申请,并用一个循环管制翻页,爬取全副的弹幕。解析返回的json数据并应用pandas存储到Excel中。具体代码如下所示,一共45行。

import requestsimport pandas as pdimport timeimport datetimefrom fake_useragent import UserAgentua = UserAgent()url = "https://galaxy.bz.mgtv.com/rdbarrage"rdb_content = {'id': [], 'type': [], 'uid': [], 'content': [], 'add_time': [], 'ups': []}count = 0print("爬取开始工夫: {}".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))for i in range(0, 91):    querystring = {"version": "2.0.0", "vid": "5683459", "cid": "328724", "time": i*60000}    headers = {        'User-Agent': ua.random        }    try:        response = requests.request("GET", url, headers=headers, params=querystring).json()        items = response['data']['items']        if items is None:            print("爬取结束!弹幕数量{}".format(count))            break        else:            for item in items:                rdb_content['id'].append(item.get('id')) #弹幕id                rdb_content['type'].append(item.get('type')) #弹幕类型                rdb_content['uid'].append(item.get('uid')) #用户id                rdb_content['content'].append(item.get('content')) #弹幕内容                rdb_content['add_time'].append(item.get('time')) #弹幕工夫                rdb_content['ups'].append(item.get('up', 0)) #d弹幕点赞数                count = count + 1            print("爬取第{}分钟的弹幕...,以后弹幕数量{}".format(i + 1, count))        time.sleep(5)    except:        print("第{}分钟弹幕爬取失败!以后弹幕数量{}".format(i + 1, count))        continue    rdb_df = pd.DataFrame(rdb_content)    rdb_df.to_csv('rdb.csv', index=None)

运行成果截图:

运行成果

能够看出,在本次爬取时,弹幕数量曾经将近3w条,而此时节目更新还不到2天,在肯定水平能够反映出该节目的火爆水平。接下来咱们对弹幕数据做一些深刻的剖析,从数据的角度看这期节目。

数据可视化

以上爬取的数据,有一些字段存在缺失,然而占比极小,因而采取删除的形式解决,最终残余28602条无效数据。

数据预处理-删除反复值

01 不同时间段弹幕数量的散布

节目时长大概90分钟,咱们别离以1分钟和10分钟为单位,看一下弹幕数量。能够看出,尽管随着时间推移,弹幕数量有所稳定,但整体来讲,在各个工夫,弹幕稳定不激烈,也反映出节目可能持续保持较高的热度,堪称“分分钟都是精彩”。

每分钟弹幕数量柱形图 .png

每十分钟弹幕数量柱形图.png

02 不同长度的弹幕数量散布

不同弹幕长度柱形图.png

能够看出,大多数弹幕的长度都集中于10个字高低,趋向于口语化。这也合乎咱们的认知,10字左右曾经足以表白用户看剧的情绪和观点。当然也有不嫌麻烦的用户,弹幕数量达到了30字以上,也有极少量的弹幕长度达到了50以上。出于好奇,咱们能够看一下长度超过50的弹幕都说了啥,见下图所示,多少可能感触到观众非常用心地在享受节目。

长度超过50弹幕.png

03 弹幕点赞数散布

点赞数量区间.png

能够看出有靠近四分之一分弹幕没有取得点赞。近6成的弹幕点赞量在20以下,点赞量20以上的弹幕不到20%。咱们同样能够看一下点赞大于300的弹幕都说了啥,但从弹幕就能感触到节目整体的欢乐气氛。

点赞超过300弹幕.png

04 用户公布的弹幕数量,点赞数,弹幕总字数比照

咱们的数据中共有17268名用户公布了28602条弹幕,依照点赞数降序排列取前10,察看弹幕数量,点赞数,弹幕总字数。能够看出,点赞数高的用户,公布的弹幕数量也多,字数相应也很多。

各用户弹幕状况比照.png

05 弹幕应用emoji表情状况

弹幕emoji表情应用状况.png

06 词云图

通过对弹幕进行分词解决,绘制出以下的词云图。

弹幕词云图

看着这个词云图,霎时感觉有溢出屏幕的欢畅,如同耳朵也能音乐听见断断续续的“哈哈哈哈”声,大众的眼睛是雪亮的,能让人如此开心的节目,火起来天然也就难能可贵了。

至此,咱们根本实现了《向往的生存》第5期节目弹幕的抓取与简略的可视化剖析工作。更多乏味的点大家能够本人去剖析和发现。原本我还调用了百度的情感剖析API,想对弹幕的情感偏向进行剖析,但成果如同不是太好,后果就没有贴出来。感兴趣的盆友能够看代码。欢送关注公众号“超哥的杂货铺”,在后盾回复“向往的生存”索取源代码。祝大家生存欢快!