假设我所在的网页上有多个 pdf 文档的超链接。我想下载那些pdf。有没有一种方法可以获取这些文档的列表(以某种ls
方式),然后可以更好地选择使用wget
或来下载哪个文件curl
?
答案1
您可以使用lynx
或links
(文本模式 Web 浏览器)下载并显示网页中的链接列表,然后将其通过管道传输grep
以仅提取 PDF 链接。例如:
URL='https://www.example.com/files/'
lynx -dump -listonly -nonumbers "$URL" | grep -i '\.pdf$'
注意:双引号很重要"$URL"
,特别是当 URL 包含空格或 shell 元字符(例如;
或&
,在 URL 中很常见)时。省得你头疼总是在使用 URL 字符串和包含 URL 的变量时对其进行引号(事实上,在使用变量时使用双引号几乎总是一个好主意,无论它们是否包含 URL - 请参阅为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?)。
然后,您可以将grep
的输出重定向到一个文件,使用文本编辑器对其进行编辑以删除您不感兴趣的 PDF 文件,然后使用 的wget
( -i
)--input-file=file
选项下载文件中的所有 URL。或者您可以使用wget
或一次手动下载它们curl
。
顺便说一句,wget
还有一个用于镜像网站的-m
( ) 选项,以及用于精确控制下载内容的众多选项(例如,接受或拒绝与后缀或某些类似 glob 的模式匹配的文件 -或- 和&--mirror
-A
-R
-A pdf
-A '*.pdf'
--accept-regex
--reject-regex
对正则表达式执行相同操作),并控制 wget 是否会跟踪其他站点的链接(以及哪个其他站点),是否跟踪父目录或子目录的链接(以及深度多少级)等等。有很多选项,选项组合之间的交互甚至更多,所以不要指望立即掌握它。
答案2
您没有指定您所指的网页,但如果它提供了文件列表,例如https://ftp.gnu.org/gnu/tar你可以使用lftp:
$ lftp https://ftp.gnu.org/gnu/tar/
cd ok, cwd=/gnu/tar
lftp ftp.gnu.org:/gnu/tar> ls
(...)
-rw-r--r-- 181 2021-02-13 06:32 tar-latest.tar.bz2.sig
-rw-r--r-- 4.2M 2021-02-13 06:32 tar-latest.tar.gz
-rw-r--r-- 181 2021-02-13 06:32 tar-latest.tar.gz.sig
-rw-r--r-- 2.1M 2021-02-13 06:33 tar-latest.tar.xz
-rw-r--r-- 181 2021-02-13 06:33 tar-latest.tar.xz.sig
您现在可以在本地文件系统上创建一个目录,更改为该目录并下载文件:
lftp ftp.gnu.org:/gnu/tar> !mkdir /tmp/download
lftp ftp.gnu.org:/gnu/tar> lcd /tmp/download
lcd ok, local cwd=/tmp/download
lftp ftp.gnu.org:/gnu/tar> get tar-latest.tar.xz
2022-01-02 14:54:21 https://ftp.gnu.org/gnu/tar/tar-latest.tar.xz -> /tmp/download/tar-latest.tar.xz 0-2226068 1.72 MiB/s
2226068 bytes transferred in 1 second (1.72 MiB/s)
或使用命令的多个文件mget
。
答案3
使用 Ctrl+Shift+I 在浏览器中打开开发人员控制台,然后转到“控制台”选项卡。然后粘贴此代码并按 Enter:
let allLinks = ""
document.querySelectorAll("a").forEach(item => {
if(item.href.endsWith("pdf")){
allLinks += item.href + "\n"
}
})
console.log(allLinks)
这将在控制台中列出所有 pdf 链接,然后您可以将其复制到文本编辑器并进一步编辑。