最近无聊分析了一下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. moviepy音视频剪辑:视频剪辑基类VideoClip详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...

  2. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项下子项的指示符展示原则childIndicatorPolicy

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项下可以有子项,如果存在子项,则父项 ...

  3. PyQt学习随笔:截获窗口Widget组件的关闭事件

    在PyQt中,QWidget类对应基础的窗口组件,如果要在窗口组件关闭时截获关闭事件,提供自己的控制机制,则可以通过在自定义的派生类中重写closeEvent方法. 重写closeEvent方法的语法 ...

  4. Java 8 中的方法引用,轻松减少代码量,提升可读性!

    1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...

  5. 简单且实用的关闭当前应用的auto.js 代码

    function closeCurrentPackage() { // 可以稍加修改,关闭指定app let packageName = currentPackage(); app.openAppSe ...

  6. swagger添加统一认证参数

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Co ...

  7. pl/sql12;pl/sql14激活注册码

    搜集的plsql 12激活码: Product Code(产品编号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number(序列号):601769 pass ...

  8. 剑指offer二刷——数组专题——数字在升序数组中出现的次数

    题目描述 统计一个数字在升序数组中出现的次数. 我的想法 完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上"升序数组"的这个条件. 题目标签有提醒可以用 ...

  9. 关于VS.Net应用的图标提取方法

    .Net的资源文件 VS.Net 支持三种文件类型的resource:.txt..resx..resources. system.resources 名字空间支持三种资源文件: txt 文件,只能有字 ...

  10. NOI Online 题解

    T1 对\(t_i = 1\)的边,将\(u_i, v_i\)连一条边权为\(1\)的边.否则连一条边权为\(0\)的边. 对于每一个连通块,若图中不存在一条边权之和为奇数的圈,则可以将这个连通块二染 ...