爬一爬國(guó)王排名的彈幕
自從上期的推送用了波吉的封面,瀏覽量大增。想起很久之前一個(gè)叫Nick的老哥跟我說(shuō),內(nèi)容寫(xiě)的再好沒(méi)用,封面得吸引人,你放點(diǎn)好看的美女圖片,會(huì)增加很多點(diǎn)進(jìn)去的人。這會(huì)兒覺(jué)得很有道理。(標(biāo)題黨,UC震驚體的威力)這期趁熱打鐵,一期一會(huì),周更寫(xiě)起來(lái)。
看著國(guó)王排名的動(dòng)畫(huà),彈幕齊刷刷的都是淚目,這期就寫(xiě)一篇技術(shù)文檔,怎么抓取B站的彈幕。怎么制作詞云圖,怎么情感分析,放到后面再寫(xiě)。如果你python已經(jīng)入門(mén)或者對(duì)爬蟲(chóng)有興趣,就可以看下去。我們進(jìn)入正題。
二話不說(shuō),先貼兩個(gè)import。相信很多朋友都有這樣的體驗(yàn),學(xué)python,找對(duì)要用的庫(kù)就成功了一半。你去一搜,就會(huì)發(fā)現(xiàn),requests庫(kù)在爬蟲(chóng)請(qǐng)求庫(kù)中是最常用的。(完整的爬蟲(chóng)過(guò)程包括請(qǐng)求+解析+存儲(chǔ))這個(gè)庫(kù)封裝了urllib的一些方法,使用很方便。第二個(gè)庫(kù)re是用來(lái)解析爬取出來(lái)的結(jié)果,做一些數(shù)據(jù)清洗的。import requestsimport re
第二步就是找網(wǎng)址了,明確要爬什么。這里以B站為例,打開(kāi)B站,找到國(guó)王排名動(dòng)畫(huà),第二集是王子與卡克,這次就爬這集。(一打開(kāi)B站,然后就快樂(lè)的刷起劇和小姐姐的話,卒,爬蟲(chóng)教程到此結(jié)束)

建議打開(kāi)開(kāi)發(fā)者模式,谷歌瀏覽器中按F12即可,選項(xiàng)卡中選到network網(wǎng)絡(luò)這一項(xiàng)。補(bǔ)充一下,爬蟲(chóng)本質(zhì)上就是模擬人訪問(wèn)網(wǎng)站的操作,然后獲取感興趣的內(nèi)容,不需要人工一張一張保存,在找到規(guī)律后,程序代替你完成這個(gè)工作。谷歌的開(kāi)發(fā)者模式對(duì)于爬蟲(chóng)非常有用。
雖然我們已經(jīng)打開(kāi)了動(dòng)畫(huà)頁(yè)面,但是還需要找到彈幕在哪里。彈幕分兩種,一種是實(shí)時(shí)彈幕,一種是歷史彈幕。我們打開(kāi)彈幕列表,翻到最下面,有一個(gè)歷史彈幕。點(diǎn)擊這個(gè)按鈕的時(shí)候注意觀察下方的調(diào)試窗口。(可以先清除掉歷史的信息)

這一句就是爬蟲(chóng)請(qǐng)求的最低配版本(建議不要使用),方法是requests中的get,輸入是網(wǎng)址。新手爬蟲(chóng)特別容易被封IP,因?yàn)闉g覽器一眼就識(shí)別了你這個(gè)是腳本,不是人在操作,那怎樣和瀏覽器的操作更逼近呢?抄瀏覽器的請(qǐng)求。url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=428471132&date=2021-11-23'response = requests.get(url=url)print(response.text)

{"code":-101,"message":"賬號(hào)未登錄","ttl":1}接下來(lái)我們加上請(qǐng)求頭再試一次。
url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=428471132&date=2021-11-23'headers = {'cookie':'','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9'}response = requests.get(url=url,headers= headers)print(response.text)
Cookie請(qǐng)帶上自己的cookie,怎么自動(dòng)請(qǐng)求這個(gè)cookie后續(xù)再詳細(xì)介紹。# response.encoding = 'utf-8'這一句是想通過(guò)編碼解決一些字符亂碼問(wèn)題,但是沒(méi)有用,就注釋掉了。print(response.text),打印出文本內(nèi)容,還有一種方法是print(response.content),結(jié)果以16進(jìn)制展示。如果你的cookie填寫(xiě)沒(méi)問(wèn)題的,這會(huì)兒已經(jīng)可以看到有東西打印出來(lái)。

content_list = re.findall(':(.*?)@',response.text)for item in content_list:if ':' in item:item = item.split(':')[1]content = item[1:]with open('國(guó)王排名彈幕.txt',mode='a',encoding='utf-8') as f:print(content)f.write(content)f.write('\n')
第1行代碼:觀察彈幕可以看到,有效的內(nèi)容都在:和@之間,所以將這一部分保留,其他的去掉,注意re.findall的用法。第3,4行代碼:這一步篩選過(guò)后,大部分?jǐn)?shù)據(jù)已經(jīng)處理好了,有幾行特殊的彈幕有2個(gè)":",多了一部分無(wú)用信息,針對(duì)這部分?jǐn)?shù)據(jù),再使用split處理。(也可以使用re.sub)第5行代碼:因?yàn)樵冢汉竺孢€有一個(gè)多余的字符,所以我們?nèi)サ糇铋_(kāi)頭的一個(gè)內(nèi)容。第6-9行,就是把結(jié)果保存在一個(gè)text中,爬蟲(chóng)的數(shù)據(jù)存儲(chǔ)階段。
打開(kāi)“國(guó)王排名彈幕.txt”文件,就可以看到國(guó)王排名11月23日的歷史彈幕了。想要看其他日期的彈幕也一樣,替換掉網(wǎng)址里的日期就可以。

附上全部代碼,print為調(diào)試使用,可自行打開(kāi)。
import requestsimport re#查找歷史彈幕網(wǎng)站url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=428471132&date=2021-11-23'headers = {'cookie':'','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9'}response = requests.get(url=url,headers= headers)# response.encoding = 'utf-8'# print(response.text)#正則表達(dá)式提取出來(lái)的內(nèi)容是個(gè)列表content_list = re.findall(':(.*?)@',response.text)# print(content_list)for item in content_list:if ':' in item:item = item.split(':')[1]content = item[1:]with open('國(guó)王排名彈幕.txt',mode='a',encoding='utf-8') as f:# print(content)f.write(content)f.write('\n')
不到30行代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的功能。有了彈幕數(shù)據(jù)之后,可以做詞云圖,也可以做情感分析。且聽(tīng)下回分解。
