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中的应用之translate和maketrans用法详解
Aug 27 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
python numpy和list查询其中某个数的个数及定位方法
Jun 27 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
如何用python插入独创性声明
Mar 31 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 Python
教你怎么用Python操作MySql数据库
May 31 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 CKEditor 上传图片实现代码
2009/11/06 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
js css后面所带参数含义介绍
2013/08/18 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
js中url对象化管理分析
2017/12/29 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
分享一个常用的Python模拟登陆类
2015/03/29 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
static关键字的用法
2013/10/07 面试题
档案检查欢迎词
2014/01/13 职场文书
增员口号大全
2014/06/18 职场文书
授权委托书
2014/07/31 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
心理学培训心得体会
2016/01/22 职场文书
python元组打包和解包过程详解
2021/08/02 Python