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中使用MELIAE分析程序内存占用实例
Feb 18 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
Aug 28 Python
PHP实现发送和接收JSON请求
Jun 07 Python
python 生成图形验证码的方法示例
Nov 11 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
python批量图片处理简单示例
Aug 06 Python
python线程join方法原理解析
Feb 11 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
初级的用php写的采集程序
2007/03/16 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
javascript 特殊字符串
2009/02/25 Javascript
input的focus方法使用
2010/03/13 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
python 控制语句
2011/11/03 Python
Python之os操作方法(详解)
2017/06/15 Python
python实现电脑自动关机
2018/06/20 Python
python求最大值最小值方法总结
2019/06/25 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
计算机网络专业推荐信
2013/11/24 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
pandas提升计算效率的一些方法汇总
2021/05/30 Python
Django实现聊天机器人
2021/05/31 Python
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
CentOS MySql8 远程连接实战
2022/04/19 MySQL