您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python怎么爬取B站视频弹幕
## 前言
在B站(哔哩哔哩)观看视频时,弹幕是其最具特色的功能之一。这些实时飘过的评论不仅增加了视频的互动性,也蕴含了大量用户反馈数据。对于数据分析师、内容创作者或爱好者来说,爬取这些弹幕数据可以帮助分析观众情绪、热门话题等。本文将详细介绍如何使用Python爬取B站视频弹幕。
---
## 一、准备工作
### 1.1 理解B站弹幕机制
B站的弹幕数据通常存储在XML或JSON格式的文件中,每个视频都有对应的弹幕文件(`cid`标识)。需要通过视频的`bvid`或`aid`先获取到`cid`,再通过`cid`获取弹幕。
### 1.2 安装必要的Python库
```bash
pip install requests beautifulsoup4 lxml
以B站视频 BV1GJ411x7h7
为例:
1. 获取视频的cid
2. 通过cid
请求弹幕接口
3. 解析并存储弹幕数据
B站提供了公开API来获取视频信息,其中包含cid
。构造请求URL如下:
import requests
def get_cid(bvid):
url = f"https://api.bilibili.com/x/player/pagelist?bvid={bvid}&jsonp=jsonp"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
return data['data'][0]['cid']
else:
raise Exception("Failed to get CID")
bvid = "BV1GJ411x7h7"
cid = get_cid(bvid)
print(f"CID: {cid}")
如果API不可用,可以通过解析视频页面获取:
from bs4 import BeautifulSoup
def get_cid_from_html(bvid):
url = f"https://www.bilibili.com/video/{bvid}"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
script = soup.find("script", text=lambda t: "window.__playinfo__" in str(t))
# 通过正则提取cid
import re
cid = re.search(r'"cid":(\d+)', script.string).group(1)
return int(cid)
B站的弹幕接口为:
https://api.bilibili.com/x/v1/dm/list.so?oid={cid}
def get_danmaku(cid):
url = f"https://api.bilibili.com/x/v1/dm/list.so?oid={cid}"
response = requests.get(url)
response.encoding = 'utf-8'
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'lxml')
danmus = soup.find_all('d')
return [danmu.text for danmu in danmus]
danmaku_list = get_danmaku(cid)
print(f"获取到{len(danmaku_list)}条弹幕")
每条弹幕XML格式如下:
<d p="时间戳,弹幕类型,字体大小,颜色,发送时间,弹幕池,用户Hash,数据库ID">弹幕内容</d>
可以进一步解析这些属性:
import re
def parse_danmaku(danmu):
pattern = r'<d p="(.*?)">(.*?)</d>'
matches = re.findall(pattern, str(danmu))
result = []
for m in matches:
attrs = m[0].split(',')
item = {
'time': float(attrs[0]),
'type': int(attrs[1]),
'size': int(attrs[2]),
'color': int(attrs[3]),
'timestamp': int(attrs[4]),
'content': m[1]
}
result.append(item)
return result
def save_as_txt(danmaku_list, filename):
with open(filename, 'w', encoding='utf-8') as f:
for danmu in danmaku_list:
f.write(danmu + '\n')
save_as_txt(danmaku_list, 'danmaku.txt')
import pandas as pd
def save_as_csv(parsed_danmaku, filename):
df = pd.DataFrame(parsed_danmaku)
df.to_csv(filename, index=False)
save_as_csv(parse_danmaku(danmaku_list), 'danmaku.csv')
import pymysql
def save_to_mysql(parsed_danmaku):
conn = pymysql.connect(host='localhost',
user='root',
password='password',
database='bilibili')
cursor = conn.cursor()
sql = """INSERT INTO danmaku
(time, type, size, color, timestamp, content)
VALUES (%s, %s, %s, %s, %s, %s)"""
for item in parsed_danmaku:
cursor.execute(sql, (item['time'], item['type'],
item['size'], item['color'],
item['timestamp'], item['content']))
conn.commit()
conn.close()
对于多P视频,需要遍历所有分P的CID:
def get_all_cids(bvid):
url = f"https://api.bilibili.com/x/player/pagelist?bvid={bvid}"
response = requests.get(url)
return [item['cid'] for item in response.json()['data']]
使用aiohttp
加速请求:
import aiohttp
import asyncio
async def async_get_danmaku(cid):
async with aiohttp.ClientSession() as session:
url = f"https://api.bilibili.com/x/v1/dm/list.so?oid={cid}"
async with session.get(url) as response:
text = await response.text()
soup = BeautifulSoup(text, 'lxml')
return [d.text for d in soup.find_all('d')]
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.bilibili.com/'
}
proxies = {'http': 'http://127.0.0.1:1080'}
from wordcloud import WordCloud
import jieba
text = ' '.join(danmaku_list)
wordlist = ' '.join(jieba.cut(text))
wc = WordCloud(font_path='simhei.ttf').generate(wordlist)
wc.to_file('danmaku_cloud.png')
import matplotlib.pyplot as plt
times = [d['time'] for d in parsed_danmaku]
plt.hist(times, bins=50)
plt.xlabel('Video Time (s)')
plt.ylabel('Danmaku Count')
plt.show()
robots.txt
对部分路径有限制本文详细介绍了从B站视频爬取弹幕的完整流程,包括: - 获取视频CID的两种方法 - 请求和解析弹幕XML数据 - 多种存储方式 - 高级技巧和数据分析示例
通过Python爬取B站弹幕不仅可以帮助我们理解B站的API结构,也为后续的数据分析工作奠定了基础。希望这篇教程对你有所帮助!
注意:本文所有代码示例仅供学习参考,实际使用时请遵守B站的相关规定。 “`
(全文约3100字)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。