图图今天来聊聊基于MATLAB的爬虫,互联网上真不多见。
下方是图图爬取的成果!
随时感知所有视频,点击超链接直接观看
     批量获取封面图片,对不住了‘毕导’
     批量下载视频,B站大学变离线
     1. 爬虫是什么?
爬虫是用编程语言构造的检索引擎,它模拟人的浏览行为去各个网站溜达,到处点点按钮、查查数据,然后把看到的有用信息背回来。就像一只“蜘蛛”(爬虫)在“网上”(互联网)爬来爬去。一旦搜集到的信息足够多,就形成了巨大的价值!
对于个人使用者来说,爬虫的作用无非是搜集数据!图图写爬虫程序的出发点也是搜集自己在B站发布的视频与视频封面,方便自己进行统计。
网络上关于的爬虫程序铺天盖地,但基于MATLAB制作的爬虫程序少之又少,今天图图来贡献自己的一份力,降低大家的学习成本。爬取的目标是,仅对自己感兴趣的数据进行了爬取,包括
形成了EXCEL表格
同时将视频的封面和视频本身下载到了一起
其它内容原理都是一样的,如果需要更多数据,只要进行简单的输出即可!
2. 爬取B站的原理
总体步骤:输入UP主的编号与视频编号,不断变换、拼接成为路径,通过MATLAB去模拟浏览器访问。将访问得到的信息进行整理得到自己想要的关键内容,利用MATLAB输出关键内容。
因为详细的教程已经录制了视频:
        
        所以图图此处就列出一些关键点,重点需要关注的有如下信息:
2.1 UP主的mid
mid在UP主个人空间的主页链接中
     2.2 一条视频的bvid
bvid在视频播放页的地址栏中
有了和就基本确定了任意一条视频
     2.3 进入开发者模式查看网页代码
     3. 爬取B站的MATLAB代码
须知
3.1 主函数 main()
主函数主要是用于确定爬取的对象,控制爬取的过程,以及决定要保存哪些文件。
A-B-C-D-E-F-G只是为了方便阅读而拆分,实际是按顺序书写在同一个文件中的。
重点关注的输入参数就是,即你要爬取哪一个UP主,其它的参数基本都可以不动。用于设置访问的时间间隔,防止IP被封。控制下载视频的清晰度。
在C部分具有 选项用于设置一些访问的方式,有兴趣的可以参考Python中有关的介绍——。
D部分用于访问获取所需的数据data,其中就包含了封面图链接和视频链接(播放页面的链接而不是下载链接)。
data是一个结构体,其具体形式如下:
     
     A
% 爬取B站
% -------------------------------------------------------------------------
% 编写时间: 2021/01/15 可能具有时效性,编写环境: MATLAB 2020a
% 参考文档: web('https://zhuanlan.zhihu.com/p/163293093')'
% 访问格式: https://api.bilibili.com/x/space/arc/search?mid=280793434&ps=30&tid=0&pn=1
% mid: UP主编号
% ps: 是当前加载视频的格式;
% tid:一直为 0 即可;
% pn 是翻页;
   B
clear;clc;close('all')
%% 初始化目标UP主数据
mid = '254463269';%毕导
ps = '25';      % 视频格式
qn = '112';     % 下载视频清晰度
tid = '0';
pn = '1';       % 从第一页开始
COUNTER = 5;    % 控制循环次数
delaytime = 2;  % 控制暂停时间
   C
%% 设置请求参数
options = weboptions();
options.UserAgent = ...
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36';
options.RequestMethod = 'GET';
   D
% 发生请求获取数据
data = getBiliData(mid,pn,ps,tid,COUNTER,delaytime,options);
   E
%% 保存文本数据
saveCon(data);
   F
%% 保存图片数据
savePic(data,delaytime);
   G
%% 保存视频文件
saveVid(data,qn,delaytime)
   3.2 访问得到数据getBiliData()
用到的核心函数是
     详细介绍的网址;
https://www.mathworks.com/help/releases/R2019b/matlab/ref/webread.html
   
function data = getBiliData(mid,pn,ps,tid,COUNTER,delaytime,options)
% 爬取数据
data.author = [];
data.title = [];
data.video = [];
data.pic = [];
data.bvid = [];
disp('>正在爬取...')
%% 循环读取数据
res = webread(['https://api.bilibili.com/x/space/arc/search?mid=' mid '&ps=' ps '&tid=' tid '&pn=' pn]);
temp = res.data.list.vlist;
while ~isempty(temp) || COUNTER<5
    disp([' | 正在爬取第' pn '页!' ]);
    data.author = [data.author;{temp.author}'];
    data.title = [data.title;{temp.title}'];
    data.video = [data.video;{temp.bvid}'];
    data.pic = [data.pic;{temp.pic}'];
    data.bvid = [data.bvid;{temp.bvid}'];
    pn = pn+1;
    COUNTER = COUNTER+1;
    res = webread(['https://api.bilibili.com/x/space/arc/search?mid=' mid '&ps=' ps '&tid=' tid '&pn=' pn],options);
    temp = res.data.list.vlist;
    pause(delaytime);
end
for i = 1:size(data.bvid,1)
    data.bvid{i} = ['https://www.bilibili.com/video/' data.bvid{i}];
end
disp('__爬取结束!')
   3.3 生成文本文件
saveCon(data)
function saveCon(data)
% 保存文本数据
filename =  [data.author{1} '__B站视频数据.xlsx'];
writematrix([1:length(data.pic)]',filename,'Sheet','B站视频数据','Range','A2')
writecell(data.author,filename,'Sheet','B站视频数据','Range','B2')
writecell(data.title,filename,'Sheet','B站视频数据','Range','C2')
for i = 1:length(data.pic)
    temp{i} = ['http:' data.pic{i}];
end
writecell(temp',filename,'Sheet','B站视频数据','Range','D2')
writecell(data.bvid,filename,'Sheet','B站视频数据','Range','E2')
writecell({'序号' 'UP主' '视频标题' '封面链接' '视频链接'},filename,'Sheet','B站视频数据','Range','A1')
   3.3 获取图片
保存图片相对简单,我们只需使用websave()将图片存到本地的指定路径即可。
function savePic(data,delaytime)
%
% 保存视频封面图片
%
% 在当前目录创建一个文件夹
folderName = [data.author{1} '__B站视频封面图'];
mkdir(folderName);
disp('>正在保存图片...')
for i = 1:size(data.pic,1)
    websave([pwd '\' folderName '\' data.author{i} '__' num2str(i), '.png'],['http:' data.pic{i}]);
    disp([' | 正在保存第' num2str(i) '张'])
    pause(delaytime/4)
end
disp('__所有图片保存成功!')
   3.4 获取视频文件
保存视频文件比较复杂,B站进行了层层加密,我们需要不断的改变参数进行访问,最后再使用websave()将视频存到本地的指定路径。
具体的步骤如下:
A 创建文件夹
function saveVid(data,qn,delaytime)
% 爬取并下载视频
% 参考 https://www.bilibili.com/read/cv6415114/
folderName = [data.author{1} '__B站视频合集'];
mkdir(folderName);
   B 与上一期相同,设置访问的UserAgent
options = weboptions();
options.UserAgent = ...
    '密密密密密密密密密密密密密密密密密密密密密密密密密密密密密密密密';
options.RequestMethod = 'GET';
   C 获取,是一个访问参数,但是不是显示的
disp('>正在保存视频...')
for i = 1:length(data.bvid)
    disp([' | 正在保存第' num2str(i) '个视频'])
    bvid = data.bvid{i}(length('https://www.bilibili.com/video/')+1:end);
    % 根据 bvid查找cid
    res = webread(['https://api.bilibili.com/x/web-interface/view?bvid=' bvid ]);
    cid = res.data.cid;
   D 获取视频的下载链接(加密的)
% 根据cid和bvid查找视频播放链接
% res = webread(['https://api.bilibili.com/x/player/playurl?bvid=' bvid '&cid=' num2str(cid) '&qn=' qn]);
% 大会员画质?
res = webread(['https://api.bilibili.com/x/player/playurl?bvid=' bvid '&cid=' num2str(cid) '&qn=120&fourk=1']);
vURL = res.data.durl.url;
   E 用去访问加密的下载链接得到视频
% 设置标头'referer'为播放页,否则403
    options.HeaderFields = matlab.net.http.HeaderField('referer',['https://www.bilibili.com/video/' bvid]);
    websave([pwd '\' folderName '\' data.author{i} '__' num2str(i), '.mp4'],vURL,options);
    pause(delaytime)
end
disp('__所有视频保存成功!')