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中星号变量的几种特殊用法
Sep 07 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
Python骚操作之动态定义函数
Mar 26 Python
Python3 实现串口两进程同时读写
Jun 12 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
Python socket模块方法实现详解
Nov 05 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
python如何输出反斜杠
Jun 18 Python
详解Python openpyxl库的基本应用
Feb 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的输入输出流
2007/02/14 PHP
PHP DataGrid 实现代码
2009/08/12 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
表单内同名元素的控制
2006/11/22 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python中的迭代器漫谈
2015/02/03 Python
Python 文件操作的详解及实例
2017/09/18 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
对python中return与yield的区别详解
2020/03/12 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
Java程序员面试90题
2013/10/19 面试题
团日活动总结书格式
2014/05/08 职场文书
英语导游词
2015/02/13 职场文书
毕业生自荐信范文
2015/03/05 职场文书
党支部工作总结2015
2015/04/01 职场文书