日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python爬取B站弹幕方法介绍

發布時間:2025/3/21 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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站目前還沒有針對爬蟲設置特別的反爬措施,因此可以直接爬取
  • 彈幕數據絕大部分都是中文,一定要使用 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 把這個庫安裝上

    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站弹幕方法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。