python爬取bilibili弹幕_python爬虫:bilibili弹幕爬取+词云生成
如果你懶得看下邊的文字,我錄了一個完整的教學視頻在b站上。
我的B站教學:https://www.bilibili.com/video/av75377135?p=2
工作原理
b站是提供彈幕接口的,所以我們的整體操作進行如下:
1.到B站獲取cid2.將cid與網(wǎng)站固定格式進行鏈接3.用python請求網(wǎng)頁4.進行簡單的單詞處理5.生成詞云
接下來我們就按照剛才說的順序進行詳細解釋
操作順序
1.到B站獲取cid
首先點進一個視頻網(wǎng)頁,點擊F12-network獲取監(jiān)測頁面,然后一定要點擊播放視頻,我們就會在監(jiān)測頁面中看到一個叫heartbeat的XHR腳本,點開任意一個即可。
點擊之后我們需要看Headers,里邊包括了我們想知道的信息。往下滾動就會發(fā)現(xiàn)cid,這個id是唯一的,也就是說下次抓取的時候還可以用這個id。
2.將cid與網(wǎng)站固定格式進行鏈接
我們拿到cid之后就可以去檢查一下是否可以獲取彈幕了。獲取的固定xml格式是: https://comment.bilibili.com/視頻的cid.xml
例如在這里我們的頁面就是:
'https://comment.bilibili.com/94198756.xml'
我們把這個鏈接用網(wǎng)頁的方式打開,就能看到如下內容:
這樣我們就確定可以爬取了。
3.用python請求網(wǎng)頁
因為是開源的,我們也不需要設置代理agent什么的,直接獲取就行
import requestsfrom bs4 import BeautifulSoupurl= 'https://comment.bilibili.com/94198756.xml'request = requests.get(url)#獲取頁面request.encoding='utf8'#因為是中文,我們需要進行轉碼,否則出來的都是unicode
通過之前的網(wǎng)頁查看,我們發(fā)現(xiàn)彈幕的XML規(guī)律如下:
停車場反殺龍卷風
都是d開頭,所以我們只需要用beautifulsuop來選取所有的‘d’就可以
soup = BeautifulSoup(request.text, 'lxml')results = soup.find_all('d')#找出所有'd'comments = [comment.text for comment in results]#因為出來的時候是bs4格式的,我們需要把他轉化成list
這樣一個完整的彈幕list就已經(jīng)有了,這里要注意,b站彈幕提取上線是1000條,所以大于一千的就會隨機選取1000條彈幕給你。
4.進行簡單的單詞處理
拿到之后的彈幕并不能直接滿足我們進行單詞分析,我們要進行一些簡單的清理 (1)有一些英文我們需要統(tǒng)一大小寫
comments = [x.upper() for x in comments]#統(tǒng)一大小寫
(2)去掉彈幕中的空格 例:‘仙 人 指 路’ 和 ‘仙人指路’ 是沒有區(qū)別的
comments_clean = [comment.replace(' ','') for comment in comments]#去掉空格
(3)我們簡單的看一下彈幕之后發(fā)現(xiàn)彈幕里邊的’/test’是有很多,但是我們并不需要它,諸如此類:
set(comments_clean)#看一下都有啥類似的沒用的詞語useless_words = ['//TEST','/TESR','/TEST','/TEST/','/TEXT','/TEXTSUPREME','/TSET','/Y','\\TEST']comments_clean = [element for element in comments_clean if element not in useless_words]#去掉不想要的字符
進行完上述處理之后,我們就可以進行詞云的制作了。不過在制作之前,還是讓我們簡單的看一下詞頻。(不是最終的,因為一會要把句子里的詞分開)
import pandas as pdcipin = pd.DataFrame({'danmu':comments_clean})cipin['danmu'].value_counts()
(4)分詞 在這里我們把剛才得到的彈幕用jieba庫進行分詞
danmustr = ''.join(element for element in comments_clean)#把所有的彈幕都合并成一個字符串import jiebawords = list(jieba.cut(danmustr))#分詞
(5)進一步clean 分詞之后,我們會發(fā)現(xiàn)里邊有很多的符號或者是單字,這些是沒有意義的,我們要去掉這一些。
fnl_words = [word for word in words if len(word)>1]#去掉單字
5.生成詞云
至此我們可以通過詞詞頻來生成詞云了 首先我們要下載詞云的包
!pip install wordcloud
然后生成詞云
import wordcloudwc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)#設定詞云畫的大小字體,一定要設定字體,否則中文顯示不出來wc.generate(' '.join(fnl_words))
這樣就生成了,我們現(xiàn)在來看一下
from matplotlib import pyplot as pltplt.imshow(wc)
如果不滿意樣子的話是可以在wordcloud.WordCloud里邊調整的,例如可以調整畫布大小,隨機字體顏色區(qū)間,畫布背景等等。或者更傻的方式就是重新跑一下wc.generate(’ '.join(fnl_words))就可以出來新的圖片了
最后保存一下我們做好的圖片
wc.to_file(r"C:\Users\CCHANG\Desktop\danmu_pic.png")
順帶提一句,我們還可以拿一個圖片作為蒙版按形狀生成圖片。
我們需要先上傳一個圖片,把它做成numpy.array的形式。我們就自己畫一個圖吧,記住,上傳的圖片背景主題一定要對比鮮明
import cv2img = cv2.imread(r'C:\Users\CCHANG\Desktop\circle.png', cv2.IMREAD_UNCHANGED) #直接讀取成了數(shù)字格式resized = cv2.resize(img, (800, 800),interpolation = cv2.INTER_AREA)#我們把它重新設定一下大小
不過有的時候用cv2不是非常穩(wěn)定,所以我們還有另一種方法
from PIL import Imageimport numpy as npimg = Image.open(r'E:\錄屏\course3\mask.jpg')resized = np.array(img)
然后我們調整wordcloud里邊的一些設置,再生成一次
wc_1 = wordcloud.WordCloud(background_color='black',width=1000,height=800,mask=resized,font_path='simfang.ttf'# ,color_func = wordcloud.random_color_func())wc_1.generate_from_text(' '.join(fnl_words))#繪制圖片plt.imshow(wc_1)plt.axis('off')plt.figure()plt.show() #顯示圖片
最后就變成了這樣
記得保存哦~
wc_1.to_file(r'C:\Users\CCHANG\Desktop\danmu_pic_2.png')
記得如果看不懂就去看我的B站教學https://www.bilibili.com/video/av75377135?p=2
完整代碼
import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport jiebaimport wordcloudfrom matplotlib import pyplot as plturl= 'https://comment.bilibili.com/94198756.xml'request = requests.get(url)#獲取頁面request.encoding='utf8'#因為是中文,我們需要進行轉碼,否則出來的都是unicodesoup = BeautifulSoup(request.text, 'lxml')results = soup.find_all('d')#找出所有'd'comments =[comment.text for comment in results]#得到完整的listcomments = [x.upper() for x in comments]#統(tǒng)一大小寫comments_clean = [comment.replace(' ','') for comment in comments]#去掉空格set(comments_clean)#看一下都有啥類似的沒用的詞語useless_words = ['//TEST','/TESR','/TEST','/TEST/','/TEXT','/TEXTSUPREME','/TSET','/Y','\\TEST']comments_clean =[element for element in comments_clean if element not in useless_words]#去掉不想要的字符cipin = pd.DataFrame({'danmu':comments_clean})cipin['danmu'].value_counts()#查看詞頻danmustr = ''.join(element for element in comments_clean)#把所有的彈幕都合并成一個字符串words = list(jieba.cut(danmustr))#分詞fnl_words = [word for word in words if len(word)>1]#去掉單字wc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)#設定詞云畫的大小字體,一定要設定字體,否則中文顯示不出來wc.generate(' '.join(fnl_words))plt.imshow(wc)#看圖wc.to_file(r"C:\Users\CCHANG\Desktop\danmu_pic.png")#保存#######################################################加蒙板的圖片import cv2img = cv2.imread(r'C:\Users\CCHANG\Desktop\circle.png', cv2.IMREAD_UNCHANGED) #直接讀取成了數(shù)字格式resized = cv2.resize(img, (800, 800),interpolation = cv2.INTER_AREA)#我們把它重新設定一下大小#不過有的時候用cv2不是非常穩(wěn)定,所以我們還有另一種方法#from PIL import Image#import numpy as np#img = Image.open(r'E:\錄屏\course3\mask.jpg')#resized = np.array(img)wc_1 = wordcloud.WordCloud(background_color='black',width=1000,height=800,mask=resized,font_path='simfang.ttf'# ,color_func = wordcloud.random_color_func())wc_1.generate_from_text(' '.join(fnl_words))#繪制圖片plt.imshow(wc_1)plt.axis('off')plt.figure()plt.show() #顯示圖片wc_1.to_file(r'C:\Users\CCHANG\Desktop\danmu_pic_2.png')
作者:https://blog.csdn.net/johnchang0201/article/details/103004229
IT入門 感謝關注
總結
以上是生活随笔為你收集整理的python爬取bilibili弹幕_python爬虫:bilibili弹幕爬取+词云生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atitit r7 doc list
- 下一篇: 企业网络基本架构