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实时获取cmd的输出
Dec 13 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
python获取代理IP的实例分享
May 07 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
keras 权重保存和权重载入方式
May 21 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
如何让python的运行速度得到提升
Jul 08 Python
Python 忽略文件名编码的方法
Aug 01 Python
python for循环赋值问题
Jun 03 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
改进的IP计数器
2006/10/09 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
php url路由入门实例
2014/04/23 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
python Django批量导入不重复数据
2016/03/25 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
某公司面试题
2012/03/05 面试题
kfc实习自我鉴定
2013/12/14 职场文书
超越自我演讲稿
2014/05/21 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
入队仪式主持词
2015/07/04 职场文书
学校教代会开幕词
2016/03/04 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python