今年四月新番出了不少新番,其中百妖谱、大理寺日志、一人之下3等国漫备受期待,相比于百妖谱、一人之下3的前期pv宣传,大理寺日志显得很平淡。但该番上线后,bilibili评分9.8,剧情、画风、特效、配音等皆在线。在技术小白好奇心的驱使下,爬取了该番前四集弹幕,并做了点分析。
数据爬取简单流程图
解析网页,获取单集弹幕url,点击进去可以看到获取的网页格式
弹幕url访问页面截图
弹幕的url规律解析太繁琐,因为比较少,就直接单集访问copy过来存储在list中(对本小白来说比较节省时间)
self.url_list = ['https://api.bilibili.com/x/v1/dm/list.so?oid=178579852',
'https://api.bilibili.com/x/v1/dm/list.so?oid=178580044',
'https://api.bilibili.com/x/v1/dm/list.so?oid=178582161',
'https://api.bilibili.com/x/v1/dm/list.so?oid=181413069']
从弹幕url访问截图可以看到用requests.get()得到的结果,可以用re提取弹幕文字
正则表达式
self.regex='(.*?) '
解析
pattern = re.compile(self.regex,re.S)
bullet_screen_list = pattern.findall(html)
最后将爬取的结果存储到csv文件中,按条存储,一条弹幕一行
def save_csv(self,bullet_list):
with open(self.filename,'a',encoding='utf-8') as f:
writer = csv.writer(f)
for i in bullet_list:
writer.writerow([self.id,i])
self.id += 1
数据爬取详细代码,写了一个类.
import requests
import csv
import re
class DlsSpider:
def __init__(self):
self.url_list = ['https://api.bilibili.com/x/v1/dm/list.so?oid=178579852',
'https://api.bilibili.com/x/v1/dm/list.so?oid=178580044',
'https://api.bilibili.com/x/v1/dm/list.so?oid=178582161',
'https://api.bilibili.com/x/v1/dm/list.so?oid=181413069']
self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36'}
self.regex='(.*?) '
self.filename='dalisi.csv'
self.id = 0
def get_html(self):
for url in self.url_list:
html = requests.get(url=url,headers=self.headers).content.decode()
self.parse_html(html)
def parse_html(self,html):
pattern = re.compile(self.regex,re.S)
bullet_screen_list = pattern.findall(html)
self.save_csv(bullet_screen_list)
def save_csv(self,bullet_list):
with open(self.filename,'a',encoding='utf-8') as f:
writer = csv.writer(f)
for i in bullet_list:
writer.writerow([self.id,i])
self.id += 1
def run(self):
with open(self.filename,'w',encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['id','bullet_screen'])
self.get_html()
if __name__ == '__main__':
spider = DlsSpider()
spider.run()
看一眼数据,他大概长这个样子,有12000条
弹幕人物关注度进行分析,这里列举了前四集主要出场人物,构建了相关人物的词列表,并对人物弹幕出现次数进行统计
libing = ['李饼','猫爷','猫总','大狸子','猫哥','少卿大人','饼哥']
chenshi = ['陈拾','陈姥姥']
wangqi = ['王七','七娘','七姑娘']
alibaba = ['阿里巴巴']
person_num ={
}
for person in [libing,chenshi,wangqi,alibaba]:
person_num[person[0]] = int(data['bullet_screen'].str.contains('|'.join(person)).sum())
查看统计结果如下:
{‘李饼’: 1256, ‘陈拾’: 50, ‘王七’: 165, ‘阿里巴巴’: 65}
从这个结果来看,猫爷果然是主角,关注程度甩其他几位三位数,而其他几位主要角色中,王七关注度最高,阿里巴巴其次,但不排除该角色与某大厂撞名从而受关注的可能性。
对结果进行可视化
bar=(
Bar().add_xaxis(list(person_num.keys()))
.add_yaxis('数量',list(person_num.values()))
.set_global_opts(title_opts=opts.TitleOpts(title='人物弹幕关注数量占比柱状图'))
)
pie = (
Pie().add('人物',list(zip(list(person_num.keys()),list(person_num.values()))),
radius=['40%','80%'],
rosetype="area")
.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item',formatter='{a}
{b}:{c} ({d}%)'))
)
count_words = data['bullet_screen'].value_counts()
words = []
for index in count_words.index:
words.append((index,int(count_words[index])))
词云可视化
wordcloud = (
WordCloud().add('弹幕分析',data_pair=words,word_size_range=[15,60])
.set_global_opts(
title_opts=opts.TitleOpts(title='弹幕分析'),
tooltip_opts=opts.TooltipOpts(is_show=True))
)
出现频率最高的是度制作团队的敬意“辛苦了”,侧面说明观众对该番剧的认同。之后是对剧中台词的复述,以及对剧情的讨论,可以看出该番剧情也是被观众认同的,一些“哈哈哈”类的开心言论,也可以看出该番搞笑的氛围。此外,五一期间,祝大家假期愉快。
对弹幕进行分词,再来看看大家都在讨论什么
采用jieba分词全模式,之后又去除了弹幕中的常见标点,以及空格
分词
word_txt = " ".join(data['bullet_screen'])
str_quan = jieba.cut(word_txt,cut_all=False)
word_cut = '/'.join(str_quan)
用空格代替常见标点符号
char = '!,。?:…—~~'
word_cut = re.sub(r'[{}]+'.format(char),' ',word_cut)
word_list = word_cut.split('/')
转换成DataFrame格式,去除空格
data_word = pd.DataFrame(word_list,columns=['word'])
data_word=data_word[data_word['word']!=' ']
count = data_word['word'].value_counts()
word=[]
for index in count.index:
word.append((index,int(count[index])))
wordcloud2 = (
WordCloud().add('弹幕分析',data_pair=word,word_size_range=[15,80])
.set_global_opts(
title_opts=opts.TitleOpts(title='弹幕词汇分析'),
tooltip_opts=opts.TooltipOpts(is_show=True))
)
从分词之后的结果依然可以看出观众对制作的认可,bilibili评分9.8确实很有实力。
仔细看看,一些“方言”、“口音”的词汇可以看出该番配音形式,“唐朝”、“武则天”可以看出该番有一定的时代背景,此外,弹幕中关于“猫”的词汇出现的比较频繁,可以看出该番与猫有关,结合“猫爷”、“少卿”词汇讨论数量相近,可以猜测主角与猫关系匪浅,剧情上较有吸引力。而“小黑”(番剧罗小黑战记角色)、“护法”(电影大护法角色)的讨论,可以看到背后制作团队的相关性,联想到罗小黑战记和大护法的制作和口碑,可以相信大理寺日志的制作如二者一样可以获得好口碑。
代码数据链接: 欢迎下载.