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写的一个简单DNS服务器实例
Jun 04 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
Python语言规范之Pylint的详细用法
Jun 24 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
python中的代码编码格式转换问题
2015/06/10 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
python判断链表是否有环的实例代码
2020/01/31 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
保护环境建议书400字
2014/05/13 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
人事代理委托书
2014/09/27 职场文书
搬迁通知
2015/04/20 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书