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复制目录结构脚本代码分享
Mar 06 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
Python闭包思想与用法浅析
Dec 27 Python
手写一个python迭代器过程详解
Aug 27 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
用opencv给图片换背景色的示例代码
Jul 08 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 神盾解密工具
2014/06/08 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
Django 路由控制的实现代码
2018/11/08 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
公司财务自我评价分享
2013/12/17 职场文书
秋季运动会广播稿
2014/02/22 职场文书
师德师风个人总结
2015/02/06 职场文书
教师节主题班会方案
2015/08/17 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
Redis持久化与主从复制的实践
2021/04/27 Redis
python代码实现备忘录案例讲解
2021/07/26 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL