如何用Matlab一键下载B站高清视频(下)
如何用Matlab一键下载B站高清视频(下)
文章目录
- 如何用Matlab一键下载B站高清视频(下)
- 0 前言
- 1 API接口
- 2 实现过程
- 参考文献
0 前言
N久以前分享了Matlab中利用现成的B站视频解析网站 贝贝bilibili-B站视频下载 来爬取视频,还没看到这个分享的朋友,可以戳下方的推文链接
推文链接: 如何用Matlab一键下载B站高清视频(上)
利用模拟鼠标键盘的方法有一定的局限性,即不能干涉程序与当前交互的浏览器界面
利用
Matlab
与IE
浏览器交互的方法只能适用于windows
系统上,linux
等系统并不适用;再一个问题是Matlab
创建IE
服务器对象时可能会报如下报错:
对于这个问题,目前解决的方法之一是需要重置Internet Explorer
:在Internet选项
中的高级
选项卡中选择 Internet Explorer
重置设置,然后重启电脑,无脑般地就可以用了。
当然有的电脑按照上面的设置后依然会报错,具体原因未知,目前我还没有找到其他解决的方法,不知道大家有没有好的解决方案呢?
接下来…
惨不忍睹的大型翻车现场:
限制反爬,添加了验证码!一个好的解析网站就该这样。只不过对于投机取巧的程序而言只能…
鉴于前面的两种方法都不太令人满意,何止是不太满意,根本是无法满意!那今天我们就介绍一种更常规的方法,利用API提供的接口,只需发送一个合理的请求就能得到b站视频的下载链接。
截止目前,网络上有很多爬取B站视频的帖子,大多数是利用Python的,有少部分是利用Matlab的。那为何我们还要再分一杯羹呢?原因有二:
- 此处的目的是学习和分享如何利用MATLAB爬取B站视频
- 已有的MATLAB爬取得到的B站视频是非1080P的,并且只针对单P视频
这篇推文主要的参考资料是:https://github.com/5ime/bilidown
一款开源的基于Python的爬取B站视频工具,我们参考的B站视频API接口就来源于此。
另外,已有方法《MATLAB爬虫程序,批量获取文本、图片和视频(中)》及《MATLAB爬虫程序,批量获取文本、图片和视频(下)》爬取下来的B站视频是非1080P的,下面是我们的方法和该方法下载同一视频的信息比较:(源视频地址:https://www.bilibili.com/video/BV11f4y1r7e8)
已有方法 | 我们的方法 |
---|---|
当然,我们的主要需求是下载多P视频,这就迫使我们得造这个轮子了!友情提示:不到万不得已,不要造轮子!
下面就让我们一起看看造轮子的过程吧!
1 API接口
要想下载b站上某个UP主的视频,那首先得进入到他/她的空间里,我们以"尚硅谷" 为例,其空间地址是 https://space.bilibili.com/302417610/video
,其中的数字编号 302417610
是每一个UP主独一无二的,称为**mid
**号
在下载视频时往往需要两个重要的参数:bvid
和 cid
。 bvid
(bv
号)我们在 如何用Matlab一键下载B站高清视频(上)
中已经见过,即单个视频或者多p视频都对应着一个**bvid
,而对于多p视频则有不同的cid
号来决定具体的视频地址,当然单个视频仅有一个cid
**号。
下面说明通过UP主的**mid
号来得到bvid
**
简单抓一次包吧,我们再谷歌浏览器中输入空间地址,按F12
后,查看Network
选项卡,仔细看看每一个响应,最后会定位到下面的信息:
我们将响应的URL
用新的窗口打开就会得到我们需要的**bvid
**号的重要信息了:
总结一下
指定up主的空间信息接口:
https://api.bilibili.com/x/space/arc/search?mid=指定UP主的独一无二的编号&ps=30&tid=0&pn=UP主空间的页码总数
有了**mid
和pn
这两个参数就可以查询cid
号了, 因为cid
**不会在正常访问时查看到,于是也需要调用特定接口来获取:
https://api.bilibili.com/x/web-interface/view
接口使用很简单,只有一个参数:aid(av号)或 bvid(bv号)二选一
例如:
https://api.bilibili.com/x/web-interface/view?bvid=BV1XJ411X7Ud
通过上面的接口,我们就能获得**cid
**
有了**mid
和cid
**参数,我们就可以构建playurl
接口请求了:
https://api.bilibili.com/x/player/playurl?bvid=bv号&cid=cid号&qn=80&otype=json
其中,参数qn
表示视频的质量,值设定为80可以获得高清1080p的视频,但需要注意的是我们请求时得提供cookie
,
否则下载的视频是480p的非高清
**注意:**已有方法中提供的playurl
接口为
https://api.bilibili.com/x/player/playurl?bvid=bv号&cid=cid号&qn=120&fourk=1
这两个接口在结尾处有一定的区别,大家可以都尝试做一做。
2 实现过程
接下来还是聊下代码实现吧,这个是根据我的需求来写的:
- 下载UP主所有发布的视频(这类UP一般是没有多p视频的,如
罗翔说刑法
) - 下载UP主的某个教学视频(这类UP一般是有多p视频的,如
尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版
)
bilibiliVideoMain.m
— 脚本入口
setWebOptions.m
— 设置请求头函数
bilibiliVideoInfo.m
— 由bv或者av号获取cid号的功能实现
getSinglePageVideo.m
— 实现下载单p视频
getMultiPageVideo.m
— 实现下载多p视频
对于**setWebOptions.m
**函数,源码如下:
function options = setWebOptions(cookie)
randNum = randperm(23);
randNum(randNum>=10);
options = weboptions('Timeout', randNum(1));
options.UserAgent = ...'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36';
options.RequestMethod = 'get';
options.HeaderFields = {'Cookie', cookie; 'Origin', 'https://www.bilibili.com'; ...'accept', 'application/json'; ...'accept-encoding', 'gzip, deflate, br'; ...'accept-language', 'en-US,en;q=0.8'; ...'content-type', 'application/json'; ...'Referer', 'https://www.bilibili.com'};
end % end functions
需要传入cookie
参数,获取的方法也很简单,祖传方法===>首先登陆B站,然后按键F12
刷新,在请求头中找到cookie
,如下图,然后把那划红线的一坨东西粘贴过来即可。
bilibiliVideoInfo.m
function mainInfo = bilibiliVideoInfo(mid, numberOfPage)
%bilibiliVideoInfo return some main data fou user from bilibili.com
% Inputs:
% mid string (mid = '517327498';)
% numberOfPage int (numberOfPage = 1|2|3|, ..., |n-1|n);
% Outputs:
% mainInfo struct (mainInfo.title|mainInfo.facePic|mainInfo.bvid)
% Usage:
% >>mainInfo = bilibiliVideoInfo('517327498', 5);
% mainInfo =
% title: {143×1 cell}
% facePic: {143×1 cell}
% bvid: {143×1 cell}
%
% -------------------------------------------
% Set request options
% -------------------------------------------
randNum = randperm(23);
randNum(randNum>=10);
options = weboptions('Timeout', randNum(1));
options.UserAgent = ...'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36';
options.RequestMethod = 'get';% -------------------------------------------
% Set crawl mainly data
% -------------------------------------------
mainInfo.title = [];
mainInfo.facePic = [];
mainInfo.bvid = [];for page = 1 : numberOfPagedisp([' | Climbing to the ', num2str(page), 'th page']);pause(0.2)% APIdataUrl = ['https://api.bilibili.com/x/space/arc/search?', 'mid=', mid, '&ps=30&tid=0&pn=', num2str(page)];res = webread(dataUrl, options);allInfo = res.data.list.vlist;mainInfo.title = [mainInfo.title; {allInfo.title}'];mainInfo.facePic = [mainInfo.facePic; {allInfo.pic}'];mainInfo.bvid = [mainInfo.bvid; {allInfo.bvid}'];
end % end for% mainInfo.facePic = regexprep(mainInfo.facePic, '//(.+?)', 'http://$1');
disp(' ')
end % end function
getSinglePageVideo.m
function getSinglePageVideo(mid, numberOfPage, numberOfVideoStart, saveDir, cookie)
%getSingleVideo Get a single page video
% Inputs:
% mid string (mid = '517327498';)
% numberOfPage int (numberOfPage = 1|2|3|, ..., |n-1|n);
% numberOfVideoStart int ---Video starting number
% saveDir string
% cookie string
% Outputs:
% none
%
%% Set request options
options = setWebOptions(cookie);%% Set parameters
apiUrl = 'https://api.bilibili.com/x/player/playurl?';%%
if ~exist(saveDir, 'dir')mkdir(saveDir);
endif ~exist([saveDir, '/facepics'], 'dir')mkdir([saveDir, '/facepics']);
end
%% Get video's url by cid and bvd number
mainInfo = bilibiliVideoInfo(mid, numberOfPage);
numberOfBvid = length(mainInfo.bvid);%
pat = '(?:\|)|(?:\\)|(?:\:)|(?:\*)|(?:\?)|(?:")|(?:<)|(?:>)|(?:/)';for ii = numberOfVideoStart : numberOfBvidbvid = mainInfo.bvid{ii};title = regexprep(mainInfo.title{ii}, pat, '_');res = webread(['https://api.bilibili.com/x/web-interface/view?bvid=', bvid]);% Get cid numbercid = num2str(res.data.pages.cid);res = webread([apiUrl, 'bvid=', bvid, '&cid=', cid, '&qn=80&otype=json']);% Get player urlplayUrl = res.data.durl.url;% Save face picturesdisp([' |-->Saving ', num2str(ii), 'th|', num2str(numberOfBvid), ' picture']);faceImg = imread(mainInfo.facePic{ii});imwrite(faceImg, [saveDir, '/facepics/', num2str(ii), '_', title, '.png']);% Save videodisp([' |-->Saving ', num2str(ii), 'th|', num2str(numberOfBvid), ' video']);websave([saveDir, '/', num2str(ii), '_', title, '.mp4'], playUrl, options);disp(' ------Save finished!----------')disp(' ')
end % end for
end % end function
鉴于篇幅原因,**getMultiPageVideo.m
**的源代码在这里就不展示了,想要获得获得文中所有代码的朋友门,请在公众号后台回复:bilibili视频(下) (注:和 **bilibli视频(上)**有区别,抱歉,这里b后面少了个i,纠正一下)
需要说明的一点是:对于以标题作为视频名称保存需要注意文件名是否合法的问题,因此代码中用正则表达式pat = '(?:\|)|(?:\\)|(?:\:)|(?:\*)|(?:\?)|(?:")|(?:<)|(?:>)|(?:/)';title = regexprep(mainInfo.title{ii}, pat, '_');
将标题进行了过滤。
最后调用脚本**bilibiliVideoMain.m
**源码如下:
% ------------------------------------------------
% Main script for obtain video from bilibili
% ------------------------------------------------
clear
clc
close allisSendMail = true;
cookie = ' '; % 需要将cookie粘贴到这里% ------------------------------------------------
% Obtain single page video
% ------------------------------------------------
mid = ' ';
numberOfPage = [];
numberOfVideoStart = [];
saveDir = '保存视频的文件夹名称';
getSinglePageVideo(mid, numberOfPage, numberOfVideoStart, saveDir, cookie);% ------------------------------------------------
% Obtain multi-page video
% ------------------------------------------------
bvid = 'BV1Cy4y117vt';
numberOfVideoStart = 1;
saveDir = 'shangguigu_zidingyi';
getMultiPageVideo(bvid, numberOfVideoStart, saveDir, cookie);
通过这种方法我爬取了一部分罗老师说刑法的视频,也爬取了有关尚硅谷的前端教学视频
罗老师说刑法 部分视频
|
尚硅谷微信小程序 部分视频
|
整个过程最让我受益的是爬取下来的这些视频,看了其中一部分,特别是罗老师说刑法
,除了罗老师的讲课有趣味,更重要的是让人增加一些法律、刑法方面的知识,知法懂法才能更好的做一个守法的合格公民嘛
感兴趣的朋友们可以拿到代码后亲自运行下载视频对照一下,用这种方法下载的视频原格式是flv
1080p的,这与 贝贝bilibili-B站视频下载 网站解析出来的.mp4
格式的1080p稍微有些区别,比如文件大小,但视频质量上两者差别不大。
今天的分享就到这里了,有问题请朋友们后台发消息留言,祝大家生活愉快!
参考文献
https://github.com/5ime/bilidown
https://mp.weixin.qq.com/s/3EaVntbM07J6PpLScYnb5w
https://mp.weixin.qq.com/s/SIYlNO3ZR82VF1D4nYzIgQ
如何用Matlab一键下载B站高清视频(下)相关推荐
- 【工具分享】优雅地下载B站高清视频的【神级】解决方案
是否有那么一刻,你也想过把B站上的高清视频下载下来呢?尤其是那些非常珍贵的视频,这次不下载,搞不好下次就看不到了. 1 问题怎么来的 这几天,我正瞅着给小孩找学习 启蒙英语 的资料,包括各种音频资料啊 ...
- 又一视频下载神器,一键下载b站收藏夹视频和up主所有视频
苏生不惑第219 篇原创文章,将本公众号设为星标,第一时间看最新文章. 之前分享过如何找回bilibili(b站)收藏夹里失效的视频? ,为了以防万一最好把收藏夹的视频都下载了,今天就分享几个好用的工 ...
- 宝藏下载神器,python一键下载B站视频
B站无疑是一个宝藏地带,作为一个宝藏(老)男孩,请自行忽略(老)字,B站,一个学习的天堂,请一定珍惜,好好使用!作为吃灰党资深成员,一些的好的视频无疑需要进收藏夹吃灰,相信各位好机油肯定收藏了不少小姐 ...
- 刘德华开抖音了,一键下载华仔所有无水印视频
苏生不惑第229 篇原创文章,将本公众号设为星标,第一时间看最新文章. 不老男人刘德华最近开通抖音了,我也是在微博上看到才发现的,为了看他的抖音我再次下载了抖音APP(如果有网站就好了,上次也是为了写 ...
- 【分享-快速仿站】无敌超强仿站小工具一键下载
仿站小工具 前言 看到好看的网站想扒下来自己用,照着样式写很麻烦? Ctrl + S保存下来的文件乱七八糟一团糟? 一个个页面保存比较麻烦? 一键下载不香吗? 仿站小工具 官网:https://sma ...
- 实现一键下载,批量快速爬取B站视频
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Corley 源自:快学python 一.项目概述 1.项目背景 有一天, ...
- 一键下载steam高清视频
简单的爬虫,配合列表UI,实现steam高清视频一键下载. 实际使用效果: 1.选中链接,实用超级面板,直接弹出下载列表. 本页可下载视频列表 点击后命令行调用IDM下载 整个过程连贯流畅,非常方便. ...
- 开源神器:如何用一行代码快速下载 B 站等全网视频!
公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 大家前两天朋友圈应该都被何冰老师<后浪>演讲视频刷屏了,小破站属 ...
- 一键下载各大网站视频,包括b站(you-get)
推荐一个神器you-get!!! 最近,想下载b站视频,然后电脑上没有缓存按钮,网上查了半天,都是一个一个下载的,然而我想批量,于是乎就有了you-get! 1.首先安装python 2.安装you- ...
最新文章
- 单个GPU无法训练GPT-3,但有了这个,你能调优超参数了
- Laravel php artisan optimize 源码解读
- c++美发店管理系统设计_美发店如何打造会员管理系统?掌柜智囊—收银机必不可少...
- 少儿德国奎尔鱼油(QÜELL FISH OIL FOR JUNIOR )
- 混淆视听的感脚(二)
- Android开发之Android Studio 3.6新特性之获取控件id的高级方式ViewBinding
- Maven知识- repositories
- spring 如何决定使用jdk动态代理和cglib(转)
- Entry模拟对输入的密码进行验证是否符合规范
- ASCII码对照表 包含二进制、十进制、十六进制
- 编解码格式 -- H264
- 计算机英语辅助翻译软件,计算机辅助翻译(CAT)软件 计算机辅助翻译(CAT)软件 v6.3.0.616...
- 内置式永磁同步电机IPMSM,基于虚拟信号注入法最大转矩电流比MTPA控制仿真模型
- (十二)GA-RPN----2019CVPR论文解读
- 浅析资产配置的几种方法
- linux sync 同步文件夹,linux-日常运维-文件同步工具-rsync
- mysql 多字段求和_sql数据库多字段求和
- oracle erp系统好用么,oracleerp系统优缺点
- 2018年最新北京落户名单统计分析
- 说说翻转的数据结构课
热门文章
- 易信客户端导出聊天记录方法
- 会议投稿视频制作流程
- 美国开发新软件 有助于找回不翼而飞的电脑
- python爬取站_简单python爬虫练习 E站本爬取
- 独立成分分析(ICA)降噪应用时存在哪些问题?
- 07JavaEE第七章spring
- CSDN问答新增打赏及@用户功能【8月9日】
- Opencv学习----位图(bitmap)原理详解三---位图解析度
- 谷歌搜索技巧:搜索语法 隐藏彩蛋 高级设置
- php中censor()的用法,两份PHP程序代码对比,大家认为其编程水平都如何样?censor.class.php...