「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。
前言
利用Python实现抓取B站视频弹幕评论,废话不多说。
让我们愉快地开始吧~
开发工具
Python版本: 3.6.4
相关模块:
requests模块;
re模块;
pandas模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
思路分析
本文以爬取视频《“ 这是我见过最拽的一届中国队奥运冠军”》为例,讲解如何爬取B站视频的弹幕和评论!
目标地址
https://www.bilibili.com/video/BV1wq4y1Q7dp
抓取弹幕
网页分析
B站视频的弹幕不像腾讯视频那样,播放视频就会触发弹幕数据包,他需要点击网页右侧的弹幕列表行的展开,然后点击查看历史弹幕获得视频弹幕开始日到截至日链接:
链接末尾以oid以及开始日期来构成弹幕日期URL:
https://api.bilibili.com/x/v2/dm/history/index?type=1&oid=384801460&month=2021-08
在上面的的基础之上,点击任一有效日期即可获得这一日期的弹幕数据包,里面的内容目前是看不懂的,之所以确定它为弹幕数据包,是因为点击了日期他才加载出来,且链接与前面的链接具有相关性:
得到的URL:
https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=384801460&date=2021-08-08
URL中的oid为视频弹幕链接的id值;data参数为刚才的的日期,而获得该视频全部弹幕内容,只需要更改data参数即可。而data参数可以从上面的弹幕日期url获得,也可以自行构造;网页数据格式为json格式
代码实现
import requests\
import pandas as pd\
import re\
\
def data_resposen(url):\
headers = {\
"cookie": "你的cookie",\
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"\
}\
resposen = requests.get(url, headers=headers)\
return resposen\
\
def main(oid, month):\
df = pd.DataFrame()\
url = f'https://api.bilibili.com/x/v2/dm/history/index?type=1&oid={oid}&month={month}'\
list_data = data_resposen(url).json()['data'] # 拿到所有日期\
print(list_data)\
for data in list_data:\
urls = f'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid={oid}&date={data}'\
text = re.findall(".*?([\u4E00-\u9FA5]+).*?", data_resposen(urls).text)\
for e in text:\
print(e)\
data = pd.DataFrame({'弹幕': [e]})\
df = pd.concat([df, data])\
df.to_csv('弹幕.csv', encoding='utf-8', index=False, mode='a+')\
\
if __name__ == '__main__':\
oid = '384801460' # 视频弹幕链接的id值\
month = '2021-08' # 开始日期\
main(oid, month)
效果展示
抓取评论
网页分析
B站视频的评论内容在网页下方,进入浏览器的开发者工具后,只需要向下拉取即可加载出数据包:
![数据包(p3-juejin.byteimg.com/tos-cn-i-k3…?)
得到真实URL:
https://api.bilibili.com/x/v2/reply/main?callback=jQuery1720034332372316460136_1629011550479&jsonp=jsonp&next=0&type=1&oid=589656273&mode=3&plat=1&_=1629012090500\
https://api.bilibili.com/x/v2/reply/main?callback=jQuery1720034332372316460136_1629011550483&jsonp=jsonp&next=2&type=1&oid=589656273&mode=3&plat=1&_=1629012513080\
https://api.bilibili.com/x/v2/reply/main?callback=jQuery1720034332372316460136_1629011550484&jsonp=jsonp&next=3&type=1&oid=589656273&mode=3&plat=1&_=1629012803039
两条urlnext参数,以及_和callback参数。_和callback一个是时间戳,一个是干扰参数,删除即可。next参数第一条为0,第二条为2,第三条为3,所以第一条next参数固定为0,第二条开始递增;网页数据格式为json格式。
结果展示,获取的内容不包括二级评论,如果需要,可自行爬取,操作步骤差不多: