AronnaxM 发表于 2023-7-30 15:49

Batch修改:从网站图片到电子课本的详细思路

本帖最后由 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的功能下载我们刚刚得到的第一张图片

wget https://book.pep.com.cn/1437001116191/files/mobile/1.jpg

1.5.1 但是,只下载一张图片怎么行呢。看看1.4中我们得到的结论,已知ID和页码即可将图片唯一确定,我们就可以创建第一个由用户自己输入的变量pages,用于存储1.3中我们提到的一本书的总页码数

wget https://book.pep.com.cn/1437001116191/files/mobile/%p%.jpg

1.5.2 再将这段代码放入一个循环中,循环次数就是刚刚创建的变量p,这个变量从0开始,每次循环p就增大一,这样就能实现依次下载id为1437001116191的这本书在pages范围内的所有图片了

set p=0
set /p pages=TotalPages:
:GetJPGs
set /a p+=1
wget https://book.pep.com.cn/1437001116191/files/mobile/%p%.jpg
if %p%==%pages% exit
goto GetJPGs

最后再加上制定书本ID的相关代码,就实现了大佬原贴中的内容和效果(源码中的中文被我换成了英文):

@echo off
Title GetPics
set p=0
set /p id=LinkID:
set /p pages=TotalPages:
:GetJPGs
set /a p+=1
wget https://book.pep.com.cn/%id%/files/mobile/%p%.jpg
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的步骤一句话就可以搞定:

mogrify-format pdf*.jpg

在最后加上exit命令然后另存为mog.bat

2.2.1 接下来用另一个工具“cpdf”将刚刚转成的PDF合并成“Total.pdf”

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,用于一次启动三个功能,内容如下:

@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代码如下:

@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最终长这样:

@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

LeeYuankey 发表于 2023-7-31 15:23

本帖最后由 LeeYuankey 于 2023-7-31 15:28 编辑

谢谢分享,试用感觉很不错,作了点小修改。
1.将下载的图片保存在GetPics文件夹下;
2.将输出的PDF文档保存在Output文件夹下;
3.在cp.bat中增加了将页面调整A4页面的命令和压缩命令(虽然压缩率并不大)。
另外,发现一个问题,不知道各位在使用的时候是不是有这样的情况。使用cpdf.exe合并PDF文档时页码有问题,原因是用cpdf.exe合并时是按1.pdf、10.pdf、100.pdf-199.pdf、2.pdf、20.pdf、200.pdf-299.pdf、……这样的顺序合并的,解决这个问题的办法是需要人工将1.pdf-9.pdf重命名为001.pdf-009.pdf、10.pdf-99.pdf重命名为010.pdf-099.pdf,然后cpdf.exe就能够按正确的顺序合并PDF文档了,因此,增加了重命名的批处理,但是限于本人的DOS功底,批处理中只能逐个重命名,让大家见笑了,同时也将该批处理添加到star.bat中了。所有文件重新打包上传百度网盘,请多多指教。
链接:https://pan.baidu.com/s/1AIbPAViYtgFBHTlHqZ8_zw?pwd=np3z

skymxw 发表于 2023-7-30 17:05

ID和页数应该在网页源代码里能够找到吧,这样就更智能化了{:1_918:}

lxh1103 发表于 2023-7-30 17:06

好家伙,可以可以

luckyear 发表于 2023-7-30 17:12

学习了,谢谢分享{:1_921:}

xiaopeng128 发表于 2023-7-30 17:21

学习了,谢谢分享{:1_893:}

Evan2023 发表于 2023-7-30 17:49

厉害了,高人!

Xudaxian001 发表于 2023-7-30 17:53

之前还没想到怎么转换pdf的问题,学到了

AronnaxM 发表于 2023-7-30 17:56

Xudaxian001 发表于 2023-7-30 17:53
之前还没想到怎么转换pdf的问题,学到了

终于等到原作者本人回帖了

54BT 发表于 2023-7-30 18:06

好家伙,好东西啊

moruye 发表于 2023-7-30 21:35

页: [1] 2
查看完整版本: Batch修改:从网站图片到电子课本的详细思路