爬虫_周杰伦新歌《Mojito》B站弹幕分析

6.12周杰伦发布新歌《Mojito》,赶紧蹭个热点来看一下大家弹幕都会说点什么。
爬取链接【官方MV】Mojito - 周杰伦
本项目源码,提取码duq8

目前弹幕只能抓取1000条,再多些的抓取方法我就不会了,每一次调用API返回的弹幕文本可能会是不一样的,所以各位运行文件后出现的结果会有所不同。

找弹幕API

自己抓包研究是不可能的,前人肯定都帮我们踩过坑了,所以我这种技术渣渣肯定要在搜索引擎上搜寻资料的,B站弹幕接口,这篇文章很详细地介绍了B站弹幕API的各个参数。
B站弹幕API格式:https://api.bilibili.com/x/v1/dm/list.so?oid= + cid

找cid

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第1张图片

  1. 打开爬取链接
  2. F12打开开发者模式
  3. 选择Elements,Ctrl+F查询"cid="
  4. 红色方框内即是我们要找的cid

验证API是否可用

根据上面两步我们得出的弹幕抓取链接是https://api.bilibili.com/x/v1/dm/list.so?oid=201056987,我们来测试一下。
爬虫_周杰伦新歌《Mojito》B站弹幕分析_第2张图片
可用,注意是XML格式的,所以我们要解析一下,这次我用的是re。

爬取弹幕

"""
爬取弹幕的原视频链接:https://www.bilibili.com/video/BV1PK4y1b7dt?from=search&seid=8989995112711953123
B站弹幕API格式:https://api.bilibili.com/x/v1/dm/list.so?oid= + cid
"""
import requests
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import warnings
import re
import pandas as pd
import seaborn as sns
import pyecharts.charts as pyc
import pyecharts.options as opts
# 解决matplotlib中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 忽略警告
warnings.filterwarnings("ignore")

# 爬取弹幕
url = "https://api.bilibili.com/x/v1/dm/list.so?oid=201056987"
res = requests.get(url=url)
# 设置编码UTF-8
res.encoding='UTF-8' 
# 根据正则提取弹幕属性和弹幕文本
danmu= re.findall("(.*?)",res.text)
data = pd.DataFrame(danmu,columns=['p','弹幕'])

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第3张图片
执行到这一步时,我们将弹幕信息和文本结合到一个DataFrame里,第一列p是每条弹幕的属性,第二列则是每条弹幕的文本,首先我们处理一下弹幕

文本处理及词云图

from string import punctuation
# 导入自定义字典
jieba.load_userdict("./mydict.txt")

# 设置停用字与符号
stop = ',。、【 】 “”:;()《》‘’{}?!()、%^>℃:.”“^-——=&#@¥!___…↑我的了1是'+punctuation

# 将Series转为list
danmu_list = data['弹幕'].to_list()

word_list = []
for sentence in danmu_list:
    # 遍历danmu_list,对每一句弹幕进行清洗
    new_sentece = []
    for w in sentence:
        # 遍历每一句弹幕,如果出现停用的字符就跳过,保留汉字和字母
        if w in stop:
            pass
        else:
            new_sentece.append(w.strip())
    # 把list转为str
    new_sentece = ''.join(new_sentece)
    for i in jieba.cut(new_sentece):
        word_list.append(i.strip())
# 统计词频
import collections
words = sorted(collections.Counter(word_list).items(),key=lambda x:x[1],reverse=True)

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第4张图片

  1. 从词云图来看,周杰伦这首《Mojito》的MV真的是相当粉嫩,出现次数较高的几个字或词都带有“粉”字。
  2. “爷青回”即“爷的青春回来了”,周杰伦的歌曲影响了一代人,即使年龄在慢慢增长,但他们始终珍藏着记忆中青春的模样。
  3. 词云图中不乏“啊啊啊”、“哈哈哈”、“哦哦哦”之类的语气词。可见听众们对于期待已久的周杰伦的新歌难掩内心的惊喜之情,只能借用这种感叹词来表达。(或者说词语的匮乏,例如一个卧槽包含千万感情)

EDA

属性数据清洗

attr = data['p'].str.split(",",expand=True)
# 设置列名
attr.columns= ['appear','mode','size','color','timestamp','pool','uid','rowid']

# 将弹幕出现时间设置为float
attr['appear']=attr['appear'].astype("float")

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第5张图片

弹幕出现时间分布

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第6张图片

  1. 整个弹幕的出现分布呈现右偏,符合音视频的用户流失情况。
  2. 弹幕的发送密度在前100秒较高,期间有两个峰值,分别是10-20秒以及90-95秒,前一个区间是前奏部分,而后一个区间是rap部分。从周杰伦唱出第一句歌词的18-19秒,及唱完rap部分的100秒之后弹幕密度骤降。随后的loop副歌部分弹幕数呈现明显的下降趋势。

弹幕模式

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第7张图片

  1. B站弹幕的模式:1-3 滚动弹幕,4 底端弹幕,5顶端弹幕,6 逆向弹幕,7 精准定位,8 高级弹幕。
  2. 可以发现用户最常发送弹幕的形式是滚动弹幕,因为B站默认发送弹幕的模式就是滚动弹幕,可以增加提示以提高弹幕的多样性。
  3. 顶端弹幕多于底部弹幕,毕竟减少眼球活动路径可以最大化的提高自己发送弹幕被人家发现的概率。还有就是底部弹幕会挡住歌词字幕。

字号分布

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第8张图片

  1. 问就是默认。。B站就只有“小”和“标准”字号两个选项,默认是“标准”

弹幕颜色

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第9张图片
这都是10进制的,我们用hex转换,通过在线的配色网站查得配色最多的前三名分别如下图所示:
爬虫_周杰伦新歌《Mojito》B站弹幕分析_第10张图片

  1. 14811775对应的是#E2027F,16777215对应的是#FFFFFF,13369971对应的是#CC0273
  2. 第一名#E2027F(14811775)浅粉色,第二名#FFFFFF(16777215)白色,第三名#CC0273(13369971)深粉色。白色的排名如此之高我可以理解,但是浅粉色的排名是第一名的确没有想到,因为B站默认的色表中接近粉色的只有#CC0273,看来发弹幕的朋友们为了切合视频的配色还特意去找了浅粉色的十六进制数,真不容易。

用户发送弹幕次数

爬虫_周杰伦新歌《Mojito》B站弹幕分析_第11张图片

  1. 大多数听众只发送一次弹幕,但也有狂热爱好者连发7条弹幕。

总结

支持原创!杰伦牛逼!

参考文献

爬取周杰伦新歌《Mojito》MV弹幕,看看粉丝们都说的些啥!

你可能感兴趣的:(爬虫,数据分析,python,数据挖掘)