cxa,有着丰富的爬虫工作经验,公众号Python学习开发,擅长各种爬虫技术,熟悉大规模爬虫开发。热爱并喜欢钻研python。

改革春风吹满地,中国人民真争气。


2018年年末,“改革春风吹满地”火了。这是一个来自哔哩哔哩的一个鬼畜类音乐视频。
由up主小可儿上传,目前播放量已达到1400多万,有着相当高的热度。该视频剪辑了赵本山的历年作品的经典台词,配以略带喜感的音乐(bgm由其他up主制作),每一句台词衔接的相当完美。在网易云音乐里也可以搜到同名音乐,另有别名「念诗之王」,网易云音乐的一位名为A96ccA的这样听众评论道:

第一遍:这是啥玩意?
第二遍:嗯,还可以
第三遍:改革春风吹满地…

可以看出同样的是一首洗脑的音乐。
下面让我先来欣赏(再度洗脑)一下。

下面就让我们爬取b站上该视频的评论内容,并进行分析为什么这个视频会如此的火。

数据下载

首先我们打开视频:https://www.bilibili.com/video/av19390801.
然后找到评论部分,打开谷歌浏览器的控制台,查看network选项的请求信息。通过观察我们发现了这样的链接https://api.bilibili.com/x/v2/reply?callback=jQuery17204794190151297566_1546432727230&jsonp=jsonp&pn=1&type=1&oid=19390801&sort=0&_=1546432740370

去掉没有用的信息最后我们得到最终的url形式为https://api.bilibili.com/x/v2/reply?pn={pn}&type=1&oid=19390801

其中pn为第几页,目前看到评论有1129页,这些数据我们用作简单的数据分析基本够用了。

下面就可以编写我们的代码了,这里我采取的是异步网络请求模块aiohttp。然后保存下了每条评论的所以网页可以得到的信息,后期获取每条评论的内容,为后面数据分析使用


下面是主要爬取逻辑

base_url = "https://api.bilibili.com/x/v2/reply?pn={pn}&type=1&oid=19390801"

async def fetch(url):
   async with sem: #并发个数控制
       async with aiohttp.ClientSession() as session: #创建session
           with async_timeout.timeout(10): #等10s
               async with session.get(url) as res:
                   data = await res.json()#通过await获取异步过程中的数据
                   print(data)
                   await asyncio.sleep(2)#加个异步等待防止被封。
                   await save_data(glom.glom(data, "data.replies"))#glom模块json数据解析用。

这里需要用到以下模块,使用pip install即可安装

aiohttp
async_timeout
uvloop(windows就不用了,只支持unix系统)
glom

需要说明的是之前我就是因为没有加等待时间,所以被b站这个接口的链接给封了,造成的现象就是视频可以看但是评论是刷新不出来的,挺有意思的。关于aiohttp的使用方法。
到这里数据下载逻辑就完事了,下面是数据存储逻辑。

数据存储

因为上面的下载的结果是json格式,所以首先数据库就是mongodb,这里为了统一使用了异步mongo数据模块motor,一个基于事件循环的模块。
首先创建数据链接

class MotorBase:
   _db = {}
   _collection = {}

def __init__(self, loop=None):
       self.motor_uri = ''
       self.loop = loop or asyncio.get_event_loop()

def client(self, db):
       self.motor_uri = f"mongodb://localhost:27017/{db}"
       return AsyncIOMotorClient(self.motor_uri, io_loop=self.loop)

def get_db(self, db='weixin_use_data'):
       if db not in self._db:
           self._db[db] = self.client(db)[db]

return self._db[db]

这里使用模块有:

asyncio
motor

然后开始使用类似pymongo的方式插入数据,具体代码如下

async def save_data(items):
   mb = MotorBase().get_db('weixin_use_data') #获取链接对象,weixin_use_data是我的数据库名。
   for item in items:
       try:
           await mb.bilibili_comments.update_one({
               'rpid': item.get("rpid")},
               {'$set': item},
               upsert=True)#bilibili_comments是我的表名,update_one方法的作用是不存在就插入存在更新。
       except Exception as e:
           print("数据插入出错", e.args,"此时的item是",item)

然后通过执行这个事件循环,事件循环是这里所有异步的基础。

loop = asyncio.get_event_loop()#创建一个事件循环
loop.run_until_complete(get_data())#开始运行直到程序结束

数据解析

上面我们拿到了作出数据,但是数据都是json格式的,而且量很大,我们需要的只有评论内容,所以我们需要进一步对数据进行处理,同样的这里我也使用了文件读写异步模块aiofiles。

这部分代码量也很少,用法和open file差不多,多了些异步的形式而已。

首先读取mongo里的数据

async def get_data():
   mb = MotorBase().get_db('weixin_use_data')
   data=mb.bilibili_comments.find()
   return data

读取还是用的motor模块为了配合后面的文件读入使用。

async def m2f():
   data = await get_data()
   async for item in data:
       t = item.get("content").get("message").strip()
       fs = await aiofiles.open(pathlib.Path.joinpath(pathlib.Path.cwd().parent, "msg.txt"), 'a+')#pathlib路径拼接
       await fs.write(t)

到目前为止数据获取部分基本结束了,后面就是对上面的文本文件进行分析了。

数据分析

为了清晰的表达数据所带来的信息,对于评论信息,我们选用直观的方式--词云图

安装包

jieba
wordcloud
matplotlib

生成词云需要用的图

字体文件
mac中默认字体显示乱码,这里指定了别的字体msyhbd.ttf,网上随便搜了一个,windows可以或其他系统支持字体即可

停用词设置

经过分析大概设置了如下停用词:


哈哈
哈哈哈
xa0
一个
u3000
什么
视频
这个
up
看到
怎么
播放
真的
知道
已经
改革
春风
满地
鬼畜
抖音
现在
春晚
千万
助攻

停用词设置是为了去除一些没有意义的词,比如这个,那个之类的。或者当前文件的标题

代码如下

# -*- coding: utf-8 -*-
# @Time : 2019/1/2 7:52 PM
# @Author : cxa
# @File : cutword.py
# @Software: PyCharm
# coding=utf-8
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud

# 获取所有评论
comments = []
with open('msg.txt', mode='r', encoding='utf-8') as f:
   rows = f.readlines()
   for row in rows:
       comments.append(row)

# 设置分词
comment_after_split = jieba.cut(str(comments), cut_all=False)  #分词,cut_all=false
words = ' '.join(comment_after_split)  # 以空格进行拼接

# 设置屏蔽词
STOPWORDS = set(map(str.strip, open('stopwords').readlines()))
print(STOPWORDS)
# 导入背景图
bg_image = plt.imread('1.jpeg')
# 设置词云参数,参数分别表示:画布宽高、背景颜色、背景图形状、字体,屏蔽词、最大词的字体大小
wc = WordCloud(width=2024, height=1400, background_color='white', mask=bg_image,font_path='msyhbd.ttf',stopwords=STOPWORDS, max_font_size=400,
              random_state=50)

# 将分词后数据传入云图
wc.generate_from_text(words)
plt.imshow(wc)
plt.axis('off')  # 不显示坐标轴
plt.show()

# 保存结果到本地
wc.to_file('ggcfcmd.jpg')

最终结果


由此可以看出这视频最重要的还是洗脑,导致进来就出不去了,同样的也是追忆本山大叔多年来带给大家的无数快乐时光,总之洗脑就完事了。

为了方便大家的阅读代码,本文中所有涉及到的代码,已经传到https://github.com/muzico425/bilibilianalysis.git

或者点击阅读原文即可查看源码

改革春风吹满地~~~

推荐阅读

今日问题

人人自媒体的时代,你如何看待抖音、B站?

打卡格式:打卡第n天,答:...

为什么打卡?戳下面你就知道了!

21/天/养/一/个/好/习/惯

用Python分析本山大叔鬼畜视频为啥这么火相关推荐

  1. python制作鬼畜_用Python分析本山大叔鬼畜视频为啥这么火

    原标题:用Python分析本山大叔鬼畜视频为啥这么火 ♚ cxa,有着丰富的爬虫工作经验,公众号Python学习开发,擅长各种爬虫技术,熟悉大规模爬虫开发.热爱并喜欢钻研python. 改革春风吹满地 ...

  2. 如何用Python绘制圣诞树(极其鬼畜视频) - B站小视频

    如何用Python绘制圣诞树(极其鬼畜视频)

  3. 抗击肺炎,我们能做到的,就是别让爱隔离——python分析B站三个视频弹幕内容,云图数据。

    武汉是个美丽的城市,但这个城市现在生病了. "人之初,性本善" 美丽的武汉生病了,一场大病,有钱的人能捐钱,而我,一直陪着你们吧,武汉加油 ! 有人说"武汉人咋啥也吃&q ...

  4. 我们用Python分析了B站4万条数据评论,揭秘本山大叔《念诗之王》大热原因!...

    来源:恋习Python 本文约2000字,建议阅读10分钟. 我们通过Python大法通过获取B站:[春晚鬼畜]赵本山:我就是念诗之王!4万条数据评论,与大家一起看看其背后火起来的原因. 1990年本 ...

  5. python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...

    鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频? 前言 半个月前,后台有个小伙伴问我,如何将视频中的音频提取出来,并且将声音转成文字写入到 word 中,正好接下来的 ...

  6. python生成视频_成为视频分析专家:自动生成视频集锦(Python实现)

    介绍 我是个超级板球迷.从我记事起,我就迷上了这项运动,至今它仍在我的日常生活中起着重要的作用.我相信很多读到这篇文章的人都会点头! 但是自从我开始工作以来,要跟上所有的比赛就成了一件棘手的事.我不能 ...

  7. 成为视频分析专家:自动生成视频集锦(Python实现)

    介绍 我是个超级板球迷.从我记事起,我就迷上了这项运动,至今它仍在我的日常生活中起着重要的作用.我相信很多读到这篇文章的人都会点头! 但是自从我开始工作以来,要跟上所有的比赛就成了一件棘手的事.我不能 ...

  8. Python分析抖音用户行为数据,看看发什么样的视频才会爆!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python分析抖音用户行为数据视频讲解地址 https://www.bilibili.co ...

  9. python制作鬼畜_视频剪辑什么鬼?Python 带你高效创作短视频

    近两年,抖音.快手将短视频推到风口浪尖上,要生产出高质量的视频,离不开视频剪辑这一环节;在全民剪片浪潮中,大众使用最多的剪辑软件如:Pr.FCPX.剪印.Vue 等. 之前有两篇文章分别是实现了制作卡 ...

最新文章

  1. 计算机三级考试在线免费题库,国家三级计算机考试题库.docx
  2. BCH大区块导致中心化其实是伪命题
  3. 指针学习笔记(更新中)
  4. python-configparser生成ini配置文件
  5. zookeeper 密码_「附源码」Dubbo+Zookeeper 的 RPC 远程调用框架
  6. linux 下实现负载均衡群集(NAT方式)
  7. ChineseSemanticKB,面向中文处理的12类、百万规模的语义常用词库存
  8. linux vim 终端 行首 行尾_不会vi/vim,看这一篇足矣
  9. IOS开发--仿制网易新闻
  10. Component creation must be done on Event Dispatch Thread错误解决方法
  11. 计算机数学基础试卷及答案,2012计算机数学基础试题及答案.pdf
  12. 微信公众号使用:在微信公众号文章中嵌入小程序的方法
  13. Hunger Snake3
  14. ue4 点击某一物体触发事件_UE4引擎——姜小白修炼记(三)
  15. pythonopencv提取轮廓区域_Python + Opencv 实现轮廓提取,轮廓区域面积计算
  16. 「今日 GitHub 趋势」让全世界程序员体会中国的 12306 抢票狂潮
  17. MySql 中 PK、NN、UQ、BIN、UN、ZF、AI、G分别代表什么意思
  18. 计算机网络——数据链路层介质访问控制
  19. uni轮播图添加页数
  20. Scratch中基本演绎法小故事

热门文章

  1. 英特尔成立物联网视频事业部,这届IESS还揭露了哪些信息?
  2. 华为:HarmonyOS 即将开源!
  3. 中国安全态势越来越好,专访山石网科CSO蒋东毅 | 拟合
  4. 我佛了!用KNN实现验证码识别,又 Get 到一招!
  5. ​“手把手撕LeetCode题目,扒各种算法套路的裤子”
  6. DevOps火爆,招人却太难了!
  7. 15篇论文全面概览BERT压缩方法
  8. 10万人的1000万张图像,微软悄然删除最大公开人脸数据集
  9. Python如何爬取实时变化的WebSocket数据
  10. 有道翻译蛋的进阶:丁磊为其加冕称“王”