前言
最近在油猴找到一个脚本,挺有意思,它能够下载那些允许预览的文档,这个到是很常见的一种脚本,其原理大概就是自动截图得到图片,然后给你合成PDF文档。这也就是为什么只能下载那些能够预览的文档。
但是这个脚本有意思的地方在于,它就是不给你提供最后一步,只给你一个包含文档所有照片的链接,我猜它应该是将这些下载的图片上传到某个图床了,然后把它的图床链接汇总到一个表格中,至于为什么不做最后下载图片到本地这最后一步咱也不知道,也不敢议论大佬的想法,总之,这个脚本用起来很不方便。
于是就有了本篇博客,试图用 “除了生孩子其他没什么不会” 的MATLAB来解决 “最后一公里” 。
代码展示
%GETPICTURE 打开一个包含图片链接的Excel表格,并下载对应的图片
function getpicture(filename) %输入的filename为表格的绝对路径
expression = '\w*\.csv$'; %正则表达式,用于去除最后一级文件名
end_pos = regexp(filename, expression, 'start'); %得到截止的位置
path = extractBefore(filename, end_pos); %保留截止位置前的路径——上一级路径
out_path = strcat(path, 'pic_out'); %设定输出图片的路径,和原文件保持同一目录,名字可自定义
mkdir(out_path); %得先创建这个路径,因为imwrite函数不支持创建不存在的文件夹
[~, txt, ~] = xlsread(filename); %读取文件,保留字符串
for i = 1:length(txt) %遍历所有链接
pic = webread(txt{i}); %将图片下载下来
pic_path = strcat(out_path, '\', num2str(i), '.png'); %确定图片的路径及命名
imwrite(pic, pic_path); %保存图片
fprintf("已下载%d张图片\n", i); %显示进度用
end
fprintf("下载完毕\n");
end
代码里面注释已经写得非常明白了,感觉有MATLAB基础的基本能够看懂,最后实现的效果就是在表格对应的路径下创建了一个pic_out的文件夹,里面存放下载下来的图片,如下图所示。
另外,得到的表格文件如下图所示。
pic_out文件夹中如下图所示。
函数汇总
这里为方便起见,简单汇总一下使用到的一些函数,具体用法查看帮助文档。
regexp
——用来匹配正则表达式
out = regexp(str, expression, outkey)
返回 outkey 指定的输出。例如,如果 outkey 为'match'
,则regexp
返回与该表达式匹配的子字符串而非其开始索引。outkey通常的取值有:
附:参考链接 具体用法建议看帮助文档,这个链接的博客也是来自于帮助文档。
extractBefore
——获取字符串自某个位置前的字符子串
MATLAB中常用的字符串处理函数可以看看这个官方链接。
这里需要补充一点的就是xlsread函数得到的cell类型的数据更多体现的是一个数据形式,其数据格式(string,double,int)还是取决于文件内容。比如设置了txt输出之后,那么就能读取到表格中的字符串,只是在使用数据时格式要正确,要根据cell类型使用{}。
strcat
——连接字符串,和上面那个一样,也是字符串处理函数webread
——读取网页数据的函数
最开始想要在MATLAB中找一个可以下载在线图片的函数,找到了urlwrite
函数,打开其帮助文档,发现它不推荐使用这个函数,而是推荐使用webwrite
和webread
,这里由于是下载,所以使用的是webread
,然后根据帮助文档给出的案例进行探索即可。imwrite
——将图片数据保存到本地
使用webread
得到的图片数据实际上是图片的二进制码,如果想要自己查看,可以使用imshow
函数,如果需要保存到本地,那就要用到imwrite
函数了,但是这里有一个问题就是imwrite
似乎不能写入一个不存在的路径(它不能自己创建路径),会报错没有权限 。所以在使用imwrite
函数前,先用mkdir
创建一个路径。
更新 /*2022.7.19*/
在朋友的提示下,发现MATLAB还自带了一个路径处理的函数,即能实现回退到上一级目录。 这个函数是fileparts
,其用法如下所示。 官网帮助链接
此外,还可以使用字符串搜索函数,从后面开始搜索,找到第一个反斜杠\
为止。