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字符串的常用操作方法小结
May 21 Python
Tensorflow之Saver的用法详解
Apr 23 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Python中Proxypool库的安装与配置
Oct 19 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
关于Python解包知识点总结
May 05 Python
python中二分查找法的实现方法
Dec 06 Python
Python基础之hashlib模块详解
May 06 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 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
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
PHP静态成员变量
2017/02/14 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
javascript 浏览器检测代码精简版
2010/03/04 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Python之py2exe打包工具详解
2017/06/14 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Python面向对象类的继承实例详解
2018/06/27 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
python远程连接MySQL数据库
2019/04/19 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
Python列表如何更新值
2020/05/27 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
Python中如何定义一个函数
2016/09/06 面试题
建筑个人求职信范文
2014/01/25 职场文书
会计求职简历自我评价
2015/03/10 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电