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访问纯真IP数据库的代码
May 19 Python
Python中super关键字用法实例分析
May 28 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
python 修改本地网络配置的方法
Aug 14 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python pymsql模块的使用
Sep 07 Python
Django websocket原理及功能实现代码
Nov 14 Python
详解python中的异常和文件读写
Jan 03 Python
python 视频下载神器(you-get)的具体使用
Jan 06 Python
Python中super().__init__()测试以及理解
Dec 06 Python
Python编写冷笑话生成器
Apr 20 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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
使用php来实现网络服务
2009/09/15 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
工地资料员岗位职责
2013/12/31 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
设备收款委托书范本
2014/10/02 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
个人思想政治总结
2015/03/05 职场文书
刑事上诉状范文
2015/05/22 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS