最近无聊分析了一下b站的视频流协议,简单分享下爬取的流程。

首先先要找到视频对应的aid和cid,aid就相当于av号,而av号对应网页下的每一个视频都有对应的cid,普通视频就是分p,番剧就是集数,aid和cid在网页的源代码里面都能找到,用正则匹配aid和cid这两个关键字就能匹配到,如下代码:

1 url = ''  #这里是需要下载的视频网址
2 html = requests.get(url,headers).text
3 aid = json.loads(re.findall(r'"aid":(\d+)',html)[0]) #这里是aid
4 pages = json.loads(re.findall(r'"pages":(\[.+?\])',html)[0])
5 cidlist = [] #这里是cid的列表
6 for i in pages:
7 cidlist.append(i['cid'])

b站视频流地址api如下:

https://api.bilibili.com/pgc/player/web/playurl?fnval=80&cid={c}  (这是番剧的)
https://api.bilibili.com/x/player/playurl?fnval=80&avid={a}&cid={c}  (这是视频的)
 
如上api会返回json字符串,包含各种支持的编码和分辨率的视频流,番剧只需要cid就能访问所以可以不提取aid,有些番剧和分辨率可能得大会员或者港澳台才能使用,如有需要请修改请求的cookie和ip地址。
其中关于video的json字符串如下:

"video": [
{
"start_with_sap": 1,
"bandwidth": 4112579,
"sar": "1:1",
"backupUrl": [""],
"codecs": "avc1.640028",
"base_url": "",
"backup_url": [""],
"segment_base": {
"initialization": "0-990",
"index_range": "991-4490"
},
"mimeType": "video/mp4",
"frame_rate": "16000/672",
"SegmentBase": {
"Initialization": "0-990",
"indexRange": "991-4490"
},
"frameRate": "16000/672",
"codecid": 7,
"baseUrl": "",
"size": 0,
"mime_type": "video/mp4",
"width": 1920,
"startWithSAP": 1,
"id": 112,
"height": 1080,
"md5": ""
}]

其中的base_url、id和codecs字段是我们需要的。不同的id对应不同的分辨率,codecs对应编码方式,base_url就是对应分辨率和编码方式下的视频流地址。

audio对应的json字符串和video类似,同样是base_url为音频流地址。

(注意其上的api都得在请求头加referer字段,否则无法访问)

视频流地址可以在请求头加range字段,用于分段下载或者部分下载,如不加则为下载所有,代码如下:

headers = {
'user-agent':'',
'referer':'',
'range':'byte=0-99999' #此为range字段,代表下载整个视频从0到9999字节的数据
} with open('demo_vedio.mp4','wb+') as file1, open('demo_audio.mp3','wb+') as file2:
file1.write(requests.get(vedio_url,headers=headers).content) #下载video
file2.write(requests.get(audio_url,headers=headers).content) #下载audio

接下来就是等资源下载完毕了,如有需要可以用格式工厂将音频视频合并成为一个完整的视频。

总结:b站还是很友好的,没有弄一些加密什么的来防爬,通过这次也大致了解了hash协议的原理,总体来说想下载b站视频并不难。

b站视频下载相关的源码网址:https://github.com/modifyGB/bili_video_download

b站视频下载技术分享的更多相关文章

  1. 大学MOOC课程视频下载、流文件合并、批量重命名、b站视频下载及学习课程视频推荐

    计算机行业技术更新快,编程语言种类多,在当今大数据和人工智能的时代,为了能在相关领域有所成就,就必须掌握好python.R等语言,较好的数学基础和深入的行业背景知识.计算机从业人员务必践行" ...

  2. 个人新站 【EXP技术分享博客】 落成~ 全新的技术资源~ 欢迎莅临~

    对的,我筹备了大半年的个站技术网站正式开张了~ EXP技术分享博客: http://exp-blog.com CSDN上面大部分文章已经迁移过去了,以后也会更多地在新站点更新~ 为了庆祝新站开张,近期 ...

  3. B站视频下载(VideoHelper)

    继续上次的知乎爬虫, 这次开始了哔哩哔哩的爬虫实践: 首先介绍下如何下载吧: VideoHelper 里面有三种方式下载b站视频. 同样的流程, 还是先抓包,分析参数,寻找参数(包括之前的请求包和页面 ...

  4. 网易视频云技术分享:linux软raid的bitmap分析

    网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PAAS服务,在线教育.远程医疗.娱乐秀场.在线 ...

  5. B站视频下载

    借助Chrome插件 bilibili哔哩哔哩下载助手 在谷歌应用商城下载安装后在在浏览器右上角显示如下图标 打开想要下载的视频,网页右下角会有如下图标,点击该图标 点击下面的合并下载按钮即可 htt ...

  6. 史上最全Java学习视频下载地址分享

    http://blog.csdn.net/xlgen157387/article/details/39735141

  7. 腾讯技术分享:微信小程序音视频技术背后的故事

    1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...

  8. 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践

    1.概述 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和WebRTC的技术特征.差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和WebR ...

  9. 爱奇艺|B站|优酷|腾讯视频高清无水印视频下载方法(软件工具教程)

    导读:经常在大型视频网站平台上看到一些很价值和视频,希望能高清无水印下载到本地学习观看,今天小程序定制开发代码哥DaiMaGe6给大家分享一招免费下载全网高清无水印视频的方法. 高清无水印视频下载工具 ...

随机推荐

  1. Mysql-索引分析查询性能

    explain 全文只有一个关键点,那就是explain,explain 显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.简单讲,它的作用就 ...

  2. springboot多模块项目搭建遇到的问题记录

    废话不多说,直接上问题报错与解决方法. 问题报错一:(报错信息看下方代码) 问题原因:'com.company.logistics.service.company.CompanyService' 未找 ...

  3. PyQt开发实战: 利用QToolBox开发的桌面工具箱

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 toolBox工具箱是一个容器部件,对应类为QToolBox,在其内有一列从上到下顺序排列 ...

  4. PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑

    老猿Python博文目录 老猿Python博客地址 dragEnabled属性用于控制视图是否支持拖拽,可以通过dragEnabled().setDragEnabled(bool enable)进行属 ...

  5. XFF SSTI 模板注入 [BJDCTF2020]The mystery of ip

    转自https://www.cnblogs.com/wangtanzhi/p/12328083.html SSTI模板注入:之前也写过:https://www.cnblogs.com/wangtanz ...

  6. swpuCTF2019 web1 无列名注入

    上周参加的swpuctf比赛第一道web题做了好久,在最后一个小时用非预期的方法做出来了,看了官方题解之后记录一下wp里面的无列名注入. 关于无列名注入可以看一下这篇链接 https://www.ch ...

  7. 分布式计算框架-MapReduce 基本原理(MP用于分布式计算)

    hadoop最主要的2个基本的内容要了解.上次了解了一下HDFS,本章节主要是了解了MapReduce的一些基本原理. MapReduce文件系统:它是一种编程模型,用于大规模数据集(大于1TB)的并 ...

  8. 【学习笔记】浅析平衡树套线段树 & 带插入区间K小值

    常见的树套树 一般来说,在嵌套数据结构中,线段树多被作为外层结构使用. 但线段树毕竟是 静态 的结构,导致了一些不便. 下面是一个难以维护的例子: 带插入区间 \(k\) 小值问题 来源:Luogu ...

  9. 一、Nginx笔记--linux下载安装部署Nginx

    Nginx 到底是什么? Nginx  是⼀个⾼性能的HTTP和反向代理web服务器,核⼼特点是占有内存少,并发能⼒强 Nginx ⼜能做什么事情(应⽤场景) Http服务器(Web服务器) 性能⾮常 ...

  10. 如何理解group by语句

    参考文章: https://blog.csdn.net/hao1066821456/article/details/69556644 如何实现一对多关系,得到一行多列的显示方式: group by可以 ...