小项目-弹幕数据分析+词云展示

端午节除了学习领导要求的蒙特卡洛和VAR建模分析,闲暇时间做了一个小项目,记录在博客上。

5月29日,备受关注的季中邀请赛在韩国釜山图书馆结束,代表LPL出战的RNG3比2战胜了韩国的T1,看的那叫一个扬眉吐气,今天做个小项目,爬取下B站比赛视频,看下网友都咋说,然后做个简单的分析。

0. 导包

## 各个包功能不再赘述,注意后文的高频词汇分析时用jieba.analyse
import re
import requests
from bs4 import BeautifulSoup as Bs
import time
import os
import wordcloud
import jieba
import jieba.analyse
import pandas as pd
import numpy as np
import matplotlib.pyplot

1. 关于B站弹幕获取

1.1 获取弹幕的cid号

首先说明下B站的弹幕情况:
B站每一个视频都有一个专属的网址与弹幕区,可以用来当作每个视频的“身份证
需要找到B站的弹幕接口,一般为http://comment.bilibili.com/“cid”.xml,而这个cid可以看作是视频弹幕的身份证号(注意,这里爬取的弹幕数量是有限的,不是全量)
所以我们需要获取下比赛视频的cid号:

这里有两种方法:
1、PC端找到比赛视频网址:https://www.bilibili.com/video/BV1B54y1o72S,「分享」-「嵌入代码」-复制,然后粘贴出来:
RNG的决赛视频分享时嵌入代码为:
“”

这里我们可以看到cid=732953378,我们需要的是这串数字。
在这里插入图片描述
2、爬虫获取,这里直接上代码。

url = 'https://www.bilibili.com/video/BV1B54y1o72S'
r1 = requests.get(url=url)
html1 = r1.text
cid = re.findall('cid=(.*?)&aid=',html1)[0]
cid

得到结果:‘732953378’,和第一种方法相同。

1.2 获取弹幕信息

直接上代码,说明在注释中进行解释。

bullet_url = 'http://comment.bilibili.com/{}.xml'.format(cid) #弹幕地址
print('弹幕地址是:',bullet_url)
r2 = requests.get(url=bullet_url)
r2.encoding='utf-8' #如果爬取结果中文部分是乱码,通过此代码调整
html2 = r2.text

soup = Bs(html2,'xml') #解析html2
bullet_list = soup.find_all('d') 
bullet_list
len(bullet_list) 
# 结果发现有1800条弹幕,相比网站下方“装填3000条弹幕”可见爬取的只是一部分
## 解析好的弹幕数据包括弹幕时间,弹幕内容,后续我们可以对这两项内容进行拆解分析
### 对于解析xml页面,<d>标签的文本内容文弹幕,<d>标签内p属性值的第四个字符值是时间戳
video_url_list = [] #准备好空列表
bullet_url_list = []
time_list = []
text_list = []
for dm in bullet_list:
    data_split = dm['p'].split(',')
    temp_time = time.localtime(int(data_split[4])) #转换时间格式
    bullet_time = time.strftime("%Y-%m-%d %H:%M:%S",temp_time)
    video_url_list.append(url)
    bullet_url_list.append(bullet_url)
    time_list.append(bullet_time)
    text_list.append(dm.text)
    print('{}:{}'.format(bullet_time,dm.text))

2. 情感分析

这里用snownlp库去进行情感解析及分析

dic = {'弹幕时间':time_list,'弹幕内容':text_list}
df = pd.DataFrame(dic) #将爬取的弹幕组程dataframe
from snownlp import SnowNLP
v_cmt_list = text_list
# 准备初始数据
tag_list = []
score_list =[]
neg_count = 0
pos_count = 0
mid_count = 0

# 情感判定
for comment in v_cmt_list:
    tag = ''
    sentiments_score = SnowNLP(comment).sentiments
    if sentiments_score < 0.5:
        tag = '消极'
        neg_count += 1
    elif sentiments_score > 0.5:
        tag = '积极'
        pos_count += 1
    else:
        tag = '中性'
        mid_count += 1
    score_list.append(sentiments_score) #得分值
    tag_list.append(tag)
# 把得分和结果加到df中
df['情感得分'] = score_list
df['分析结果'] = tag_list

结果:
在这里插入图片描述
当然,这里的snownlp没有训练过的,有些表达存在差异。

# 对结果进行展示
show= df['分析结果'].value_counts()
print('正负面评论统计:')
print(show)

在这里插入图片描述

## 做个饼图看下
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False
grp.plot.pie(y='分析结果',autopct='%2f%%')

在这里插入图片描述

3. 关键词获取

这里用jieba.analyse 对分析结果的高频词汇进行统计

v_cmt_str = ''.join(v_cmt_list) #把列表中所有字符进行合并
print(v_cmt_str)
keywords_top10 = jieba.analyse.extract_tags(v_cmt_str,withFlag=True,topK=10)
print('top10关键词及权重:') #这里我的结果没有显示权重= = 
print(keywords_top10)

结果在这里插入图片描述
也比较符合我们对这场比赛的认知。

4. 生成词云图

# 由于词云是针对英文单词块的,这里先用jieba分下词
ls = jieba.lcut(v_cmt_str)
text = ' '.join(ls)
print(text)
# 首先对一些常见的中断词进行定义
stopwords =  ['的','啊','是','了','你','我','都','也','不','在','吧','说','就是','这','有']
wc = wordcloud.WordCloud(font_path="msyh.ttc",
                         width = 1000,
                         height = 700,
                         background_color='white',
                         max_words=100,stopwords=stopwords)
# msyh.ttc电脑本地字体,写可以写成绝对路径
wc.generate(text) # 加载词云文本
wc.to_file("Rng.png") # 保存词云文件

词云结果——哈哈,也比较符合认知。
在这里插入图片描述

RNG牛逼,是时候放出17年世界赛的应援物了。17年现场目睹RNG与SKT血战五局,五年之后,时移势迁,这也是我在上海的第五年,尘归尘,土归土,愿诸事顺遂。
在这里插入图片描述

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值