爬取b站视频包括弹幕
时间: 2025-06-01 16:45:12 浏览: 15
### 如何用Python爬取B站视频和弹幕数据
#### 技术背景
哔哩哔哩(Bilibili,简称 B 站)作为中国领先的视频分享平台之一,其独特的弹幕功能为用户提供了一种实时互动的方式。通过爬取 B 站的视频及其弹幕数据,可以进一步分析用户的兴趣、情感以及行为模式[^3]。
#### 获取视频 CID
在爬取 B 站视频及弹幕之前,需要先找到目标视频的 `CID`(Content ID),这是访问具体资源的关键参数。通常情况下,可以通过解析网页中的 JavaScript 变量或者调用 API 来提取该值。以下是获取 CID 的方法:
```python
import requests
from bs4 import BeautifulSoup
def get_cid(video_url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(video_url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
script_tag = soup.find('script', text=lambda t: t and '"cid"' in t)
cid_start_index = str(script_tag).find('"cid"') + len('"cid":')
cid_end_index = str(script_tag)[cid_start_index:].find(',')
cid = str(script_tag)[cid_start_index:cid_start_index + cid_end_index].strip().replace('"', '')
return cid
```
#### 爬取弹幕数据
一旦获得了视频的 CID,就可以利用 B 站提供的接口下载对应的弹幕文件。这些文件通常是 XML 格式的文档,其中包含了每条弹幕的具体信息。下面展示如何使用 Python 和 `xml.etree.ElementTree` 模块解析弹幕数据:
```python
import xml.etree.ElementTree as ET
import requests
def fetch_danmaku(cid):
url = f"https://comment.bilibili.com/{cid}.xml"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code != 200:
raise Exception(f"Failed to download danmaku data with status code {response.status_code}")
root = ET.fromstring(response.text.encode('utf-8'))
danmaku_list = []
for child in root:
if child.tag == 'd':
attributes = child.attrib
content = child.text
params = attributes['p'].split(",")
item = {
"time": float(params[0]), # 弹幕出现时间(秒)
"mode": int(params[1]), # 弹幕显示模式
"fontsize": int(params[2]), # 字体大小
"color": int(params[3]), # 颜色(RGB 十进制表示法)
"timestamp": int(params[4]), # 发送时间戳
"pool": int(params[5]), # 弹幕池类型
"userhash": params[6], # 用户唯一标识符
"content": content # 弹幕内容
}
danmaku_list.append(item)
return danmaku_list
```
以上函数会返回一个列表对象,每一项代表一条弹幕记录,并附带详细的元数据描述[^2]。
#### 数据保存与处理
为了便于后续的数据分析工作,建议将抓取到的结果存储至本地数据库或导出成 CSV 文件形式。这里给出简单的例子说明如何写入 JSON 文件:
```python
import json
def save_to_json(data, filename="danmaku.json"):
with open(filename, mode='w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
# Example usage after fetching the danmakus.
fetched_data = fetch_danmaku("your_video_cid_here")
save_to_json(fetched_data)
```
这样就完成了从网络请求直至最终持久化的整个流程[^4]。
---
阅读全文
相关推荐


















