Fork me on GitHub

从《【何同学】我拍了一张600万人的合影...》弹幕分析中,获取到了什么?

这篇博文很早就打算写了,但因为懒一直拖到现在,先交代一下博文选材背景:8月2号,B 站数码 Up 主 老师好我叫何同学 更新了一个视频《【何同学】我拍了一张600万人的合影... 》(离他的上一个视频更新已经一个多月),来纪念频道成立三周年

虽说在何同学提前一天的预告中就猜到这个视频的质量一定不会差,但看完之后,内心只有俩字牛逼!,这个视频真的真的惊艳到我了,赞叹于他视频制作水准,佩服于他对粉丝的用心;在看视频中看到一条弹幕,觉得评价地很中肯:等一个多月看到这个视频、值了!

关于这个视频还是很推荐,截至到8月8日已经在B站已经播放了 880万次,链接我放在下方,有兴趣或者想二刷的小伙伴可以刷一下

而本文将是围绕这个视频的弹幕进行采集,并做简单的分析;在接下来的部分中,文章将分为三个部分展开:

  • 1,数据采集部分;介绍一种采集 B 视频弹幕的方法;

  • 2,数据可视化并分析;根据评论时间分布制成可视化图表,分别以弹幕发布时间、视频各阶段弹幕量占比、弹幕数量时间走势等几个角度做简单分析;

  • 3,弹幕词云可视化:将采集得到的文本制成词云图;

B站弹幕采集

1, 这里先介绍一下 B 站视频弹幕的采集方法,本文用的是 Python 脚本作为抓取工具,首先打开抓取的视频网页,这里以何同学的这个视频为例,找到右边的 弹幕列表

1.png

2,按 F12 打开开发者工具,依次点击弹幕列表、查看历史弹幕、选择日期 ,随后找到 开发者模式中的 history?... 链接(图中的右边箭头所示,若找不到刷新一下页面,重新按照上面步骤操作一下即可);

2.png

3,2 中的链接就是最终我们需要的链接,仔细观察后会发现这个链接有两个关键参数构成,一个 oid, 一个 date ,oid 表示视频 ID 比较容易查找,date 表示日期,可通过 datetime 来构造;

3.png

4.png

4,构造 3 中的链接之后,用常规的爬取方法(requests + Beautifulsoup) 即可,

5.png

主要代码部分如下:

def get_duration_time(start_date1,end_date,video_id):
    # 日期格式转换
    start_date = datetime.datetime.fromisoformat(start_date1)
    end_date = datetime.datetime.fromisoformat(end_date)
    dateltime = datetime.timedelta(days=1)
    while start_date <= end_date:

        startdate_format =  start_date.strftime("%Y-%m-%d")
        download_date(startdate_format,video_id)
        start_date = start_date +  dateltime



def download_date(timedate,video_id):
    # 传入日期、视频id 进行数据爬取
    shipin_url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid={0}&date={1}'.format(video_id,timedate)
    print("正在抓取弹幕网页", shipin_url)
    response = requests.get(url = shipin_url,headers = headers)
    response.encoding = 'utf-8'
    soup = BeautifulSoup(response.text,'lxml')
    for i in soup.find_all('d'):
        locate = re.findall(r'p="(.*?)">(.*?)</d>',str(i))
        file.write(str(locate[0][0]))
        file.write(',')
        file.write(str(str(locate[0][-1])))
        file.write("\n")
    time.sleep(2) # 增加时间间隔,防止爬取太频繁;

可视化分析

可视化部分主要用到了 Pyecharts ,数据一共采集到了 7000 条弹幕,时间跨度从 8.2 — 8.8,

1,下面这张图是关于 从8.2— 8.8 弹幕数量总数变化走势图,从图里面得不到什么有效的信息,有一点是弹幕走势呈现一短时间骤升、一段时间平缓状态;

Snipaste_2020-08-08_23-22-26.png

2,接下来对 8.2 -8.8 每天以没30分钟作为一个时间段,汇总每天各时间段弹幕数量分布与变化,最终绘制得到沿时间线走向的动态趋势图;

录制_2020_08_08_23_32_16_808.gif

从动态图中可以看到 视频刚公布没多久弹幕较为集中,且数量最多,随着时间推移,评论愈发分散、数量愈发减少,这个特点可能适用于大部分 头部 Up 主 视频播放特点,播放量从多到少,热度从高到低

3,最后,因为视频《【何同学】我拍了一张600万人的合影...》整个时间长度为 7:56,因此我想观察在采集的数据中那个时间段发布的弹幕数最多,那个时间段发布最少,再结合视频节点内容本身分析一下,于是最终就得到了下面这一张图:

Snipaste_2020-08-08_23-42-32.png

弹幕最多的是在 4分-4分30秒的中间,我截了其中一张图,视频内容部分就是和同学成功把将近600万粉丝的id 刻在A4 纸板子上,贴放在墙上为后面汇至到一个镜头打下基础;以我自己的角度猜测一下,因为这个工作量太大,为何同学的用心而感动;

Snipaste_2020-08-08_23-40-14.png

弹幕最少的实在2分-2分半,这部分内容是在思考 怎样找到一个能贴满 300张 A4纸的墙壁?,内容掺杂着一部分诙谐,粉丝们可能大部分都在思考,也就忘记了发弹幕(自己的一点猜测)。

Snipaste_2020-08-08_23-43-15.png

词云图展示

最后,将 7000 条弹幕制成词云图,做一下可视化预览,这里没有用Python 相关包,用的是 WordArt

Word Art.png

泪目、感动、辛苦了 是粉丝们看完这个视频的感受,足以反映出何同学的用心和真诚,找到了 表示粉丝确实从 600万粉丝的合照中找到了自己的 ID ,可以感受到拍摄这个合照的难度,

最后以 老师好我叫何同学 ID为词云图背景作为文章的结束,关于文章完整源码,公号 【程序员大飞】后台回复 何同学 即可获取。

Word Art (1).png

好了,以上就是本篇的所有内容,最后感谢大家的阅读!

posted @ 2020-08-23 12:54  zeroing1  阅读(329)  评论(0编辑  收藏  举报