python接收弹幕_闲着没事,尝试一下用Python爬取B站弹幕呀~
原標題:閑著沒事,嘗試一下用Python爬取B站彈幕呀~
前言
最近同學要做東西,需要用 B 站的視頻對應的彈幕數據做分析,于是請我幫忙爬取 B 站視頻的彈幕數據。
對于爬蟲而言,我們需要找到對應數據所在的接口,找到接口,就可以找到對應的數據。這個時候我們只需要簡單的調用 Python 庫進行爬取,輸出到文件即可。
目前針對 B 站彈幕爬取有兩種方法:
方法一:找到接口數據,編碼爬取
方法二:找到 BV號,調用API
這篇博客分別對兩種方法進行了整合介紹,并給出了詳細的操作流程。
尋找彈幕數據
其實 B 站是提供了彈幕接口的,B站把視頻對應的彈幕數據全部放在 xml 文件中,獲取的接口是
1、https: //comment.bilibili.com/視頻的cid.xml2、https: //api.bilibili.com/x/v1/dm/list.so?oid=視頻的cid
兩個接口目前都是可以正常使用的,第一個接口是老版本,第二個接口是新版本。
這里我們使用老版本接口,以視頻“刺客伍六七”為例子來演示,獲取視頻對應的 cid,使用的是谷歌瀏覽器。
第一步,到 B站打開對應視頻,比如“刺客伍六七”,進入視頻播放頁面(先不要點擊播放)。
第二步,按 F12 鍵,打開瀏覽器的控制臺,轉到 NetWork 部分。
第三步,點擊播放,注意觀察 NetWork 下面加載的文件,當看到名為 heartbeat 的 xhr 文件時,點擊暫停。
heartbeat 的里面記錄了該視頻的一些特有信息,比如 aid、cid、BVid 等等。一個的視頻特有信息都是固定的,比如一個視頻只有一個 cid。
第四步,點擊任意一個 heartbeat 文件,在 Headers 標簽頁中往下翻,就可以找到 cid 了。
第五步,將 cid 與對應的接口進行拼接,輸入在瀏覽器的地址欄進行查看。
這一步是為了熟悉對應彈幕數據的網頁結構,方便之后的編碼工作進行數據的提取。如果使用熟練的話則可以跳過此步。
編寫爬蟲
既然我們已經可以找到了彈幕數據所在的的地方,直接進行爬取即可。大致可以分為以下幾步:
獲取整個頁面
提取彈幕數據
簡單的數據預處理
輸出到文件
爬蟲編寫完成后,每次我們只需要修改文件名和 cid 就可以繼續爬取彈幕數據保存到文件中了。
importrequestsfrombs4 importBeautifulSoupimportpandas aspdimportre
# 彈幕保存文件file_name = '刺客伍六七第一集.csv'
# 獲取頁面cid = 47506569url = "https://comment.bilibili.com/"+ str(cid) + ".xml"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}request = requests.get(url=url, headers=headers)request.encoding = 'utf-8'
# 提取彈幕soup = BeautifulSoup(request.text, 'lxml')results = soup.find_all( 'd')
# 數據處理data = [data.text fordata inresults]# 正則去掉多余的空格和換行fori indata:i = re.sub( 's+', '', i)
# 查看數量print( "彈幕數量為:{}".format(len(data)))
# 輸出到文件df = pd.DataFrame(data)df.to_csv(file_name, index= False, header= None, encoding= "utf_8_sig")print( "寫入文件成功")
代碼說明:
B站目前還沒有針對爬蟲設置特別的反爬措施,因此可以直接爬取
彈幕數據絕大部分都是中文,一定要使用 utf-8 編碼
xml 文件中彈幕數據都在 d 標簽內,使用 BeautifulSoup 來提取所有的 d 標簽,再獲取標簽內的數據
彈幕數據可能會有多余的空格和換行,使用正則表達式進行處理
使用 Dataframe 將數據輸出到 csv 文件中。參數 index=False 不將索引序列保存到文本、header=None 不保存列名
爬蟲寫入文件的結果如下圖:
B站彈幕數量
這里不得不提一下 B 站的彈幕數量規則:
B站的彈幕池是有上限的,彈幕的具體數量和視頻的長度有所聯系。一般來講,一部十分鐘內的視頻彈幕數量上限為 1000,一部25分鐘的視頻為 3000,40分鐘左右的為 6000,時間更長的話會破萬。
如果大家發的彈幕數量太多了,超過彈幕池的數量上限怎么辦?
B 站的做法是按照時間順序用將以前的彈幕剔除掉,然后放入新的彈幕,這樣就將該視頻的彈幕數量始終維持在一個等級上,而且用戶看到的還是最新的彈幕。
比如這里,“刺客伍六七”第一集的時長是16分半,彈幕數量 3000。
新技術介紹
今年,也就是 2020 年,B站某位大佬在 github 上分享了自己的開源項目,也就是 bilibili 的 API 調用庫。
GitHub 地址為:https://github.com/Passkou/bilibili_api
通過這個 API 調用模塊,可以實現獲取視頻的評論、彈幕、播放量等信息,還可以實現投幣、點贊、發送彈幕等一系列的用戶功能。
比起我們上面所介紹的方式,用這個 API 來獲取視頻的彈幕就更為簡單了。我們只需要傳入視頻的 BVid,調用彈幕 API 即可獲取該視頻的彈幕(Bvid 的獲取和 cid 同理)。
在使用這個 API 之前,我們需要先用 pip 把這個庫安裝上
pipinstall bilibili_api
可以看到,調用 API 簡直不要太方便。而且 API 還有人維護和更新,拿來即可用。
frombilibili_api importvideoimportreimportpandas aspd
# BVid、fileNameBVid = "BV1oW41157Na"file_name = '刺客伍六七第一集.csv'
# 獲取彈幕my_video = video.VideoInfo(bvid=BVid)danmu = my_video.get_danmaku
# 數據處理data = [data.text fordata indanmu]fori indata:i = re.sub( 's+', '', i)
# 查看數量print( "彈幕數量為:{}".format(len(data)))
# 輸出到文件df = pd.DataFrame(data)df.to_csv(file_name, index= False, header= None, encoding= "utf_8_sig")print( "寫入文件成功")
責任編輯:
總結
以上是生活随笔為你收集整理的python接收弹幕_闲着没事,尝试一下用Python爬取B站弹幕呀~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络游戏加速器打不开Steam社区怎么办
- 下一篇: win7系统玩饥荒游戏出现error d