Python爬取B站弹幕方法介绍
Python爬取B站彈幕方法介紹
文章目錄
- Python爬取B站彈幕方法介紹
- 前言
- 尋找彈幕數據
- 編寫爬蟲
- B站彈幕數量
- 新技術介紹
- 參考文章
前言
最近同學要做東西,需要用 B 站的視頻對應的彈幕數據做分析,于是請我幫忙爬取 B 站視頻的彈幕數據。
對于爬蟲而言,我們需要找到對應數據所在的接口,找到接口,就可以找到對應的數據。這個時候我們只需要簡單的調用 Python 庫進行爬取,輸出到文件即可。
目前針對 B 站彈幕爬取有兩種方法
- 方法一,找到接口數據,編碼爬取
- 方法二,找到 BV號,調用API
這篇博客分別對兩種方法進行了整合介紹,并給出了詳細的操作流程。
尋找彈幕數據
其實 B 站是提供了彈幕接口的,B站把視頻對應的彈幕數據全部放在 xml 文件中,獲取的接口是
1、https://comment.bilibili.com/視頻的cid.xml 2、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 為 47506569。
- 第五步,將 cid 與對應的接口進行拼接,輸入在瀏覽器的地址欄進行查看
這一步是為了熟悉對應彈幕數據的網頁結構,方便之后的編碼工作進行數據的提取。如果使用熟練的話則可以跳過此步。
編寫爬蟲
既然我們已經可以找到了彈幕數據所在的的地方,直接進行爬取即可。大致可以分為以下幾步:
爬蟲編寫完成后,每次我們只需要修改文件名和 cid 就可以繼續爬取彈幕數據保存到文件中了。
import requests from bs4 import BeautifulSoup import pandas as pd import re# 彈幕保存文件 file_name = '刺客伍六七第一集.csv'# 獲取頁面 cid = 47506569 url = "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 for data in results] # 正則去掉多余的空格和換行 for i in data: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站彈幕數量
這里不得不提一下 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 把這個庫安裝上
pip install bilibili_api可以看到,調用 API 簡直不要太方便。而且 API 還有人維護和更新,拿來即可用。
from bilibili_api import video import re import pandas as pd# BVid、fileName BVid = "BV1oW41157Na" file_name = '刺客伍六七第一集.csv'# 獲取彈幕 my_video = video.VideoInfo(bvid=BVid) danmu = my_video.get_danmaku()# 數據處理 data = [data.text for data in danmu] for i in data: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爬蟲:bilibili彈幕爬取
bilibili彈幕獲取api
pandas-DataFrame格式化保存到txt
bilibili 彈幕會被限制數量嗎
bilibili-API
總結
以上是生活随笔為你收集整理的Python爬取B站弹幕方法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot整合Mybatis超
- 下一篇: 第一个blog