乐趣区

关于python:教你用Python抓取分析向往的生活弹幕

《向往的生存》是湖南卫视一档非常舒适的生存类真人秀综艺节目,目前第三季正在更新中,常驻嘉宾退出了张子枫,深受广大观众的喜爱。而该节目的豆瓣评分也达到了 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,想对弹幕的情感偏向进行剖析,但成果如同不是太好,后果就没有贴出来。感兴趣的盆友能够看代码。欢送关注公众号“超哥的杂货铺”,在后盾回复“向往的生存”索取源代码。祝大家生存欢快!

退出移动版