《向往的生活》弹幕抓取与分析

《向往的生活》弹幕抓取与分析

《向往的生活》是湖南卫视一档十分温馨的生活类真人秀综艺节目,目前第三季正在更新中,常驻嘉宾加入了张子枫,深受广大观众的喜欢。而该节目的豆瓣评分也达到了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 requests
import pandas as pd
import time
import datetime
from fake_useragent import UserAgent

ua = UserAgent()
url = "https://galaxy.bz.mgtv.com/rdbarrage"

rdb_content = {'id': [], 'type': [], 'uid': [], 'content': [], 'add_time': [], 'ups': []}
count = 0

print("爬取开始时间: {}".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,想对弹幕的情感倾向进行分析,但效果好像不是太好,结果就没有贴出来。感兴趣的盆友可以看代码。欢迎关注公众号“超哥的杂货铺”,在后台回复“向往的生活”索取源代码。祝大家生活愉快!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容