Loading...
墨滴

图像处理与MATLAB

2021/09/27  阅读:40  主题:姹紫

如何用Matlab一键下载B站高清视频(上)

如何用Matlab一键下载B站高清视频(上)

0. 前言

关注B站两年有余,有时看到有意思的视频很想保存下来,但在播放界面只能眼睁睁看着,找不到保存的按键......

特别对于有些学习类的视频教程,很想保存到本地以方便观看,可能 wifi 并不是无处不在,在线观看还是有一定流量成本的,那么在有免费上网的地方,有必要薅一把羊毛。

经过网上一顿狂搜,最终发现了一个非常好的B站1080p视频解析网站,名称为:贝贝bilibili-B站视频下载

如上图所示,该网站的使用非常简单,我们只需要输入B站中视频的播放地址,然后点击**<<解析视频>>**按键就可以响应得到解析后的重要视频信息了,如标题,作者,链接等。可以说这是个非常良心的API接口网站了,此处送上万千个热烈掌声......

下面以尚硅谷的 Web前端HTML5&CSS3初学者零基础入门全套完整版 视频下载为例,简要说明主要的下载过程。

我们把请求地址复制粘贴到 贝贝bilibili 中,响应得到的信息如下:

然后,直接复制表单中的 mp4 播放地址 ,在浏览器中打开就可以下载视频了!

这样机械式地下载愉快是愉快(终于可以下载B站视频了),但是面对这种教学视频,动辄就是百十来个,难道我们一个视频接一个视频的这样下载吗?愉快中增添了不少哀叹!

但对于一位 Matlab 爱好者 来说岂能这样麻烦呢,何不解放双手?

网上查了下标准的 贝贝bilibili 网址接口:https://xbeibeix.com/api/bilibili/biliplayer/?url= ,其中参数 url后面输入的是B站视频播放地址,但在抓包的过程中我彻底失败了,因为这个页面根本就没怎么响应啊 (如下动图所示),抓神马包呢,原谅我的无知,请知道的朋友们指点指点。

好吧,抓包失败了,看来得开启”曲线救国“路线了......

1. 模拟鼠标键盘

”曲线救国“ 之模拟鼠标键盘:我们日常工作中凡是批量、重复性的工作,都是能用模拟鼠标键盘帮我们完成的,比如通过 贝贝bilibili 网站下载B站视频这件事。

在介绍这部分之前,我强烈推荐一个优质的公众号:打浦桥程序员,这个公众号是与Matlab、提高工作效率技术相关,是我经常性保持阅读的公众号,其中原创性的东西非常多,朋友们可以关注关注。

接下来用到的 ”利用Matlab模拟鼠标键盘“ 功能,即 "HaoTemplate" 中的鼠标精灵GUI工具就来源于此公众号,具体使用细节可以移步这里---> 一起摸鱼吗?用MATLAB全自动的那种...

下面来聊聊模拟的具体过程:

Step 1 首先得用 Matlab 打开本地浏览器并输入目标网址:https://xbeibeix.com/api/bilibili,进入 贝贝bilibili 网站首页,请求的源代码如下:

function openMicroEdge(url)
edgePath = '"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"';
edgeCmd = sprintf('%s %s', edgePath, url);
system(edgeCmd);
end  % end function

注意:edgePath 替换为我们本地浏览器所在地址,不同电脑的不同浏览器安装位置可能不太一样。

调用源代码:

openMicroEdge('https://xbeibeix.com/api/bilibili');

Step 2 构造并复制B站待下载的视频地址,鼠标左键点击一下输入框,然后全选输入框中的内容,再按键 backspace清除内容,最后按快捷键 Ctrl+V 就将目标地址输入到 贝贝bilibili 的表单中,待网页加载完毕后,鼠标移动 <<解析视频>> 位置,鼠标左键点击 <<解析视频>>。这些过程可以利用 鼠标精灵GUI工具 帮我们完成,将生成的模拟鼠标键盘代码稍加修改就可以了,代码如下:

import java.awt.Robot;
import java.awt.event.*;
vb = actxserver('wscript.shell');
robot = Robot;

url = 'https://www.bilibili.com/video/BV1XJ411X7Ud?p=1';
clipboard('copy', url)
pause(8)
% 创建鼠标键盘模拟代码
% 移动到点 (41,122)
robot.mouseMove(-1-1);
robot.mouseMove(41122);
pause(0.2)
    
% 左键点击
robot.mousePress(InputEvent.BUTTON1_MASK );
robot.mouseRelease(InputEvent.BUTTON1_MASK );
pause(0.2)
    
% 快捷键操作: control+a
vb.SendKeys('^a');
pause(0.2)
    
% 快捷键操作: backspace
vb.SendKeys('{backspace}');
pause(0.2)
    
% 快捷键操作: control+v
vb.SendKeys('^v');
pause(0.2)
    
% 移动到点 (833,114)
robot.mouseMove(-1-1);
robot.mouseMove(833114);
pause(0.2)
    
% 左键点击
robot.mousePress(InputEvent.BUTTON1_MASK );
robot.mouseRelease(InputEvent.BUTTON1_MASK );
pause(randNum(1))

Step 3 待响应后,需要进行翻页(下拉)到底部操作(按键 'PageDown' 按个两三次,为保证彻底下拉到网页底部,我们这里选择按下3次 'PageDown'),然后移动鼠标到title的位置,鼠标左键点击,再按快捷键 'Ctrl + A' 和 'Ctrl + C',这样我们就得到了视频的标题,保存视频会用到,这一步的代码如下:

% 快捷键操作: pagedown
for ii = 1 : 3
    vb.SendKeys('{pgdn}');
    pause(0.5)
end
% ---------------------------------------
% Get vedio title
% ---------------------------------------
% 移动到点 (94,476)
robot.mouseMove(-1-1);
robot.mouseMove(95451);
pause(0.5)

% 左键点击
robot.mousePress(InputEvent.BUTTON1_MASK );
robot.mouseRelease(InputEvent.BUTTON1_MASK );
pause(0.5)

% 快捷键操作: control+a
vb.SendKeys('^a');
pause(1)

% 快捷键操作: control+c
vb.SendKeys('^c');
pause(1)
title = clipboard('paste');
titles = split(title, ' ');
vedioTitle = titles{2};

Step 4 获取解析后视频的地址:鼠标移动到 "mp4地址" 位置处,鼠标左键点击,快捷键 'Ctrl + A' 和 'Ctrl + C', 这一步代码如下:

% ---------------------------------------
% Get vedio url
% ---------------------------------------
% 移动到点 (168,772)
robot.mouseMove(-1-1);
robot.mouseMove(128727);
pause(0.3)

% 左键点击
robot.mousePress(InputEvent.BUTTON1_MASK );
robot.mouseRelease(InputEvent.BUTTON1_MASK );
pause(0.3)

% 快捷键操作: control+a
vb.SendKeys('^a');
pause(1)

% 快捷键操作: control+c
vb.SendKeys('^c');
pause(1)

vedioUrl = clipboard('paste');

Step 5 利用 websave下载视频 outFileName = websave(vedioName, vedioUrl);

Step 6 视频下载完成后,需要移动到 贝贝bilibili 的输入网址界面,那就需要快捷键 ”PageUp“ 上拉页面操作了,这里按键 3 次,以保证上拉到最顶部,操作代码如下:

% 快捷键操作: pageup
for ii = 1 : 3
    vb.SendKeys('{pgup}');
    pause(0.5)
end

以上是下载一个视频的模拟过程,下载多个视频时可以用 for 循环来完成,需要注意的是上述代码中有很多暂停的地方,这是因为网页需要加载,需要时间,如果不暂停的话,会错误操作页面的,也就得不到我们想要的模拟请求。

下面是最终效果演示动图:

查看下载的部分视频:

模拟鼠标键盘的方法有一定的局限性,比如开始下载视频的时候,不能干其它的事情,如打开文件夹,打开其他软件等都会受到影响,因为程序要不断与浏览器界面交互;当然这对闲置的电脑这样做是完全没问题的。

知识渊博的朋友们可能已经知道了,上面这种操作是一种表单提交的问题,比如日常生活中登录微博等操作,需要向表单中提交 “用户名” 和 “登录密码” 等,然后点击登录,将表单数据发送给服务器端, 网页就会有个响应......这可以用模拟浏览器的方式完成

接下来我们利用 "Matlab 与 IE浏览器" 交互的方式爬取视频。

2. Matlab 与 ie 交互

这部分的逻辑其实很简单,即把目标网址提交到输入表单中,然后点击 <<解析视频>> 按键。那关键是如何定位输入表单所在的元素呢?

浏览器中打开 https://xbeibeix.com/api/bilibiliF12后查看 'Elements' , 定位如下图所示:

我们可以看到 <input> 这个元素有个参数 class ,值为 form-control 。同样的方法可以定位到 <<解析视频>> 按键的,为 btn btn-block btn-dark

这部分的核心代码如下:

try
    ie = actxGetRunningServer('internetexplorer.application');
catch
    ie = actxserver('internetexplorer.application');
end

inputUrl = ie.document.body.getElementsByClassName('form-control').item(1);
inputUrl.value = url;
    
jiexiBtn = ie.document.body.getElementsByClassName('btn btn-block btn-dark').item(0);
jiexiBtn.click;

表单提交,网页响应之后可以爬取我们所需要的重要信息了:视频标题 title 和 解析后的视频链接 url

通过 htmlContent = ie.document.body.innerHTML; 就可以得到详细的文本信息,再利用正则表达式匹配需要的信息。

核心代码如下:

% ---------------------------------------
%  Get title
% ---------------------------------------
pat = '(?<=<input class="form-control" aria-describedby="basic-addon1" type="text" readonly="" value=").*?(?=">)';
titles = (regexp(htmlContent, pat, 'match'))';
vtitles = split(titles{2}, ' ');
videoTitle = vtitles{2};

textContent = ie.document.body.innerText;
% ---------------------------------------
%  Get video url
% ---------------------------------------
pat = 'https://upos-sz.+logo=80000000';
videoUrls = (regexp(textContent, pat, 'match'))';
videoUrl = videoUrls{1};

最后还是利用 websave 保存视频了。

最终效果如下:

保存的部分视频:

利用 "Matlab 与 IE浏览器" 交互的方式速度上要比第一种方式有很大提升,再者爬取视频的过程中可以干其他事情了,这是很推荐的一种方法,终于可以愉快的玩耍了......

3. 最后

其实,除了上面介绍的两种方法外,我们还有另外一种常见的方式了,还是通过API接口,通过 weboptions 设置请求头参数,可以直接响应来获得结构化的数据,如 json 数据,再进行解析,这样就更方便了。这部分内容留到下次再介绍......

要想获取今天介绍的源代码,请在公众号后台回复:b站视频(上)

今天的内容就分享到这里,希望朋友们喜欢,最后祝大家生活愉快!

图像处理与MATLAB

2021/09/27  阅读:40  主题:姹紫

作者介绍

图像处理与MATLAB