
兄弟們,我們是冠軍,EDG是S11世界總冠軍!
世界上沒有無法征服的高峰,只有永不退縮一往無前的騎士!
真的,我賽前的心理預(yù)期非常低,我一直想的是EDG能贏一局就好,贏兩局血賺,結(jié)果一路打到第五局的時(shí)候,我心理已經(jīng)就一個(gè)詞:冠軍。
整個(gè)比賽過程深受全網(wǎng)關(guān)注:
微博熱搜第一名,顯示有8194萬觀看;
bilibili平臺(tái),吸引3.5億人氣,滿屏彈幕;
騰訊視頻600萬人看過;
斗魚和虎牙平臺(tái)的熱度也是居高不下;
賽后,央視新聞也發(fā)微博祝賀EDG戰(zhàn)隊(duì)奪冠;
既然比賽熱度這么高,那大家都說了點(diǎn)啥?
我們用Python分析了31000條彈幕數(shù)據(jù),滿屏都是粉絲的祝福與感受。
首先我們打開B站熱門排行榜,我們先來分析網(wǎng)頁,找到評論數(shù)據(jù)所在地方。
目標(biāo)獲取
我們此次獲取的目標(biāo)是EDG我們是冠軍視頻的60000+評論

網(wǎng)頁分析
首先我們F12找到如下評論數(shù)據(jù)
觀察發(fā)現(xiàn),我們所有爬取的評論信息全在在一個(gè)不規(guī)則的json文件當(dāng)中
不規(guī)則是因?yàn)榍懊娑嗔艘淮甹Query的字符串,后面多了一個(gè)')'
正中內(nèi)容才是一個(gè)標(biāo)準(zhǔn)的json數(shù)據(jù)集。


發(fā)送請求
先來獲取單頁數(shù)據(jù),在此之前我們先要獲取瀏覽器headers信息,防止被網(wǎng)站反爬。

url?=f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_{1636423610452+?page}&jsonp=jsonp&next={page}&type=1&oid=336587753&mode=3&plat=1&_={time_thick}'
headers?=?{
"cookie":"b_ut=-1;?i-wanna-go-back=-1;?_uuid=19DF1EDB-20B7-FF74-A700-9DF415B2429530977infoc;?buvid3=AAD6C6C7-FB31-40E7-92EC-7A6A7ED3920C148814infoc;?sid=jzp2723t;?fingerprint=2e74a5bc11a3adec2616987dde475370;?buvid_fp=AAD6C6C7-FB31-40E7-92EC-7A6A7ED3920C148814infoc;?buvid_fp_plain=AAD6C6C7-FB31-40E7-92EC-7A6A7ED3920C148814infoc;?DedeUserID=434541726;?DedeUserID__ckMd5=448fda6ab5098e5e;?SESSDATA=1fe46ad7%2C1651971297%2Ceb583*b1;?bili_jct=5bcd45718996ac402a29c7f23110984d;?video_page_version=v_new_home_14;?blackside_state=1;?rpdid=|(u)YJlJmmu|0J'uYJYRummJm;?bp_t_offset_434541726=590903773845625600;?bp_video_offset_434541726=590903773845625600;?bsource=search_baidu;?innersign=1;?CURRENT_BLACKGAP=0;?CURRENT_FNVAL=80",
'referer':'https://www.bilibili.com/video/BV12R4y1E7kn?spm_id_from=333.934.0.0',
'user-agent':'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/93.0.4577.8?Safari/537.36'
}
resp?=?requests.get(url,?headers=headers)
ifresp.status_code?==?requests.codes.ok:
#?獲取resp響應(yīng)
text?=?resp.text
如我們所想,獲取到的數(shù)據(jù)就是不個(gè)不規(guī)則的json數(shù)據(jù),接下來我們將其轉(zhuǎn)換成標(biāo)準(zhǔn)版的json數(shù)據(jù)便于我們接下來獲取數(shù)據(jù)
如下我們得到了一個(gè)標(biāo)準(zhǔn)的json數(shù)據(jù)集,接下來就可以獲取我們的評論數(shù)據(jù)了
#?獲取resp響應(yīng)
text?=?resp.text[41:-1]
#?轉(zhuǎn)換json格式
json_data?=?json.loads(text)
ic(json_data)
'''
ic|?json_data:?{'code':?0,
'data':?{'assist':?0,
'blacklist':?0,
'callbacks':?None,
'cm':?{},
'cm_info':?{'ads':?None},
'config':?{'read_only':?False,
'show_del_log':?True,
'show_up_flag':?True,
'showadmin':?1,
'showentry':?1,
'showfloor':?0,
'showtopic':?1},
'control':?{'answer_guide_android_url':?'https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6',
'answer_guide_icon_url':?'http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png',
'answer_guide_ios_url':?'https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12',
'answer_guide_text':?'需要升級成為lv2會(huì)員后才可以評論,先去答題轉(zhuǎn)正吧!',
'bg_text':?'看看下面~來發(fā)評論吧',
'child_input_text':?'',
'giveup_input_text':?'不發(fā)沒關(guān)系,請繼續(xù)友善哦~',
'input_disable':?False,
'root_input_text':?'發(fā)一條友善的評論',
'show_text':?'',
'show_type':?1,
'web_selection':?False},
'''
我們此次要獲取的數(shù)據(jù)有如下五個(gè),評論作者、性別、時(shí)間、評論點(diǎn)贊人數(shù)和評論內(nèi)容
#?獲取所有評論
datas?=?json_data['data']['replies']
foritemindatas:
#?評論者
name?=?item['member']['uname']
#?性別
sex?=?item['member']['sex']
#?評論時(shí)間
ctime?=?item.get('ctime')
content_time?=?time.strftime('%Y-%m-%d?%H:%M',?time.localtime(ctime))
#?點(diǎn)贊人數(shù)
star?=?item['like']
#?評論內(nèi)容
cmts?=?item['content']['message']
數(shù)據(jù)存儲(chǔ)
我們后續(xù)還要對數(shù)據(jù)進(jìn)行清洗處理然后可視化分析,所以這里我們使用openpyxl將數(shù)據(jù)存儲(chǔ)在excel中。
這個(gè)應(yīng)該都是老生常談了,畢竟之前我們經(jīng)常都是將數(shù)據(jù)存儲(chǔ)在excel中,
直接看代碼
ws?=?op.Workbook()
wb?=?ws.create_sheet(index=0)
wb.cell(row=1,?column=1,?value='評論者')
wb.cell(row=1,?column=2,?value='性別')
wb.cell(row=1,?column=3,?value='評論時(shí)間')
wb.cell(row=1,?column=4,?value='點(diǎn)贊人數(shù)')
wb.cell(row=1,?column=5,?value='評論內(nèi)容')
count?=2
wb.cell(row=count,?column=1,?value=name)
wb.cell(row=count,?column=2,?value=sex)
wb.cell(row=count,?column=3,?value=content_time)
wb.cell(row=count,?column=4,?value=star)
wb.cell(row=count,?column=5,?value=cmts)
count?+=1
ws.save('嗶哩嗶哩.xlsx')
效果如下:

多頁獲取
單頁數(shù)據(jù)獲取完畢,接下來我們分析多頁數(shù)據(jù)。你們呢一般是如何分析的?
我是直接獲取多個(gè)url進(jìn)行對比查找規(guī)律
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610452&jsonp=jsonp&next=0&type=1&oid=336587753&mode=3&plat=1&_=1636423611589
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610453&jsonp=jsonp&next=2&type=1&oid=336587753&mode=3&plat=1&_=1636424178396
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610454&jsonp=jsonp&next=3&type=1&oid=336587753&mode=3&plat=1&_=1636424183583
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610455&jsonp=jsonp&next=4&type=1&oid=336587753&mode=3&plat=1&_=1636424187787
規(guī)律如下:
規(guī)律找到了所以我們構(gòu)造多頁鏈接如下,先獲取它個(gè)100頁~
forpageinrange(1,100+1):
print(f'-----------------正在爬取第{page}頁數(shù)據(jù)-----------------')
time_thick?=?int(time.time()?*1000)
url?=f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_{1636423610452+?page}&jsonp=jsonp&next={page}&type=1&oid=336587753&mode=3&plat=1&_={time_thick}'
100頁數(shù)據(jù)已經(jīng)成功存儲(chǔ)到excel中,如下:


數(shù)據(jù)預(yù)處理
我們先對評論數(shù)據(jù)先做清洗處理。
去重去空,然后隨機(jī)抽樣五條數(shù)據(jù)進(jìn)行展示
#?讀取數(shù)據(jù)
rcv_data?=?pd.read_excel('嗶哩嗶哩.xlsx')
#?刪除重復(fù)記錄和缺失值
rcv_data?=?rcv_data.drop_duplicates()
rcv_data?=?rcv_data.dropna()
#?抽樣展示
print(rcv_data.sample(5))
'''
評論者??性別??????????????評論時(shí)間???點(diǎn)贊人數(shù)???????????????????????????????????????????????評論內(nèi)容
9?????Doctor羅洛洛??保密??2021-11-07?10:44??10832?????????恭喜,尋思啥呢,趕緊把麥克風(fēng)給大伙放出來?兄弟萌送我上去,點(diǎn)贊里抽兩個(gè)冠軍皮膚記住我
820??變成光守護(hù)嘉然的貢品??保密??2021-11-07?02:32????157??路人差不多得了,求各位在宿舍的大爺們,大娘們,別亂叫了,有些淀粉要睡覺,有些不敢看直播的老淀...
960?????????華為云??保密??2021-11-08?00:22??????5??????????????????????????????????熱詞系列我們是冠軍熱詞系列燃起來了
923?????嘉然今天吃華為??保密??2021-11-07?16:09??????5?????????????????????????????????????????點(diǎn)贊抽一個(gè)送我大會(huì)員
849 ?我的小魚你睡著了對吧???女? 2021-11-07 02:13 ?? 225 ?那一年的總決賽是對,最終比分31。當(dāng)時(shí)我看見坐在椅子上笑得合不攏嘴,那一刻我就在想如果我能對...
'''
詞頻展示
我們從評論數(shù)據(jù)中獲取到前十大高頻詞匯如下:
#?詞頻設(shè)置
all_words?=?[wordforwordinresult.split('?')iflen(word)?>1andwordnotinstop_words]
wordcount?=?Counter(all_words).most_common(10)
x1_data,?y1_data?=?list(zip(*wordcount))
print(x1_data)
print(y1_data)
'''
('冠軍',?'點(diǎn)贊',?'中國',?'人送',?'年度',?'奪冠',?'關(guān)注',?'評論',?'個(gè)人',?'多少')
(749,?687,?470,?315,?254,?220,?151,?149,?141,?123)
'''
分別使用氣泡圖、樹狀圖、餅圖、突出顯示表和折線圖分別來可視化。

詞云展示
接下來我們使用stylecloud來生成多樣形式的詞云
wordlist?=?jieba.cut(''.join(c_title))
result?='?'.join(wordlist)
pic?='img1.jpg'
gen_stylecloud(text=result,
icon_name='fab?fa-windows',
font_path='msyh.ttc',
background_color='white',
output_name=pic,
)
print('繪圖成功!')

1. 本文詳細(xì)介紹了如何使用python獲取B站評論信息并且存儲(chǔ)處理數(shù)據(jù)到最后的可視化
有興趣的讀者可以嘗試自己動(dòng)手練習(xí)一下。
2. 本文僅供讀者學(xué)習(xí)使用,不做其他用途!