一肢娘、背景介紹
最近一段時(shí)間呈础,劉畊宏真是火出了天際,引起一股全民健身的熱潮橱健,畢竟鍛煉身體而钞,是個(gè)好事!
針對(duì)此熱門(mén)事件拘荡,我用Python的爬蟲(chóng)和情感分析技術(shù)笨忌,針對(duì)小破站的彈幕數(shù)據(jù),分析了眾多網(wǎng)友彈幕的輿論導(dǎo)向,下面我們來(lái)看一下官疲,是如何實(shí)現(xiàn)的分析過(guò)程。
二亮隙、代碼講解-爬蟲(chóng)部分
2.1 分析彈幕接口
首先分析B站彈幕接口途凫。
經(jīng)過(guò)分析,得到的彈幕地址有兩種:
第一種:http://comment.bilibili.com/{cid}.xml
第二種:https://api.bilibili.com/x/v1/dm/list.so?oid={cid}
這兩種返回的結(jié)果一致溢吻!但都不全维费,都是只有部分彈幕!
以B站視頻 https://www.bilibili.com/video/BV1Pa411v7vg 為例促王,查看網(wǎng)頁(yè)源代碼犀盟,可以找到對(duì)應(yīng)的cid為574147025,所以該視頻對(duì)應(yīng)的彈幕接口地址是:http://comment.bilibili.com/574147025.xml
既然這樣蝇狼,就好辦了阅畴,開(kāi)始擼代碼!
2.2 講解爬蟲(chóng)代碼
首先迅耘,導(dǎo)入需要用到的庫(kù):
import re # 正則表達(dá)式提取文本
import requests # 爬蟲(chóng)發(fā)送請(qǐng)求
from bs4 import BeautifulSoup as BS # 爬蟲(chóng)解析頁(yè)面
import time
import pandas as pd # 存入csv文件
import os
然后贱枣,向視頻地址發(fā)送請(qǐng)求,解析出cid號(hào):
r1 = requests.get(url=v_url, headers=headers)
html1 = r1.text
cid = re.findall('cid=(.*?)&aid=', html1)[0] # 獲取視頻對(duì)應(yīng)的cid號(hào)
print('該視頻的cid是:', cid)
根據(jù)cid號(hào)颤专,拼出xml接口地址纽哥,并再次發(fā)送請(qǐng)求:
danmu_url = 'http://comment.bilibili.com/{}.xml'.format(cid) # 彈幕地址
print('彈幕地址是:', danmu_url)
r2 = requests.get(danmu_url)
解析xml頁(yè)面:<d>標(biāo)簽的文本內(nèi)容為彈幕,<d>標(biāo)簽內(nèi)p屬性值(按逗號(hào)分隔)的第四個(gè)字段是時(shí)間戳:
soup = BS(html2, 'xml')
danmu_list = soup.find_all('d')
print('共爬取到{}條彈幕'.format(len(danmu_list)))
video_url_list = [] # 視頻地址
danmu_url_list = [] # 彈幕地址
time_list = [] # 彈幕時(shí)間
text_list = [] # 彈幕內(nèi)容
for d in danmu_list:
data_split = d['p'].split(',') # 按逗號(hào)分隔
temp_time = time.localtime(int(data_split[4])) # 轉(zhuǎn)換時(shí)間格式
danmu_time = time.strftime("%Y-%m-%d %H:%M:%S", temp_time)
video_url_list.append(v_url)
danmu_url_list.append(danmu_url)
time_list.append(danmu_time)
text_list.append(d.text)
print('{}:{}'.format(danmu_time, d.text))
保存時(shí)應(yīng)注意栖秕,為了避免多次寫(xiě)入csv標(biāo)題頭春塌,像這樣:這里,我寫(xiě)了一個(gè)處理邏輯簇捍,大家看注釋?zhuān)瑧?yīng)該能明白:
if os.path.exists(v_result_file): # 如果文件存在只壳,不需寫(xiě)入字段標(biāo)題
header = None
else: # 如果文件不存在,說(shuō)明是第一次新建文件垦写,需寫(xiě)入字段標(biāo)題
header = ['視頻地址', '彈幕地址', '彈幕時(shí)間', '彈幕內(nèi)容']
df.to_csv(v_result_file, encoding='utf_8_sig', mode='a+', index=False, header=header) # 數(shù)據(jù)保存到csv文件
需要注意的是吕世,encoding參數(shù)賦值為utf_8_sig,不然csv內(nèi)容可能會(huì)產(chǎn)生亂碼梯投,避免踩坑命辖!
三、代碼講解-情感分析部分
3.1 整體思路
針對(duì)情感分析需求分蓖,我主要做了三個(gè)步驟的分析工作:
用SnowNLP給彈幕內(nèi)容打標(biāo):積極尔艇、消極,并統(tǒng)計(jì)占比情況
用jieba.analyse分詞么鹤,并統(tǒng)計(jì)top10高頻詞
用WordCloud繪制詞云圖
首先终娃,導(dǎo)入csv數(shù)據(jù),并做數(shù)據(jù)清洗工作蒸甜,不再贅述棠耕。
下面余佛,正式進(jìn)入情感分析代碼部分:
3.2 情感分析打標(biāo)
情感分析計(jì)算得分值、分類(lèi)打標(biāo)窍荧,并畫(huà)出餅圖辉巡。
# 情感判定
for comment in v_cmt_list:
tag = ''
sentiments_score = SnowNLP(comment).sentiments
if sentiments_score < 0.5:
tag = '消極'
neg_count += 1
elif sentiments_score > 0.5:
tag = '積極'
pos_count += 1
else:
tag = '中性'
mid_count += 1
score_list.append(sentiments_score) # 得分值
tag_list.append(tag) # 判定結(jié)果
df['情感得分'] = score_list
df['分析結(jié)果'] = tag_list
這里,我設(shè)定情感得分值小于0.5為消極蕊退,大于0.5為積極郊楣,等于0.5為中性。(這個(gè)分界線(xiàn)瓤荔,沒(méi)有統(tǒng)一標(biāo)準(zhǔn)净蚤,根據(jù)數(shù)據(jù)分布情況和分析經(jīng)驗(yàn)自己設(shè)定分界線(xiàn)即可)
情感判定結(jié)果:畫(huà)出占比餅圖的代碼:
grp = df['分析結(jié)果'].value_counts()
print('正負(fù)面評(píng)論統(tǒng)計(jì):')
print(grp)
grp.plot.pie(y='分析結(jié)果', autopct='%.2f%%') # 畫(huà)餅圖
plt.title('劉畊宏彈幕_情感分布占比圖')
plt.savefig('劉畊宏彈幕_情感分布占比圖.png') # 保存圖片
餅圖結(jié)果:從占比結(jié)果來(lái)看,大部分網(wǎng)友還是很認(rèn)可劉畊宏的输硝。
3.3 統(tǒng)計(jì)top10高頻詞
代碼如下:
# 2今瀑、用jieba統(tǒng)計(jì)彈幕中的top10高頻詞
keywords_top10 = jieba.analyse.extract_tags(v_cmt_str, withWeight=True, topK=10)
print('top10關(guān)鍵詞及權(quán)重:')
pprint(keywords_top10)
這里需要注意,在調(diào)用jieba.analyse.extract_tags函數(shù)時(shí)腔丧,要導(dǎo)入的是import jieba.analyse 而不是 import jieba
統(tǒng)計(jì)結(jié)果為:(分為10組關(guān)鍵詞及其權(quán)重放椰,權(quán)重按倒序排序)3.4 繪制詞云圖
注意別踩坑:
想要通過(guò)原始圖片的形狀生成詞云圖,原始圖片一定要白色背景(實(shí)在沒(méi)有的話(huà)愉粤,PS修圖修一個(gè)吧)砾医,否則生成的是滿(mǎn)屏詞云!衣厘!
try:
stopwords = v_stopwords # 停用詞
backgroud_Image = np.array(Image.open('劉畊宏_背景圖.png')) # 讀取背景圖片
wc = WordCloud(
background_color="white", # 背景顏色
width=1500, # 圖寬
height=1200, # 圖高
max_words=1000, # 最多字?jǐn)?shù)
font_path='/System/Library/Fonts/SimHei.ttf', # 字體文件路徑如蚜,根據(jù)實(shí)際情況(Mac)替換
# font_path="C:\Windows\Fonts\simhei.ttf", # 字體文件路徑,根據(jù)實(shí)際情況(Windows)替換
stopwords=stopwords, # 停用詞
mask=backgroud_Image, # 背景圖片
)
jieba_text = " ".join(jieba.lcut(v_str)) # jieba分詞
wc.generate_from_text(jieba_text) # 生成詞云圖
wc.to_file(v_outfile) # 保存圖片文件
print('詞云文件保存成功:{}'.format(v_outfile))
except Exception as e:
print('make_wordcloud except: {}'.format(str(e)))
得到的詞云圖影暴,和原始背景圖對(duì)比一下:3.5 情感分析結(jié)論
- 打標(biāo)結(jié)果中错邦,積極和中性評(píng)價(jià)占約72%,遠(yuǎn)遠(yuǎn)大于消極評(píng)價(jià)型宙!
- top10關(guān)鍵詞統(tǒng)計(jì)結(jié)果中撬呢,"哈哈哈"、"打卡"妆兑、"加油"魂拦、"666"等好評(píng)詞匯占據(jù)多數(shù)!
- 詞云圖中搁嗓,"哈哈"芯勘、"打卡"、"厲害"腺逛、"加油"等好評(píng)詞看上去更大(詞頻高)荷愕!
綜上所述,經(jīng)分析"劉畊宏"相關(guān)彈幕,得出結(jié)論:
眾多網(wǎng)友對(duì)劉畊宏的評(píng)價(jià)都很高安疗,畢竟不但帶領(lǐng)全面健身這樣正能量的事抛杨,還是杰倫的好兄弟,誰(shuí)能不愛(ài)呢茂契!
給他點(diǎn)贊5啊!
四掉冶、同步演示視頻
演示代碼執(zhí)行過(guò)程:
https://www.zhihu.com/zvideo/1506383713600036864