改革春風吹滿地,中國人民真爭氣。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