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爬取51job中hr的邮箱
May 14 Python
简单谈谈python中的语句和语法
Aug 10 Python
Pandas之drop_duplicates:去除重复项方法
Apr 18 Python
Python 统计字数的思路详解
May 08 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
python的Jenkins接口调用方式
May 12 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
深入了解Python 变量作用域
Jul 24 Python
Django多个app urls配置代码实例
Nov 26 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中的正规表达式(一)
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python增加图像对比度的方法
2019/07/12 Python
Flask配置Cors跨域的实现
2019/07/12 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
企业标语大全
2014/07/01 职场文书
2014年文员工作总结
2014/11/18 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android