一、寫在前面
直播行業(yè)已經(jīng)火熱幾年了否彩,幾個大平臺也有了各自獨特的“彈幕文化”疯攒,不過現(xiàn)在很多平臺直播比賽時的彈幕都基本沒法看的,主要是因為網(wǎng)絡上的噴子還是挺多的列荔,尤其是在觀看比賽的時候敬尺,很多彈幕不是噴選手就是噴戰(zhàn)隊,如果看了這種彈幕贴浙,真是讓比賽減分不少砂吞。
但和別的平臺比起來,B 站的彈幕會好一些崎溃。正好現(xiàn)在是英雄聯(lián)盟的世界總決賽時間蜻直,也有不少人選擇在 B 站看比賽直播,那么大家在看直播的時候會發(fā)什么彈幕呢袁串?話不多說概而,這就用 Python 寫個爬蟲來爬取 B 站直播時的彈幕吧!
二囱修、爬取分析
首先打開?Bilibili赎瑰,然后找到英雄聯(lián)盟比賽的直播間:
我得到的直播間的鏈接為:https://live.bilibili.com/6?broadcast_type=0&visit_id=8abcmywu95s0#/,這個鏈接中的 broadcast_type 和 visit_id 是隨機生成的破镰,不過對我們的爬取也沒影響餐曼,只要找到直播間的鏈接就好了压储。
打開開發(fā)者工具,切換到 NetWork源譬,點選上 XHR集惋,在其中能找到一個請求:https://api.live.bilibili.com/ajax/msg。這個請求需要四個參數(shù)(roomid踩娘,csrf_token芋膘,csrf,visit_id)霸饲,其中 roomid 為直播間的 id,csrf_token 和 csrf 可以從瀏覽器上 copy臂拓,visit_id 為空厚脉。該請求返回的結果中包含十條彈幕信息,包括彈幕內(nèi)容胶惰、彈幕發(fā)送人昵稱等等傻工。所以要獲得更多彈幕內(nèi)容,我們只需要一直發(fā)送這個請求就 OK 了孵滞!
三中捆、爬取實現(xiàn)
通過前面的分析可以發(fā)現(xiàn)要爬取 B 站直播彈幕還是很輕松的,但是要得到大量彈幕可能就需要考慮使用多線程了坊饶。對于爬取到的彈幕泄伪,還要及時地保存下來,這里我選擇使用 MongoDB 數(shù)據(jù)庫來保存彈幕信息匿级。在爬取直播彈幕的時候蟋滴,我開了四個線程來爬取,開了兩個線程來解析和保存數(shù)據(jù)痘绎,線程之間使用隊列來處理數(shù)據(jù)津函。
這里建了兩個類 CrawlThread 和 ParseThread,CrawThread 是用于爬取彈幕的線程孤页,ParseThread 是用于解析和保存彈幕的線程尔苦,兩個類都繼承了 threading.Thread,并重寫了 run() 方法行施。下面是爬取彈幕的代碼內(nèi)容:
下面是解析和保存彈幕的代碼內(nèi)容允坚,主要是一直查詢隊列,如果隊列中有數(shù)據(jù)蛾号,就取出來進行解析和保存:
從比賽開始到比賽結束屋讶,總共爬取到了76530條彈幕,在 Robot 3T 中截圖如下:
四须教、生成詞云
彈幕信息已經(jīng)存好了皿渗,但是考慮到其中有很多表情等無用內(nèi)容斩芭,所以需要將這些內(nèi)容給清洗掉。清洗結束之后就能夠進行分詞操作了乐疆,這里我選擇用 jieba 庫來處理划乖,在使用 jieba 的時候,可以設置用戶詞典挤土,因為像選手 ID琴庵,英雄名稱這些內(nèi)容是會被分詞的,但設置用戶詞典之后就不會被分詞了仰美,設置方法如下:
jieba.load_userdict("userdict.txt")
userdict.txt 中保存了選手 ID迷殿,選手外號,英雄名稱等內(nèi)容咖杂,在設置了用戶詞典后庆寺,這些內(nèi)容在分詞的時候都不會被分開了。在分詞結束之后诉字,需要將那些長度為1的部分清除掉懦尝,然后將出現(xiàn)頻次高的內(nèi)容提取出來,這里用到了 collecttions 中的 Counter壤圃,利用 Counter 可以很方便地統(tǒng)計頻次陵霉。這一部分代碼內(nèi)容如下:
? 在進行完上述操作之后,就可以使用 wordcloud 這個庫來生成詞云了伍绳,生成詞云時可以設置停止詞和字體踊挠,這一部分的代碼如下:
? 最終生成的詞云圖為:
可以看到很多人都在討論 faker 的,李哥還是李哥啊冲杀,李哥的瑞茲也是強的不行止毕,也有不少彈幕在說天使和加里奧的問題,不得不說漠趁,小虎小明的發(fā)揮是有問題的扁凛,此外還有一些說噴子的,看來 B 站的噴子也不少啊闯传。
另外想要成為一個優(yōu)秀的谨朝、有能力程序員,做軟件開發(fā)的話甥绿,就來學習python吧字币,而且學習編程的話有一個學習的氛圍跟交流圈子特別重要!這里我推薦一個python交流扣裙共缕,--先6115洗出;后30101,不管你是大牛還是小白图谷,大家都一起成長進步翩活。