在选择下载之前获取网站/网页上的文件列表(以类似于“ls”的方式)

在选择下载之前获取网站/网页上的文件列表(以类似于“ls”的方式)

假设我所在的网页上有多个 pdf 文档的超链接。我想下载那些pdf。有没有一种方法可以获取这些文档的列表(以某种ls方式),然后可以更好地选择使用wget或来下载哪个文件curl

答案1

您可以使用lynxlinks(文本模式 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 链接,然后您可以将其复制到文本编辑器并进一步编辑。

相关内容