您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何使用Python爬虫抓取弹幕
## 目录
1. [弹幕数据概述](#一弹幕数据概述)
2. [技术准备](#二技术准备)
3. [网页端弹幕抓取](#三网页端弹幕抓取)
4. [移动端API分析](#四移动端api分析)
5. [数据存储与分析](#五数据存储与分析)
6. [反爬策略应对](#六反爬策略应对)
7. [完整代码示例](#七完整代码示例)
8. [法律与伦理考量](#八法律与伦理考量)
---
## 一、弹幕数据概述
弹幕(Danmaku)是一种实时评论系统,起源于日本Niconico动画,现已广泛应用于B站、斗鱼等国内平台。其核心特点包括:
- 实时性:与视频播放进度同步
- 空间分布:在视频画面上动态显示
- 数据量大:热门视频可达百万级弹幕
典型应用场景:
- 用户情感分析
- 视频内容热点标记
- 社区互动研究
---
## 二、技术准备
### 2.1 基础工具
```python
# 必需库安装
pip install requests beautifulsoup4 selenium
pip install pandas pyecharts # 数据分析与可视化
import requests
from bs4 import BeautifulSoup
def get_bilibili_danmaku(bvid):
# 获取CID
api_url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}"
resp = requests.get(api_url, headers={"User-Agent": "Mozilla/5.0"})
cid = resp.json()['data']['cid']
# 获取弹幕XML
dm_url = f"https://comment.bilibili.com/{cid}.xml"
dm_resp = requests.get(dm_url)
soup = BeautifulSoup(dm_resp.content, 'lxml-xml')
return [d.text for d in soup.find_all('d')]
from websocket import create_connection
import json
def douyu_danmaku(room_id):
ws = create_connection("wss://danmuproxy.douyu.com:8506/")
ws.send(f"type@=loginreq/roomid@={room_id}/")
while True:
data = ws.recv()
print(json.loads(data[20:])) # 处理二进制消息头
通过Fiddler/Charles抓包获取: 1. 获取直播间ID 2. 解析protobuf格式数据
import requests
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)"
}
def douyin_danmaku(live_id):
url = f"https://webcast.amemv.com/webcast/room/enter/?live_id={live_id}"
resp = requests.get(url, headers=headers)
data = resp.json()
# 解析返回的JSON获取弹幕WebSocket地址
存储方式 | 优点 | 缺点 |
---|---|---|
CSV | 易读易写 | 大数据性能差 |
MySQL | 结构化查询 | 需要数据库服务 |
MongoDB | 灵活扩展 | 占用空间大 |
from snownlp import SnowNLP
def sentiment_analysis(danmus):
results = []
for dm in danmus[:1000]: # 抽样分析
s = SnowNLP(dm)
results.append(s.sentiments)
return sum(results)/len(results)
import time
from fake_useragent import UserAgent
ua = UserAgent()
headers = {
"User-Agent": ua.random,
"Referer": "https://www.bilibili.com"
}
def safe_request(url):
time.sleep(1.5) # 遵守爬虫协议
return requests.get(url, headers=headers)
import requests
import pandas as pd
from tqdm import tqdm
class BiliDanmakuSpider:
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Origin": "https://www.bilibili.com"
})
def get_video_info(self, bvid):
"""获取视频基础信息"""
api_url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}"
resp = self.session.get(api_url)
return resp.json()['data']
def get_history_danmaku(self, cid, date):
"""获取历史弹幕(需登录)"""
url = f"https://api.bilibili.com/x/v2/dm/history?type=1&oid={cid}&date={date}"
resp = self.session.get(url)
return self.parse_danmaku(resp.content)
def parse_danmaku(self, xml_data):
"""解析XML格式弹幕"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(xml_data, 'lxml-xml')
return [{
"text": d.text,
"time": float(d['p'].split(',')[0]),
"type": int(d['p'].split(',')[1]),
"color": int(d['p'].split(',')[3])
} for d in soup.find_all('d')]
if __name__ == "__main__":
spider = BiliDanmakuSpider()
data = spider.get_video_info("BV1uv411q7Mv")
danmus = spider.get_history_danmaku(data['cid'], "2023-08-01")
pd.DataFrame(danmus).to_csv("danmu.csv", index=False)
合规要求
数据使用原则
注:本文所有代码示例仅供学习参考,实际使用时请遵守各平台用户协议及相关法律法规。 “`
(全文约2850字,实际字数可能因Markdown渲染方式略有差异)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。