基于python的B站弹幕数据分析(爬虫+可视化)

都昌林总

发布日期: 2018-12-31 15:39:20 浏览量: 2269
评分:
star star star star_border star_border star_border star_border star_border star_border star_border
*转载请注明来自write-bug.com

python—B站弹幕数据分析

1 背景

在视频网站上,一边看视频一边发弹幕已经是网友的习惯。B站就是其中一个比较出名的弹幕网站,许多年轻人都喜欢逛B站,看喜欢的动漫亦或某些UP主做的一些剪辑。本项目,就是对B站弹幕数据进行分析。选取分析的对象是B站上一部国漫《全职高手》。

2 环境的安装

本项目实在pycharm中实现,使用到的第三方库有requests,bs4,pandas,jieba.posseg,pyecharts。具体如何安装,百度都有详细的步骤,我在这里就不啰嗦了。

3 相关代码代码实现

3.1 爬虫部分

在《全职高手》动漫的播放页查看网页源码,找到cid

因为b站需要通过格式为:”https://api.bilibili.com/x/v2/dm/history?type=1&oid={}&date=2018-{}-{}“ 的链接获取弹幕历史文件,所以我们到时候可以通过url拼接,来爬取我们想要的具体哪一天的弹幕。

存放B站弹幕的是网站是xml格式的,如下图所示

其中每个字段都有对应的含义:

  • 第一个参数是弹幕出现的时间以秒数为单位

  • 第二个参数是弹幕的模式1..3 滚动弹幕 4底端弹幕 5顶端弹幕 6.逆向弹幕 7精准定位 8高级弹幕

  • 第三个参数是字号, 12非常小,16特小,18小,25中,36大,45很大,64特别大

  • 第四个参数是字体的颜色以HTML颜色的十进制为准

  • 第五个参数是Unix格式的时间戳。基准时间为 1970-1-1 08:00:00

  • 第六个参数是弹幕池 0普通池 1字幕池 2特殊池【目前特殊池为高级弹幕专用】

  • 第七个参数是发送者的ID,用于“屏蔽此弹幕的发送者”功能

  • 第八个参数是弹幕在弹幕数据库中rowID 用于“历史弹幕”功能

遍历爬取弹幕历史文件,存入csv中,保存格式为:[‘弹幕出现时间’, ‘弹幕格式’, ‘弹幕字体’, ‘弹幕颜色’, ‘弹幕时间戳’,’弹幕池’,’用户ID’,’rowID’,’弹幕信息’]

3.2 可视化部分

保存了所有数据之后,先对数据进行处理:先读取csv文件,再进行可视化分析

每一集弹幕总量变化—折线图:逐个读入弹幕历史文件:d1.csv,d2.csv,……经过去重后,统计出每集的弹幕总量:

  1. data = pd.read_csv(path.strip(),encoding='gbk',engine='python')

统计每一集的弹幕总量,存放在字典中

  1. episode_comment_dic[i] = every_episode_comment(data)

之后便进行可视化绘图了

  1. def every_episode_comment_change(episode_comment_dic):line = pyecharts.Line("每一集弹幕变化总量",'2018-12-27',width=1200,height=600)
  2. keys = []
  3. values = []
  4. for i in episode_comment_dic:
  5. keys.append("第%d集" % i)
  6. values.append(episode_comment_dic[i])
  7. '''每一集弹幕总量的折线变化图'''
  8. line.add("每一集弹幕总量的折线变化图",keys,values)
  9. es = pyecharts.EffectScatter()
  10. es.add("",keys,values)
  11. overlap = pyecharts.Overlap()
  12. overlap.add(line)
  13. overlap.add(es)
  14. return overlap

发送弹幕总量TOP5用户:1.统计每一集弹幕数量,把用户排序,每一集排序后的结果都是一个DataFrame, 结果的大致结构:user_sort_dic = {1: DataFrame1, 2:DataFrame2, ……,12: DataFrame12}。

  1. '''每一集用户发送弹幕数量排序'''
  2. def every_episode_usersort(data):
  3. df = data.drop_duplicates()
  4. dd = df.groupby("用户ID").count()
  5. user_sort = dd.sort_values(by = '弹幕信息',ascending=False).loc[:,['弹幕信息']]
  6. return user_sort

用户发弹幕长度分布,统计发送弹幕的字符串长度:

用户发弹幕数量分布,统计一集,用户发送弹幕数量的百分比分布图。

  1. user_sort_dic[i] = every_episode_usersort(data)
  2. '''统计用户发送弹幕数量的百分比分布图'''
  3. for i in user_sort_dic:
  4. d_tmp = user_sort_dic[i]
  5. pie = every_episode_barrage_pie(d_tmp,i)
  6. timeline1.add(pie,i)
  7. del d_tmp

每集弹幕密度变化图:每个弹幕都有一个时间参数,代表了用户在视频的什么时间发了弹幕。所以我们可以统计出在相同时间参数发出的弹幕量,然后再画出“时间—弹幕数量”折线图,就可以看到弹幕量的变化了。

词云图:对所有的弹幕文本进行分析。先用jieba词库进行分词,然后逐行对弹幕进行词频统计,最后用pyecharts的WordCloud画出词云图,wordcloud = pyecharts.WordCloud(“全职高手-词云图”)

3.3 统计结果

全职高手动漫12集用户发送弹幕条数饼图—轮播:

每一集弹幕总量的变化:

每一集用户发送弹幕的字数饼图—轮播:

12集用户发送弹幕总量排名—直方图:

一集视频中用户发送的弹幕密度图:

12集动漫的词云图:

3.4 结果分析

通过以上的图表数据可以看出用户的弹幕的一些行为。

12集剧里,第一集,第二季和最后一集,弹幕数量是最多的,说明这部动漫刚上线的时候关注度还是很高的,之后的弹幕数量不高可能是因为剧情发展比较平稳,最后一集弹幕数量又多了起来,说明动漫结束,用户们都纷纷发表感慨,从词云中的‘散场’也可看出。

统计了12集的弹幕,用户ID为5ff19abd的用户共发送了480多条弹幕,算是超级粉丝了。

通过弹幕数量和长度的分布,可以看出:绝大部分用户只会发送2条以内的弹幕。参与弹幕讨论的用户以10个字符以内的短语为主。

统计每一集的弹幕密度,可以通过用户观看时的讨论,大致确定视频的精彩点。

通过词云图,可以大致看出用户的分布。例如‘散场’作为热词显示里。说明许多用户都为动漫的结束发表感慨。

4 总结

因为绘制热词云图的代码运行太久了,所以本实验的词云图只截取了某些天的弹幕,或许可以引入多线程使程序效率更高。因为B站的网页是动态的,当时做爬虫的时候准备用webdriver,无奈环境搞不会,放弃了。本项目还是有许多缺陷的,当时做的时候借鉴了一篇博客,又把它给改进了一下,然后才实现出了该项目。(大三上python数据分析大作业,本人很菜,不完全原创,内有许多不足。)

上传的附件 cloud_download Spider_Bilibili.py ( 3.69kb, 128次下载 ) cloud_download Analysis_Barrage2.py ( 8.30kb, 98次下载 )
error_outline 下载需要3点积分

keyboard_arrow_left上一篇 : 基于Java的可自定义评教系统设计与实现 基于JSP的车险模拟系统的设计与实现 : 下一篇keyboard_arrow_right



都昌林总
2019-06-05 16:33:33
相关的数据链接:https://pan.baidu.com/s/1a1RpHG3rlOcSvEBnhmhHnw 提取码:5ny5
PANQIAN
2019-08-26 15:55:34
你好,我想问下,运行第一个爬取得程序爬取到的内容没存到CSV文件里怎么办
PANQIAN
2019-08-28 14:57:15
你好,你用的python是哪个版本
PANQIAN
2019-08-28 14:57:41
你好,请问你用的python是哪个版本呢?谢谢

发送私信

2
文章数
3
评论数
最近文章
eject