用脚本批量下载漫画的每一页并改名打包

用脚本批量下载漫画的每一页并改名打包

需求

某个在线看漫画的网站,只能一页页翻,各种不方便。因此,谷月姐想把喜欢的漫画逐页批量下载回来,打包成 zip 压缩包,在本地看方便。

以前 FlashGet 有批量下载功能,但是如今 FlashGet 早已不再更新,谷月姐想了想,还是自己写个脚本吧。

具体的需求:

  1. 从某个在线看漫画的网站把漫画的所有页面批量下载回来,这个网站是用正整数给漫画的每一页编码,例如,1.jpg2.jpg3.jpg、…
  2. 1.jpg2.jpg、…、9.jpg 重命名为 01.jpg02.jpg、…、09.jpg,以免影响排序。
  3. 把所有的 jpg 文件打包成一个内部不具有目录结构的 zip 文件。

解决方案 1: 批处理文件

批处理文件是 Windows 经典的脚本解决方案,而且谷月姐对批处理比较熟,所以优先考虑用批处理。

这个批处理文件用到了两个第三方软件:Wget for Windows (下载页面) 和 7-Zip Extra for Windows (下载页面)。前者是经典的命令行下载工具,后者则是经典的压缩软件 7-Zip 的命令行版本。

以下是批处理文件的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@ECHO OFF

REM 指定代理为 http://127.0.0.1:7890,如果不需要代理,需要去掉下面这行
SET http_proxy=http://127.0.0.1:7890 & SET https_proxy=http://127.0.0.1:7890

MD output

REM 用For命令和wget(Windows版)下载漫画的每一页
REM IN后面的括号,第一个数字是页数下限(一般是1),第二个数字是步长,第三个数字是页数上限
REM 最后面的链接是漫画某一页的下载链接,注意变量%%i表示页码
FOR /l %%i IN (1,1,37) DO wget.exe -c -O .\output\%%i.jpg https://images.comic.xxx/000/033/33454/%%i.jpg

REM 用For命令把1.jpg、2.jpg……9.jpg命名为01.jpg、02.jpg……09.jpg
FOR /l %%j IN (1,1,9) DO ren .\output\%%j.jpg 0%%j.jpg

REM 用7Zip-Extra将下载回来的漫画打包,打包后的文件名是comic.zip
7za.exe a comic.zip .\output\*.*

RD /s /q output

解决方案 2: PowerShell 脚本

从 Vista 开始,微软引入了全新的面向对象的 PowerShell。PowerShell 脚本与批处理文件相比,可以说是天壤之别。用 PowerShell 编写一个脚本来批量下载漫画,无需任何第三方软件。

2023-09-05 更新:用了传参,这样可以直接在命令行中执行「`下载漫画并打包.ps1 漫画最后一页的绝对 URI`」来打包下载,也可以双击「下载漫画并打包.ps1」,然后手工输入或复制粘贴漫画最后一页的绝对 URI 来打包下载。把下列代码复制粘贴另存为「`下载漫画并打包.ps1`」文件就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 想把最后一张图的 URI,例如,https://hnt.javmobile.mobi/000/022/22751/34.jpg,拆分成前面的路径和最后的文件
# $URI="https://hnt.javmobile.mobi/000/022/22751/34.jpg"
Param([string]$URI)

# 如果没有以命令行方式输入最后一张图的 URI,那么,就在 PowerShell 窗口中提示用户手工输入
If($URI)
{
Write-Host $URI
}
else
{
$URI = Read-Host "请输入漫画最后一张图片的完整 URI,例如 https://hnt.javmobile.mobi/000/022/22751/34.jpg "
}

# 解析 URI,例如,把 https://hnt.javmobile.mobi/000/022/22751/34.jpg 转换成 https://hnt.javmobile.mobi/000/022/22751/$i.jpg 的形式
# 因为 PowerShell 5.1 的 Split 命令不支持从后往前寻找分隔符并分割字符串,因此只能写一个循环来解决,
# 如果是用 PowerShell 7.x,那么一句 $split = $URI -split '/' , -2,就完事了。
$split = $URI -split '/'
$result = -Join ($split[0],'//',$split[2],'/')
For ($i=3; $i -ile $split.Count-2;$i++)
{
$result = -Join ($result,$split[$i],'/')
}
$URIpath=$result
$Filename=$split[$split.Count-1]
$Pages=$filename.split('.')[0]
$Ext=$filename.split('.')[-1]

New-Item -Path . -Name "output" -ItemType "directory"

# 用 For 循环结合 Invoke-WebRequest 命令(或 Start-BitsTransfer 命令)下载漫画的每一页
For ($i=1; $i -ile $Pages; $i++)
{
$FullURI = -Join ($URIPath,$i,'.',$Ext)
Start-BitsTransfer -Source $FullURI -Destination .\output\$i.jpg -ProxyUsage Override -ProxyList 127.0.0.1:7890
# 也可以用这个: Invoke-WebRequest -Uri $URI -OutFile .\output\$i.jpg -Proxy http://127.0.0.1:7890

# 注意:关于代理
# 1. 上述两条命令已经分别单独指定代理为 http://127.0.0.1:7890
# 2. Invoke-WebRequest 命令要用 -Proxy 开关指定代理,代理的地址要有 http:// 前缀
# 3. Start-BitsTransfer 命令要用 -ProxyUsage Override 开关强制启用代理,用 -ProxyList 开关指定代理,代理的地址不能有 http:// 前缀
# 4. 如果不需要代理,需要手工去掉上述开关
}

# 用 For 循环结合 Rename-Item 命令把 1.jpg、2.jpg … 9.jpg 命名为01.jpg、02.jpg … 09.jpg
For ($i=1; $i -ile 9; $i++)
{
Rename-Item -Path ".\Output\$i.jpg" -NewName "0$i.jpg"
}

# 用 Compress-Archive 命令将所有 JPG 文件打包压缩
Compress-Archive -Path .\output\*.* -DestinationPath .\comic.zip -Force

Remove-Item -Path .\output -Recurse -Force

图片版权

题图:Photo by Pexels from Freerange Stock

头图:该图片由 David MarkPixabay 上发布。


求扫码打赏
“我这么可爱,请给我钱 o(*^ω^*)o”

用脚本批量下载漫画的每一页并改名打包
https://blog.kukmoon.com/4c741dc819bf/
作者
Kukmoon谷月
发布于
2023年8月8日
许可协议