本帖最后由 AronnaxM 于 2023-7-30 15:53 编辑
初来吾爱的新人,之前有看过某位大佬的帖子: 【batch】批量下载以图片存储的电子课本 https://www.52pojie.cn/thread-1803854-1-1.html(文中称“大佬原贴”)
其中介绍了如何通过wget.exe这样的工具和批处理批量下载网络上的图片,其源码在我有下载电子课本需要的时候派上了不少用场。但是由于下载下来的电子课本是JPG图片,还不能达到PDF文档的可读性,因此我想从头开始还原这位大佬@Xudaxian001 的开发过程,在此基础上详解并扩充将全部图片合并为PDF文档的相关代码。如有任何违规之处,还请管理员大大删除。
这一系列过程乍一看好像也就两个步骤:1.抓取图片并批量下载;2.将图片批量转成PDF。那就先从第一步开始吧
1.1 跟随原贴我们来到xxxx出版社官网的电子教材栏目,这里我打开一本历史课本为例。为了抓取网站中的图片,我们按下Ctrl+Shift+I打开浏览器自带的开发者工具,选中上方的"Network"(或者“网络”)这一栏后刷新网页,就能在下方的加载列表中找到网页从服务器端获得的资源。图中红框的这三条信息就是我们要找的这份电子课本中的图片资源。
1.2 右键红框中第一条信息并点击弹出菜单中的“在新标签页中打开”,我们就能在新打开的网页中看到这幅图片的全部面貌。不过这样的网址好像不像是什么文件。仔细观察网址,其中有 “ 1.jpg ” 的字样,删除在它后面的内容(红框),保留蓝框中的部分,我们就得到了一个JPG文件
1.3 得到这个新的链接以后我们可以进一步的尝试。把最后面那个数字1改成别的试试?随便改个5,恭喜你得到了这本书的第5张图片。理论上,这本书一共有几页也就决定了这个数字最大可以是几
1.4 为了让我们后续的脚本能够下载这个网站上的所有课本,我们还要看看不同课本的图片链接有什么不同点。根据1.1-1.2的方法我们打开第二本历史书中的第一页,它的地址和刚刚第一本历史书图片唯一的区别就是网址后面(红框)的那串数字发生了变化。由此我们还可以得出,这个网站上可能每本书都有一个它独一无二的ID,那么我们就可以通过书本ID和页码这两个条件来获取指定书目指定页码的图片,这是接下来批量下载部分脚本的关键(对应大佬的那个帖子)
1.5.0 为了批量下载图片,这里我们使用 “ wget.exe ” 这样一个命令行下的下载工具,将wget.exe放在程序的运行目录中,然后在此目录中的批处理脚本就可以直接调用wget的功能下载我们刚刚得到的第一张图片
[Asm] 纯文本查看 复制代码 wget [img]https://book.pep.com.cn/1437001116191/files/mobile/1.jpg[/img]
1.5.1 但是,只下载一张图片怎么行呢。看看1.4中我们得到的结论,已知ID和页码即可将图片唯一确定,我们就可以创建第一个由用户自己输入的变量pages,用于存储1.3中我们提到的一本书的总页码数
[Asm] 纯文本查看 复制代码 wget [img]https://book.pep.com.cn/1437001116191/files/mobile/%p%.jpg[/img]
1.5.2 再将这段代码放入一个循环中,循环次数就是刚刚创建的变量p,这个变量从0开始,每次循环p就增大一,这样就能实现依次下载id为1437001116191的这本书在pages范围内的所有图片了
[Asm] 纯文本查看 复制代码 set p=0
set /p pages=TotalPages:
:GetJPGs
set /a p+=1
wget [img]https://book.pep.com.cn/1437001116191/files/mobile/%p%.jpg[/img]
if %p%==%pages% exit
goto GetJPGs
最后再加上制定书本ID的相关代码,就实现了大佬原贴中的内容和效果(源码中的中文被我换成了英文):
[Asm] 纯文本查看 复制代码 @echo off
Title GetPics
set p=0
set /p id=LinkID:
set /p pages=TotalPages:
:GetJPGs
set /a p+=1
wget [img]https://book.pep.com.cn/%id%/files/mobile/%p%.jpg[/img]
if %p%==%pages% exit
goto GetJPGs
到这里,大佬原贴的代码和思路就全部分析清楚了,这段代码我们先保存为bat文件并命名为get.bat(至于为什么后面会说)接下来,我们实现附加的批量转换PDF功能。不过,直接将一堆图片变成一个完整的PDF好像还跳了一些步骤,步骤2还可以分成:2.1 单张图片转PDF;2.2PDF合并。这样是不是就清楚多了?
2.1.1 我从网上找到了ImageMagick这样一个免费创建、编辑、合成与转换图片的命令行工具,其完整开发包中负责图片格式转换的程序“mogrify.exe”可以单独掏出来使用,我们把它放到和刚刚get.bat和wget.exe同一个目录中。
2.1.2 mogrify.exe中转换JPG为PDF的语法相对简单,而且刚刚通过wget批量下载到的图片全都是按照数字命名的,所以单张图片转PDF的步骤一句话就可以搞定:
[Asm] 纯文本查看 复制代码 mogrify -format pdf *.jpg
在最后加上exit命令然后另存为mog.bat
2.2.1 接下来用另一个工具“cpdf”将刚刚转成的PDF合并成“Total.pdf”
[Asm] 纯文本查看 复制代码 cpdf *.pdf -o Total.pdf
在最后加上exit命令然后另存为cp.bat
3 到这里,理论上我们已经能实现文章标题的效果了。但实际上如果把这些代码写在一起运行,就会出现转不成PDF或者Total.pdf压根就合并不出来的情况。这是为什么呢?
由于我们刚刚的代码都是无缝执行的,也就导致了转换PDF的命令开始执行之后还没来得及把所有的图片都转换为PDF就开始运行合并PDF的命令的情况。因此我想到了start /wait *.bat 这个功能,即等待前一段代码完全执行完毕再运行下一段,也就是上文中把三段代码都分别加上exit命令并另存为三个不同的bat的原因,加上exit是为了让上一段代码运行完毕之后自动结束并运行下一段。
3.1 因此,我们在工作目录(就是刚刚放那堆bat和exe的地方)中创建start.bat,用于一次启动三个功能,内容如下:
[Asm] 纯文本查看 复制代码 @echo off
start /wait get.bat
start /wait mog.bat
start /wait cp.bat
exit
3.2 实际运行之后终于实现了标题中的功能。但是工作目录中留下了一大堆刚刚下载和转换得到的JPG和PDF文件,其中只有最终输出的Total.pdf文件才是我们想要的。因此我们最后再加上一段用于清除临时文件的代码del.bat,原理是删除目录下所有*.jpg和*.pdf格式的文件,其中那个长得很奇怪的“%~dp0”表示当前路径。为了防止Total.pdf被连同其他PDF一起删除,我们还需先用move命令把它移动到在工作目录下创建的Output文件夹中(这个自己手动建),最终del.bat代码如下:
[Asm] 纯文本查看 复制代码 @echo off
Title DelTmps
move Total.pdf Output
del %~dp0\*.jpg
del %~dp0\*.pdf
exit
3.3 想要一并执行清除临时文件的del.bat,还要把del.bat加到start.bat中,放在最后。start.bat最终长这样:
[Asm] 纯文本查看 复制代码 @echo off
start /wait get.bat
start /wait mog.bat
start /wait cp.bat
start /wait del.bat
exit
如果之前所有步骤你都没有做错的话,那么最终工作路径里面应该是这些文件:
接下来双击start.bat,输入对应的书本id和总页码,在运行结束之后你就能在Output文件夹中看到Total.pdf了。恭喜你终于成功了!
最后,完整的程序以及用到的wget.exe, mogrify.exe, cpdf.exe已经放在了Github上,点击Code > Download ZIP即可享用。
Github项目地址: github.com/AronnaxM/TextbookDownloader |