技術(shù)上碾壓對(duì)手
顏值上驚艷對(duì)手
中國(guó)奧運(yùn)健兒們真是又美又能打!
帶你一看
中國(guó)運(yùn)動(dòng)員顏值有多高
需求分析
網(wǎng)友們都在微博上說(shuō)了啥欲逃?
看這里
之氣那我們也有分析過(guò)B站的彈幕找蜜,有興趣的小伙伴可以看看這里
爬蟲B站彈幕| 考完試,這輩子稳析,這個(gè)班,基本是聚不齊了......
首先我們打開(kāi)B站找到我們要找的視頻弓叛。
F12打開(kāi)瀏覽器開(kāi)發(fā)者模式彰居,找到如下鏈接。
經(jīng)過(guò)測(cè)試發(fā)現(xiàn)撰筷,目前它是通過(guò)Js經(jīng)行渲染的陈惰,想通了這一點(diǎn),那就可以馬上去找接口了毕籽。
可以看到我們所有爬取的評(píng)論信息全在在一個(gè)不規(guī)則的json文件當(dāng)中
https://api.bilibili.com/x/v2/reply/main?callback=jQuery172011288135593018156_1627894496820&jsonp=jsonp&next=2&type=1&oid=674425220&mode=3&plat=1&_=1627894506606
https://api.bilibili.com/x/v2/reply/main?callback=jQuery172011288135593018156_1627894496821&jsonp=jsonp&next=3&type=1&oid=674425220&mode=3&plat=1&_=1627894508981
https://api.bilibili.com/x/v2/reply/main?callback=jQuery172011288135593018156_1627894496822&jsonp=jsonp&next=4&type=1&oid=674425220&mode=3&plat=1&_=1627894510667
https://api.bilibili.com/x/v2/reply/main?callback=jQuery172011288135593018156_1627894496823&jsonp=jsonp&next=5&type=1&oid=674425220&mode=3&plat=1&_=1627894567580
從上面的URL地址以及圖片抬闯,可以看出一共有8個(gè)查詢參數(shù)。
callback:每加載出一次便加1操作关筒。
next:每加載一次便加1操作溶握,next是從0開(kāi)始加載的。
_:13位的時(shí)間戳蒸播。
發(fā)送請(qǐng)求
我們首先模擬瀏覽器來(lái)發(fā)送請(qǐng)求獲取到這個(gè)json數(shù)據(jù)集睡榆,然后獲取具體的
評(píng)論者、行唄袍榆、評(píng)論時(shí)間胀屿、點(diǎn)贊人數(shù)和具體的評(píng)論內(nèi)容
url?=f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery172009047692616139114_{1627891325400+?page}&jsonp=jsonp&next={page}&type=1&oid=674425220&mode=3&plat=1&_={time_thick}'
headers?=?{
"cookie":"_uuid=BA408FD2-1B4E-DCB0-1CBE-71233AE9FB2918358infoc;?buvid3=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc;?sid=ld1hsb9h;?fingerprint=84acc3579a53d0eba78d769e71574df6;?buvid_fp=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc;?buvid_fp_plain=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc;?DedeUserID=434541726;?DedeUserID__ckMd5=448fda6ab5098e5e;?SESSDATA=40011147%2C1643348516%2Ce493c*81;?bili_jct=1d136ab44a600313299942bf8f6b8f95;?CURRENT_FNVAL=80;?blackside_state=1;?rpdid=|(u)YJR~R~)m0J'uYk~~mY~Y);?bsource=search_baidu;?PVID=1;?bfe_id=393becc67cde8e85697ff111d724b3c8",
'referer':'https://www.bilibili.com/video/BV1uU4y1H7wL',
'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)
ic(resp.text)
前面說(shuō)到我們獲取的這個(gè)json格式的數(shù)據(jù)集不是一個(gè)標(biāo)準(zhǔn)的json
就是因?yàn)榍懊娑嗔艘淮?/p>
‘jQuery172009047692616139114_1627891325400’
所以我們先將獲取到的數(shù)據(jù)集轉(zhuǎn)為標(biāo)準(zhǔn)的json格式。
如下:
#?獲取resp響應(yīng)
text?=?resp.text[42:-1]
#?轉(zhuǎn)換json格式
json_data?=?json.loads(text)
#?獲取所有評(píng)論
datas?=?json_data['data']['replies']
ic(datas)
接下來(lái)我們要獲取的就是那些評(píng)論信息等
foritemindatas:
#?評(píng)論者
name?=?item['member']['uname']
#?性別
sex?=?item['member']['sex']
#?評(píng)論時(shí)間
ctime?=?item.get('ctime')
content_time?=?time.strftime('%Y-%m-%d?%H:%M',?time.localtime(ctime))
#?點(diǎn)贊人數(shù)
star?=?item['like']
#?評(píng)論內(nèi)容
cmts?=?item['content']['message']
ic(name,?sex,?content_time,?star,?cmts)
實(shí)現(xiàn)翻頁(yè)爬取
在前面所描述的內(nèi)容包雀,都只是爬取一頁(yè)的數(shù)據(jù)宿崭,因此,接下來(lái)我要實(shí)現(xiàn)類于翻頁(yè)爬取的效果才写。
其實(shí)只要修改我上面所描述的3個(gè)查詢參數(shù)即可葡兑。
測(cè)試數(shù)據(jù)我們就先取200頁(yè)奴愉。
forpageinrange(1,200+1):
time_thick?=?int(time.time()?*1000)
url?=f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery172009047692616139114_{1627891325400+?page}&jsonp=jsonp&next={page}&type=1&oid=674425220&mode=3&plat=1&_={time_thick}'
保存數(shù)據(jù)
最后將爬取下來(lái)的數(shù)據(jù),使用openpyxl保存至Excel文件中铁孵,總共得到4000條測(cè)試數(shù)據(jù)锭硼。
數(shù)據(jù)處理
這里我們使用熊貓來(lái)讀取數(shù)據(jù),并去除空行
使用jieba制作分詞
rcv_data?=?pd.read_excel('嗶哩嗶哩.xlsx')
exist_col?=?rcv_data.dropna()#?刪除空行
c_title?=?exist_col['評(píng)論內(nèi)容'].tolist()
#?觀影評(píng)論詞云圖
wordlist?=?jieba.cut(''.join(c_title))
result?='?'.join(wordlist)
可視化
最后我們使用stylecloud來(lái)生成多樣形式的詞云
gen_stylecloud(text=result,
icon_name='fas?fa-table-tennis',
font_path='msyh.ttc',
background_color='white',
output_name=pic,
custom_stopwords=['啊','的','也','了','我','是','嗎','都','就','你','不','真的','有','這','沒(méi)有','他們','還有','說(shuō)','封面']
)
print('繪圖成功!')