Python爬虫爬取Bilibili弹幕过程解析


Posted in Python onOctober 10, 2019

先来思考一个问题,B站一个视频的弹幕最多会有多少?

比较多的会有2000条吧,这么多数据,B站肯定是不会直接把弹幕和这个视频绑在一起的。

也就是说,有一个视频地址为https://www.bilibili.com/video/av67946325,你如果直接去requests.get这个地址,里面是不会有弹幕的,回想第一篇说到的携程异步加载数据的方式,B站的弹幕也一定是先加载当前视频的界面,然后再异步填充弹幕的。

接下来我们就可以打开火狐浏览器(平常可以火狐谷歌控制台都使用,因为谷歌里面因为插件被拦截下来的包在火狐可以抓到,同理谷歌也是)的控制台来观察网络请求了。

经过仔细排查之后,我找到了一个请求xml的,它后面跟了一个oid,查看它的响应内容之后可以发现它就是弹幕文件。

Python爬虫爬取Bilibili弹幕过程解析

它的响应时间98毫秒,远超其它几个响应,所以说如果把弹幕直接放在视频页面,用户体验一定会很差。

Python爬虫爬取Bilibili弹幕过程解析

找到弹幕了,爬取它很容易,但是我们想要是爬取固定av号视频的弹幕,而不是说随意去找一个oid来爬取弹幕,这样我们都不知道爬下来的弹幕是哪个视频的。

接下来我们就可以复制oid的117784982值,去视频页面搜索看看了,通过视频来获得它的oid再来爬xml弹幕就很方便了。

这次用了谷歌浏览器,在里面通过搜索oid果然搜索到相关的数据了。

Python爬虫爬取Bilibili弹幕过程解析

其中cid是弹幕对应的id,aid对应视频av号。

先把这个页面爬取下来。

# encoding: utf-8

import requests

headers = {
  'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
  'Accept': 'text/html',
  'Cookie': "_uuid=1DBA4F96-2E63-8488-DC25-B8623EFF40E773841infoc; buvid3=FE0D3174-E871-4A3E-877C-A4ED86E20523155831infoc; LIVE_BUVID=AUTO8515670521735348; sid=l765gx48; DedeUserID=33717177; DedeUserID__ckMd5=be4de02fd64f0e56; SESSDATA=cf65a5e0%2C1569644183%2Cc4de7381; bili_jct=1e8cdbb5755b4ecd0346761a121650f5; CURRENT_FNVAL=16; stardustvideo=1; rpdid=|(umY))|ukl~0J'ulY~uJm)kJ; UM_distinctid=16ce0e51cf0abc-02da63c2df0b4b-5373e62-1fa400-16ce0e51cf18d8; stardustpgcv=0606; im_notify_type_33717177=0; finger=b3372c5f; CURRENT_QUALITY=112; bp_t_offset_33717177=300203628285382610"

}
resp = requests.get('https://www.bilibili.com/video/av67946325',headers=headers)
print(resp.text)

拿到了内容我们就要从中解析弹幕id了,对于这种规则紊乱的网页,我们就不能用上一篇中Bs4解析了,而是使用正则表达式。

正则表达式最简单的使用方式其实就是直接match。

re.search(匹配规则,文本).group()

Python爬虫爬取Bilibili弹幕过程解析

观察这里的内容,我们大致的匹配规则就有了。

cid={目标}&aid=av号

117784982就是我们的目标。

av_id = '67946325'
resp = requests.get('https://www.bilibili.com/video/av'+av_id,headers=headers)
match_rule = r'cid=(.*?)&aid'
oid = re.search(match_rule,resp.text).group().replace('cid=','').replace('&aid','')
print('oid='+oid)

先根据av号拿到视频页面,然后解析视频页面拿到oid,最后用oid去请求xml弹幕文件。

xml_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid='+oid
resp = requests.get(xml_url,headers=headers)
print(resp)

这样我们就完成B站弹幕爬虫了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python对数组进行反转的方法
May 20 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
python动态规划算法实例详解
Nov 22 Python
安装python及pycharm的教程图解
Oct 10 #Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 #Python
3行Python代码实现图像照片抠图和换底色的方法
Oct 10 #Python
python通过SSH登陆linux并操作的实现
Oct 10 #Python
Python对接支付宝支付自实现功能
Oct 10 #Python
python3中的eval和exec的区别与联系
Oct 10 #Python
python3 mmh3安装及使用方法
Oct 09 #Python
You might like
PHP获取当前完整URL地址的函数
2014/12/21 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
利用Python如何生成随机密码
2016/04/20 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
新闻记者个人求职的自我评价
2013/11/28 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
网络技术专业求职信
2014/05/02 职场文书
建设工程授权委托书
2014/09/22 职场文书
党员查摆剖析材料
2014/10/10 职场文书
2015毕业寄语大全
2015/02/26 职场文书
防暑降温通知书
2015/04/27 职场文书
培训简讯范文
2015/07/20 职场文书
学生会部长竞选稿
2015/11/19 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS