Python爬虫实战,requests模块,Python实现抓取B站视频弹幕评论

1,193 阅读2分钟

「这是我参与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

在上面的的基础之上,点击任一有效日期即可获得这一日期的弹幕数据包,里面的内容目前是看不懂的,之所以确定它为弹幕数据包,是因为点击了日期他才加载出来,且链接与前面的链接具有相关性:

链接2

得到的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)

效果展示

B3.png

抓取评论

网页分析

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格式。

结果展示,获取的内容不包括二级评论,如果需要,可自行爬取,操作步骤差不多:

B5.png