原创不易,本文禁止抄袭、转载,违权必究!

目录

  • 一、EDG夺冠信息
  • 二、实战目标
    • 2.1 网络爬虫
    • 2.2 数据可视化(词云图)
    • 2.3 自然语言处理(情感分析)
  • 三、bilibili接口分析
  • 四、编码
    • 4.1 爬取数据
    • 4.2 数据可视化(词云图)
  • 五、自然语言处理(NLP)
    • 5.1 数据导入
    • 5.2 数据预处理
    • 5.3 情感分析
    • 5.4 情感分析直方图
    • 5.5 关键词提取
    • 5.6 积极弹幕与消极弹幕
    • 5.7 饼图分析
    • 5.8 消极弹幕分析
  • 六、总结
  • 七、完整项目下载
  • 八、作者Info

一、EDG夺冠信息

11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目:

1、微博热搜第一名,截止2021-11-10已有亿级观看量,微博粉丝数到达638.4万

2、哔哩哔哩已有几亿人气,总弹幕有22.3万,全站排行榜最高第2名,B站粉丝已有219.9万

3、腾讯爱奇艺优酷等视频平台800万人看过

4、虎牙等直播平台热度也是居高不下

5、央视新闻也发微博庆祝EDG夺冠


既然比赛热度这么高,那么本次我们就以bilibili为基准,通过采集EDG夺冠比赛视频在哔哩哔哩的3万条弹幕数据,再通过Python来分析进而感受粉丝的热情

二、实战目标

2.1 网络爬虫

利用爬虫技术抓取EDG战队在B站夺冠比赛视频的3万条弹幕数据

2.2 数据可视化(词云图)

通过jieba、numpy等Python库对抓取来的弹幕数据进行分析并且可视化

2.3 自然语言处理(情感分析)

利用pandas+自然语言处理(NLP)等对EDG夺冠比赛视频的3万条弹幕数据进行情感分析,根据分析结果得出一些结论


三、bilibili接口分析

首先进入EDG夺冠比赛视频URL:
https://www.bilibili.com/video/BV1EP4y1j7kV?p=1

哔哩哔哩已为大家整理好了EDG比赛视频,从开幕式到夺冠时刻,共有7个视频

哔哩哔哩弹幕数据接口:

http://api.bilibili.com/x/v1/dm/list.so?oid=XXX

这个接口就是B站弹幕数据专用接口,我们可以直接拿来用,这个接口中的oid可以理解为每个视频中的唯一标识符,它由数字组成,每一个视频都有唯一的一个oid,那么我们只要找到oid就可以请求相应比赛视频弹幕的API接口,从而抓取弹幕数据

获取oid
打开开发者工具,切换到Network选项,然后找到以pagelist为开头的请求接口

接着找到Request URL这个请求接口,打开新窗口直接用这个API接口请求,如下图:

当我们直接请求这个API接口时可以看到JSON格式的数据,而在里面的cid就是我们需要的oid,如下所示:

{"code":0,"message":"0","ttl":1,"data":[{"cid":437586584,"page":1,"from":"vupload","part":"第一局 4K","duration":2952,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437626309,"page":2,"from":"vupload","part":"第二局 4K","duration":3031,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437659159,"page":3,"from":"vupload","part":"第三局 4K","duration":3406,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437727348,"page":4,"from":"vupload","part":"第四局 4K","duration":3212,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437729555,"page":5,"from":"vupload","part":"第五局 4K","duration":3478,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437550300,"page":6,"from":"vupload","part":"开幕式","duration":984,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437717574,"page":7,"from":"vupload","part":"夺冠时刻","duration":2017,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}}]

当然我们也可以点击**Preview**选项,点击data,打开数据,而里面的JSON数据是**折叠**的,包括cid在内,如下图所示:


可以看到,每个cid对应每一个比赛视频。我们也可以点击Response选项,里面的数据是真实的数据,意味着数据没有经过折叠,与直接请求Request URL返回的JSON数据是一样的

四、编码

4.1 爬取数据

定义一个获取cid的方法

import requests
import jsondef get_cid():url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'try:response = requests.get(url,timeout=None)if response is not None:return response.textelse:return Nnoneexcept Exception as e:print(e.args)if __name__ == '__main__':data = get_cid()json_data = json.loads(data)for cid_datas in json_data['data']:cid = cid_datas.get('cid')print(cid)

控制台输出如下:


拼接URL弹幕数据API接口

if __name__ == '__main__':data = get_cid()json_data = json.loads(data)base_api = 'http://api.bilibili.com/x/v1/dm/list.so?oid='for cid_datas in json_data['data']:cid = cid_datas.get('cid')detail_api = base_api + str(cid)print(detail_api)

控制台输出如下:

一共有7个网址,对应7个EDG比赛视频的弹幕数据,我们点开第一个网址查看

抓取弹幕数据
从上一张图可以看到,每一条弹幕数据都在每一个标签中,面对这种格式我们思考一下用哪种解析工具比较合适?答案当然是正则表达式,接下来我们要获取7个比赛视频的22.3万条数据,代码如下:

base_api = 'http://api.bilibili.com/x/v1/dm/list.so?oid='all_api = []for cid_datas in json_data['data']:cid = cid_datas.get('cid')detail_api = base_api + str(cid)all_api.append(detail_api)for api in all_api:edg_datas = get_api_data(detail_api)edg_datas = re.findall('<d.*?>(.*?)</d>',edg_datas,re.S)with open('EDG.txt','a',encoding='utf-8') as f:for edg_data in edg_datas:print(edg_data)f.write(edg_data + '\n')

避免乱码,加上如下代码:

 response.encoding = chardet.detect(response.content)['encoding']

控制台输出如下:

由于弹幕数据共有3万条,这里仅展示EDG.txt部分弹幕数据,如下图所示:

4.2 数据可视化(词云图)

我们已经抓取到弹幕数据,接下来利用EDG背景图做一个词云图

代码如下:

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as npdef do_wordcloud():text = open('EDG.txt','r',encoding='utf-8').read()text = text.replace('\n','').replace('\u3000','')text_cut = jieba.lcut(text)text_cut = ' '.join(text_cut)#过滤一些没有关系的词stop_words = ['“',',',' ','我','的','是','了',':','?','!','啊','你','吗','。','我们']background = Image.open("EDG.jpg")graph = np.array(background)word_cloud = WordCloud(font_path='simsun.ttc',background_color='white',mask=graph, # 指定词云的形状stopwords=stop_words)word_cloud.generate(text_cut)plt.subplots(figsize=(12,8))plt.imshow(word_cloud)plt.axis('off')plt.show()word_cloud.to_file('edg.png')

控制台输出如下:

迪迦奥特曼背景图片也制作一波吧,啊哈哈哈!

制作成迪迦奥特曼词云图形状,如下所示:

五、自然语言处理(NLP)

5.1 数据导入

data = pd.read_csv('EDG.csv')
data = data.head()
print(data)

控制台输出如下:

5.2 数据预处理

data = pd.read_csv('EDG.csv')
data = data[['id','content']]
data = data.head(10)
print(data)

控制台输出如下:

5.3 情感分析

先安装一下用于情感分析的Python库:

pip install snownlp -i https://pypi.doubanio.com/simple

效果如下:

情感分析
由于数据过大,这里仅看部分

from snownlp import SnowNLP
data1['emotion'] = data1['content'].apply(lambda x:SnowNLP(x).sentiments)
data1 = data1.head()
print(data1)

控制台输出:

情感数据描述

data1 = data1.describe()

控制台输出:

数据说明:emotion的平均值为0.63,中位数为0.67,25%分位数为0.49,可见不到25%的数据造成了整体均值的较大下移。另外上图的最下面可以看到,情感分析执行时间为48.8s,数据量还是挺大的。

5.4 情感分析直方图

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsebins = np.arange(0,1.1,0.1)   #设置区间
plt.hist(data1['emotion'],bins,color='#4F94CD',alpha=0.9)
plt.xlim(0,1)
plt.xlabel('情感分析')
plt.ylabel('数量')
plt.title('情感分析直方图')
plt.show()

控制台输出:

数据说明:

  • 由直方图可见,弹幕情感呈逐渐上升的趋势,说明粉丝对EDG夺冠情绪逐渐兴奋,很激动;
  • 近3万条弹幕数据中有约4500条弹幕情感分在[0.5,0.6区间内;同时,有约4800条弹幕情感分在[0.8,0.9]区间内,这个区间粉丝的情绪最亢奋,估计是夺冠时刻,哈哈哈!
  • 从区间[0.5,0.6]过渡到[0.6,0.7]以及从区间[0.8,0.9]过渡到[0.9,1.0]弹幕情绪出现下降,可能是因为在比赛中出现一些问题或者是比赛落幕了

5.5 关键词提取

from jieba import analysekey_words = analyse.extract_tags(sentence=text_cut,topK=10,withWeight=True,allowPOS=())
print(key_words)

控制台输出:

数据说明:

  • 以上关键词显示,粉丝发的弹幕中“冠军”是最多的,然后是“翻译”,”我们”,“卧槽”,“小姐姐”,“EDG”,“泪目“,”圣枪哥“,”贺电“,”edg“,由此看来,EDG真的很受欢迎,翻译小姐姐也挺受欢迎的。这在上面的词云图中也可以看得出来

参数说明:

  • sentence是需要提取的字符串,必须是str类型,不能是list
  • topK表示提取前多少个关键字
  • withWeight表示是否返回每个关键词的权重
  • allowPOS表示允许提取的词性,默认提取地名(ns)、名词(n)、动名词(vn)、动词(v)

5.6 积极弹幕与消极弹幕

计算积极弹幕与消极弹幕各自的数目:

pos,neg = 0,0
for  i in data1['emotion']:if i >= 0.5:pos += 1else:neg += 1
print(f'积极弹幕数据为:{pos}' + '\n' + f'消极弹幕数据为:{neg}')

控制台输出:

积极弹幕数据为:17941
消极弹幕数据为:6054

5.7 饼图分析

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsepie_labels = 'positive','negative'
plt.pie([pos,neg],labels=pie_labels,autopct='%1.2f%%',shadow=True)plt.show()

控制台输出:

由上图可见,由74.77%的弹幕数据是积极的,有25.23%的弹幕数据是消极的,总体来看,积极弹幕还是比较多的

5.8 消极弹幕分析

取出部分消极弹幕数据

data2 = data1[data1['emotion'] < 0.5]
data2 = data2.head()
print(data2)

控制台输出:

数据说明:

  • 上图中的“回血”,“求生欲”等消极弹幕有可能是EDG战队或者韩国队比赛不佳造成的

六、总结

PIL库
jieba库
numpy库
pandas库
requests库
wordcloud库
matplotlib库
json,re,chardet库
snownlp情感分析库

七、完整项目下载

本人博客园原文链接:阅读原文
完整项目下载链接:下载
本人原创公众号原文链接:阅读原文

原创不易,如果觉得有趣好玩,希望可以随手点个赞,拜谢各位老铁!

最近发现CSDN上好多人抄袭本人博客,还比我热度高,哎!毕竟是10月份才刚刚开始写博客,虽然是18年创建的账号,知名度和粉丝没有别人高啊!

八、作者Info

作者:小鸿的摸鱼日常,Goal:让编程更有趣!

原创微信公众号:『小鸿星空科技』,专注于算法、爬虫,网站,游戏开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!

转载说明:务必注明来源(注明:来源于公众号:小鸿星空科技, 作者:小鸿的摸鱼日常)

EDG夺冠,用爬虫+数据分析+自然语言处理(情感分析)+数据可视化分析3万条数据:粉丝都疯了(唯一原创)相关推荐

  1. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据

    又是一年双十一了,不知道从什么时候开始,双十一从"光棍节"变成了"双十一购物狂欢节",最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻 ...

  2. 【爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】

    [爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩] https://b23.tv/TIoy6hj

  3. 知乎爬虫与数据分析(二)pandas+pyecharts数据可视化分析篇(上)

    注:代码完整版可移步Github--https://github.com/florakl/zhihu_spider. 知乎爬虫与数据分析(一)数据爬取篇 知乎爬虫与数据分析(三)pandas+pyec ...

  4. 【【数据可视化毕业设计:差旅数据可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】-哔哩哔哩】 https://b23.tv/iTt30QG

    [[数据可视化毕业设计:差旅数据可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩]-哔哩哔哩] https://b23.tv/iTt30QG ht ...

  5. python爬虫数据可视化软件_python爬虫及数据可视化分析

    1.前言 本篇文章主要介绍python爬虫及对爬取的数据进行可视化分析,本次介绍所用的网站是(https://www.duanwenxue.com/jingdian/zheli/) 2.数据爬取 2. ...

  6. Python爬虫以及数据可视化分析!

    简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 源码文件可以参考Github上传的项目:https://github.com/Lemon-Sheep/Py/tree/maste ...

  7. 网易云音乐爬虫 数据可视化分析

    网易云音乐爬虫 & 数据可视化分析 1. 数据爬取 1.1 评论爬取 1.2 用户信息爬取 2 数据清洗 & 可视化 歌评文本分析 个人博客:Archiew's blog 源码:htt ...

  8. python爬虫可视化excel_Python爬虫以及数据可视化分析!

    简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 下面,我们开始吧! PS: 作为Python爬虫初学者,如有不正确的地方,望各路大神不吝赐教[抱拳] 本项目将会对B站番剧排行的 ...

  9. Python爬虫以及数据可视化分析

    Python爬虫以及数据可视化分析之Bilibili动漫排行榜信息爬取分析 简书地址:https://www.jianshu.com/u/40ac87350697 简单几步,通过Python对B站番剧 ...

最新文章

  1. vue-cli3.0配置详解
  2. Rep Loss笔记
  3. 002_XMLHttpRequest对象
  4. JavaWEB_Tomcat安装与配置(J2EE Eclipse)
  5. 时频分析:短时傅里叶变换实现(2)
  6. 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址...
  7. Freeswitch的Proxy(代理转发)模式和Bypass(旁路)模式的正确配置
  8. 游戏应用快速审核上架
  9. 简书项目实战-main首页开发
  10. 文件锁(一)——文件锁的概述
  11. 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  12. java函数参数使用冒号_java8中:: 用法示例(JDK8双冒号用法)
  13. 人工智能为代表的新一轮科技革命和产业变革正在重构全球创新版图
  14. 哈工大csapp大作业报告
  15. 【开发心得】java轻量级rpc调用,springBoot集成jsonrpc4j使用
  16. 毕业设计-基于微信小程序的远程空调遥控系统
  17. MySQL优化之表分区
  18. 如何自己恢复丢失的文件丨迅龙数据恢复丨
  19. Word2003使用VBA教程
  20. 软件工程(C编码实践)学习总结——中国科学技术大学孟宁老师主讲!

热门文章

  1. 开源一个古诗词项目(收录了58万古诗词和3.8万古诗词作者)
  2. Fastjson 1.2.68版本Autotype绕过技巧
  3. 入手评测 OPPO Find X3 Pro火星探索版怎么样
  4. 《管理统计学》期末备考(不挂科)
  5. 计算机自适应测评(CAT)调研
  6. 仿陌陌选项卡:文字大小变化的SlidingScaleTabLayout
  7. 各位8090后,可以分享下真实收入吗
  8. C++基础知识(十)函数返回数组
  9. 卡尔曼滤波之基本概念和状态观测器
  10. 基于RT-Thread操作系统的 基础四轮组智能车设计与实践