改革春风吹满地,中国人民真争气。html
第一遍:这是啥玩意?
第二遍:嗯,还能够
第三遍:改革春风吹满地…
复制代码
能够看出一样的是一首洗脑的音乐。
下面让我先来欣赏(再度洗脑)一下。
视频地址:https://v.qq.com/x/page/n0806nqulao.html
下面就让咱们爬取b站上该视频的评论内容,并进行分析为何这个视频会如此的火。git
首先咱们找到视频: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。而后保存下了每条评论的因此网页能够获得的信息,后期获取每条评论的内容,为后面数据分析使用
github
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便可安装mongodb
aiohttp
async_timeout
uvloop(windows就不用了,只支持unix系统)
glom
复制代码
须要说明的是以前我就是由于没有加等待时间,因此被b站这个接口的连接给封了,形成的现象就是视频能够看可是评论是刷新不出来的,挺有意思的。关于aiohttp的使用方法,有兴趣的朋友能够看我以前写的文章:aiohttp地址放这。
到这里数据下载逻辑就完事了,下面是数据存储逻辑。数据库
由于上面的下载的结果是json格式,因此首先数据库就是mongodb,这里为了统一使用了异步mongo数据模块motor,一个基于事件循环的模块。
首先建立数据连接json
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]
复制代码
这里使用模块有:windows
asyncio
motor
复制代码
而后开始使用相似pymongo的方式插入数据,具体代码以下api
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里的数据bash
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
复制代码
生成词云须要用的图
哈
哈哈
哈哈哈
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