参考博文
目录
一、起因 ↶
最近想研究B站直播方面的东西,感觉对我来说还是挺困难,但是多花功夫还是能解决问题的,网上有好多前辈、大佬写好的文章,还没办法看明白,好多基础知识还不理解,所以我准备慢慢进行这项计划。现在就以爬取B站直播弹幕作为开端。
一、准备工作 ↶
1.找到弹幕文件【阅读参考文章,很容易就能找到相应文件】
(1)随便开一个b站的直播
(2)F12,打开开发人员界面,F5刷新页面
出来了一堆
(3)直接找msg文件,可以看到这就是弹幕所在的地方
(4)查看Headers,理论上就可以直接编写爬虫了
2. 打开Fiddler【可跳过这一步】
(1)再次抓直播间包,找到msg
(2)拖到Composer中,简化爬虫编写时的测试过程
【大佬可以不用做这些,我老是在这里出问题】
(3)最终测试结果
当然有时候我们需要完美地模拟浏览器的行为,所以头部写的和浏览器越像越好,这里可以不需要,而且写的太多也没意义。通过上述可以简化头部,代码可以看上去不会太杂乱【只要访问允许即可】。
三、编写爬虫 ↶
贴代码:
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()
结果展示:
四、总结 ↶
综上,对于json文件没有仔细的研究,主要还是看别人的博文,省了很多时间。这个故事告诉我们:在做一件事之前,看看别人做了没有,站在巨人的肩膀上,可以省去很多不必要的时间消耗。唯一我惊奇地是,尽然只需要访问这一个接口,然后返回实时弹幕,而不是一段时间生成一个文件。这样的话像别人说的那样,需要做一个检测,是否弹幕重复出现之类的。可以进一步完善相关功能,但是我最初的目的达到了,爬取到B站直播弹幕,所以算是完成了任务。
在查找B站弹幕相关信息的时候,查到了关于csrf的信息。
csrf:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF
相关文章参考:
CSRF是什么?CSRF验证失败怎么办?
浅谈CSRF
我要说什么呢。。。。 额 这东西了解下来,很厉害,但是我不懂。唯一了解到的是:这个挺危险,表单中填写csrf挺重要的。
其它也没有了。。。先这样吧
点我回顶部 ☚
Fin.