B站直播弹幕爬取

时间:2024-04-11 08:15:04

参考博文

C# POST——爬取B站直播时的弹幕

目录

1. 起因
2. 准备工作
3. 编写爬虫
4. 总结

一、起因

        最近想研究B站直播方面的东西,感觉对我来说还是挺困难,但是多花功夫还是能解决问题的,网上有好多前辈、大佬写好的文章,还没办法看明白,好多基础知识还不理解,所以我准备慢慢进行这项计划。现在就以爬取B站直播弹幕作为开端。

一、准备工作

1.找到弹幕文件【阅读参考文章,很容易就能找到相应文件】

(1)随便开一个b站的直播
B站直播弹幕爬取
(2)F12,打开开发人员界面,F5刷新页面
出来了一堆
B站直播弹幕爬取
(3)直接找msg文件,可以看到这就是弹幕所在的地方
B站直播弹幕爬取
(4)查看Headers,理论上就可以直接编写爬虫了
B站直播弹幕爬取

2. 打开Fiddler【可跳过这一步】

(1)再次抓直播间包,找到msg
B站直播弹幕爬取
(2)拖到Composer中,简化爬虫编写时的测试过程
【大佬可以不用做这些,我老是在这里出问题】
B站直播弹幕爬取
(3)最终测试结果
B站直播弹幕爬取
        当然有时候我们需要完美地模拟浏览器的行为,所以头部写的和浏览器越像越好,这里可以不需要,而且写的太多也没意义。通过上述可以简化头部,代码可以看上去不会太杂乱【只要访问允许即可】。

三、编写爬虫

贴代码:

import requests

class Danmu():
    url = "https://api.live.bilibili.com/ajax/msg"
    headers = {
               "Content-Type": "application/x-www-form-urlencoded",
                "Referer": "https://live.bilibili.com/blanc/55?liteVersion=true",
                "Content-Length": "107",
                "Host": "api.live.bilibili.com"
                      }
    def __init__(self, roomid, csrf):
        self.roomid = roomid
        self.csrf_token = csrf
        self.csrf = csrf

    def post_it(self):
        data = {"roomid":self.roomid,
                    "csrf_token": self.csrf_token,
                    "csrf": self.csrf,
                    "visit_id":""}
        self.session = requests.Session()
        self.json_data = self.session.post(url=self.url,
                                          headers=self.headers,
                                          data = data).json()

    def getDanmu(self):
        datas = self.json_data['data']['room']
        for data in datas:
            try:
                nickname = data['nickname']
            except UnicodeEncodeError: #这里的原因是print无法打印特殊字符
                                      #虽然有解决方案,但是没必要            
                nickname = "非法字符,无法print"
            try:
                text = data['text']
            except UnicodeEncodeError:
                text = "非法字符,无法print"
            print("{} :{}".format(nickname, text))
                                     
if __name__ == '__main__':
    roomid = "" #填写roomid
    csrf = "" #填写csrf
    danmu = Danmu(roomid, csrf)
    danmu.post_it()
    danmu.getDanmu()
    

结果展示:
B站直播弹幕爬取

四、总结

        综上,对于json文件没有仔细的研究,主要还是看别人的博文,省了很多时间。这个故事告诉我们:在做一件事之前,看看别人做了没有,站在巨人的肩膀上,可以省去很多不必要的时间消耗。唯一我惊奇地是,尽然只需要访问这一个接口,然后返回实时弹幕,而不是一段时间生成一个文件。这样的话像别人说的那样,需要做一个检测,是否弹幕重复出现之类的。可以进一步完善相关功能,但是我最初的目的达到了,爬取到B站直播弹幕,所以算是完成了任务。

在查找B站弹幕相关信息的时候,查到了关于csrf的信息。
csrf:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF
相关文章参考:
CSRF是什么?CSRF验证失败怎么办?
浅谈CSRF
我要说什么呢。。。。 额 这东西了解下来,很厉害,但是我不懂。唯一了解到的是:这个挺危险,表单中填写csrf挺重要的。
其它也没有了。。。先这样吧

点我回顶部

 
 
 
 
 
 
 
Fin.