B站弹幕和评论爬虫

本文介绍了如何使用Python爬虫技术抓取B站视频的弹幕和评论数据,包括获取XML数据URL、解析script内容、提取评论ID和数据结构,以及处理主评论和回复评论的抓取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B站弹幕和评论爬虫

最近想爬下B站的弹幕和评论,发现网上找到的教程基本都失效了,毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方。对于爬虫这一方,爬取网站数据,一般目的都是比较明确的,废话不多说,开干!
在这里插入图片描述

https://comment.bilibili.com/xxxx.xml

在浏览器打开可以看到如下:
在这里插入图片描述

数据还是非常干净的,那么下一步就是看如何获取这个 xml 的 url 地址了,也就是如何获取 324768988 ID接下来我们搜索整个网页的源码,可以发现如下情况

在这里插入图片描述
也就是说,我们需要的 ID 是可以在 script 当中获取的,下面就来编写一个提取 script 内容的函数

def getHTML_content(self):
        # 获取该视频网页的内容
        response = requests.get(self.BVurl, headers = self.headers)
        html_str = response.content.decode()
        html=etree.HTML(html_str)
        result=etree.tostring(html)
        return result
 
def get_script_list(self,str):
    html = etree.HTML(str)
    script_list = html.xpath("//script/text()")
    return script_list

拿到所有的 script 内容之后,我们再来解析我们需要的数据

script_list = self.get_script_list(html_content)
# 解析script数据,获取cid信息
for script in script_list:
        if '[{"cid":' in script:
            find_script_text = script
final_text = find_script_text.split('[{"cid":')[1].split(',"page":')[0]

最后,我们再把整体代码封装成一个类,就完成了弹幕抓取的数据收集工作了

spider = BiliSpider("BV16p4y187hc")
spider.run()

结果如下:

在这里插入图片描述
对于评论数据,可能要复杂一些,需要分为主(main)评论和回复主评论的 reply 评论我们通过浏览器工具抓取网页上的所有请求,然后搜索 reply,可以得到如下结果
在这里插入图片描述
我们先来看看 main 请求,整理后通过浏览器访问如下
在这里插入图片描述
也可以直接通过 requests 请求
在这里插入图片描述
通过观察可以得知,响应消息里的 replies 就是主评论内容,同时我们还可以改变 url当中的 next 参数来翻页,进而请求不同的数据这里我们再关注下 rpid 参数,这个会用于 reply 评论中再来看看 reply 评论,同样可以使用 requests 直接访问,同时 url 当中的 root 参数就是我们上面提到的 rpid 参数
在这里插入图片描述
我们厘清了上面的关系之后,我们就可以编写代码了

def get_data(data):
    data_list = []
    comment_data_list = data["data"]["replies"]
    for i in comment_data_list:
        data_list.append([i['rpid'], i['like'], i['member']['uname'], i['member']['level_info']['current_level'], i['content']['message']])
    return data_list
 
 
def save_data(data_type, data):
    if not os.path.exists(data_type + r'_data.csv'):
        with open(data_type + r"_data.csv", "a+", encoding='utf-8') as f:
            f.write("rpid,点赞数量,用户,等级,评论内容\n")
            for i in data:
                rpid = i[0]
                like_count = i[1]
                user = i[2].replace(',', ',')
                level = i[3]
                content = i[4].replace(',', ',')
                row = '{},{},{},{},{}'.format(rpid,like_count,user,level,content)
                f.write(row)
                f.write('\n')
    else:
        with open(data_type + r"_data.csv", "a+", encoding='utf-8') as f:
            for i in data:
                rpid = i[0]
                like_count = i[1]
                user = i[2].replace(',', ',')
                level = i[3]
                content = i[4].replace(',', ',')
                row = '{},{},{},{},{}'.format(rpid,like_count,user,level,content)
                f.write(row)
                f.write('\n')
 
 
for i in range(1000):
    url = "https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=972516426&mode=3&plat=1&_=1632192192097".format(str(i))
    print(url)
    d = requests.get(url)
    data = d.json()
    if not data['data']['replies']:
        break
    m_data = get_data(data)
    save_data("main", m_data)
    for j in m_data:
        reply_url = "https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn=1&type=1&oid=972516426&ps=10&root={}&_=1632192668665".format(str(j[0]))
        print(reply_url)
        r = requests.get(reply_url)
        r_data = r.json()
        if not r_data['data']['replies']:
            break
        reply_data = get_data(r_data)
        save_data("reply", reply_data)
        time.sleep(5)
    time.sleep(5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值