这篇博文很早就打算写了,但因为懒一直拖到现在,先交代一下博文选材背景:8月2号,B 站数码 Up 主 老师好我叫何同学 更新了一个视频《【何同学】我拍了一张600万人的合影... 》(离他的上一个视频更新已经一个多月),来纪念频道成立三周年
虽说在何同学提前一天的预告中就猜到这个视频的质量一定不会差,但看完之后,内心只有俩字牛逼!,这个视频真的真的惊艳到我了,赞叹于他视频制作水准,佩服于他对粉丝的用心;在看视频中看到一条弹幕,觉得评价地很中肯:等一个多月看到这个视频、值了!
关于这个视频还是很推荐,截至到8月8日已经在B站已经播放了 880万次,链接我放在下方,有兴趣或者想二刷的小伙伴可以刷一下
而本文将是围绕这个视频的弹幕进行采集,并做简单的分析;在接下来的部分中,文章将分为三个部分展开:
-
1,数据采集部分;介绍一种采集 B 视频弹幕的方法;
-
2,数据可视化并分析;根据评论时间分布制成可视化图表,分别以弹幕发布时间、视频各阶段弹幕量占比、弹幕数量时间走势等几个角度做简单分析;
-
3,弹幕词云可视化:将采集得到的文本制成词云图;
B站弹幕采集
1, 这里先介绍一下 B 站视频弹幕的采集方法,本文用的是 Python 脚本作为抓取工具,首先打开抓取的视频网页,这里以何同学的这个视频为例,找到右边的 弹幕列表
![](https://img.haomeiwen.com/i8632205/e68b7751489e68c3.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">1.png</figcaption>
2,按 F12 打开开发者工具,依次点击弹幕列表、查看历史弹幕、选择日期 ,随后找到 开发者模式中的 history?... 链接(图中的右边箭头所示,若找不到刷新一下页面,重新按照上面步骤操作一下即可);
![](https://img.haomeiwen.com/i8632205/bc03e082b95855a5.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">2.png</figcaption>
3,2 中的链接就是最终我们需要的链接,仔细观察后会发现这个链接有两个关键参数构成,一个 oid, 一个 date ,oid 表示视频 ID 比较容易查找,date 表示日期,可通过 datetime 来构造;
![](https://img.haomeiwen.com/i8632205/f6060b2e18be7e9d.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">3.png</figcaption>
![](https://img.haomeiwen.com/i8632205/182b31c74434e264.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">4.png</figcaption>
4,构造 3 中的链接之后,用常规的爬取方法(requests + Beautifulsoup) 即可,
![](https://img.haomeiwen.com/i8632205/6b74153cacbfd796.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">5.png</figcaption>
主要代码部分如下:
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 + dateltimedef 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 弹幕数量总数变化走势图,从图里面得不到什么有效的信息,有一点是弹幕走势呈现一短时间骤升、一段时间平缓状态;
![](https://img.haomeiwen.com/i8632205/b3eb50dca4091d15.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">Snipaste_2020-08-08_23-22-26.png</figcaption>
2,接下来对 8.2 -8.8 每天以没30分钟作为一个时间段,汇总每天各时间段弹幕数量分布与变化,最终绘制得到沿时间线走向的动态趋势图;
![](https://img.haomeiwen.com/i8632205/9c32fca8c4a12ad5.gif)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">录制_2020_08_08_23_32_16_808.gif</figcaption>
从动态图中可以看到 视频刚公布没多久弹幕较为集中,且数量最多,随着时间推移,评论愈发分散、数量愈发减少,这个特点可能适用于大部分 头部 Up 主 视频播放特点,播放量从多到少,热度从高到低
3,最后,因为视频《【何同学】我拍了一张600万人的合影...》整个时间长度为 7:56,因此我想观察在采集的数据中那个时间段发布的弹幕数最多,那个时间段发布最少,再结合视频节点内容本身分析一下,于是最终就得到了下面这一张图:
![](https://img.haomeiwen.com/i8632205/6054d4d8c63762f8.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">Snipaste_2020-08-08_23-42-32.png</figcaption>
弹幕最多的是在 4分-4分30秒的中间,我截了其中一张图,视频内容部分就是和同学成功把将近600万粉丝的id 刻在A4 纸板子上,贴放在墙上为后面汇至到一个镜头打下基础;以我自己的角度猜测一下,因为这个工作量太大,为何同学的用心而感动;
![](https://img.haomeiwen.com/i8632205/b43182d5338960e1.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">Snipaste_2020-08-08_23-40-14.png</figcaption>
弹幕最少的实在2分-2分半,这部分内容是在思考 怎样找到一个能贴满 300张 A4纸的墙壁?,内容掺杂着一部分诙谐,粉丝们可能大部分都在思考,也就忘记了发弹幕(自己的一点猜测)。
![](https://img.haomeiwen.com/i8632205/1dacca09b0fd1334.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">Snipaste_2020-08-08_23-43-15.png</figcaption>
词云图展示
最后,将 7000 条弹幕制成词云图,做一下可视化预览,这里没有用Python 相关包,用的是 WordArt
![](https://img.haomeiwen.com/i8632205/4b9473c10c412d3d.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">Word Art.png</figcaption>
泪目、感动、辛苦了 是粉丝们看完这个视频的感受,足以反映出何同学的用心和真诚,找到了 表示粉丝确实从 600万粉丝的合照中找到了自己的 ID ,可以感受到拍摄这个合照的难度,
最后以 老师好我叫何同学 ID为词云图背景作为文章的结束,关于文章完整源码,公号 【小张Python】后台回复 何同学 即可获取。
![](https://img.haomeiwen.com/i8632205/dfa8aa7dc0932e22.jpg)
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">Word Art (1).png</figcaption>
好了,以上就是本篇的所有内容,最后感谢大家的阅读!
网友评论