如何一次性下载网页目录/子文件夹中的所有文件?

如何一次性下载网页目录/子文件夹中的所有文件?

假设网站上的目录或文件夹的路径是https://superuser.xyz/images/,但您无法立即知道。通常,网站管理员不会提供子文件夹的浏览功能,即该images文件夹中没有index.html文件,因此如果有人通过猜测或获取任何图像的路径直接在 Chrome 中输入 URL,它只会返回“未找到文件夹”错误。

此外,即使可以通过文件访问该目录index.html,并且您右键单击该网页并按检查或者查看页面源代码,您可以找到该文件夹​​及其内容,但在检查视图面板中您只能一次保存其中的一个文件,效率很低。

在 google Chrome windows 10 中,如何一次性下载在线目录的所有批量内容,而不是逐个下载?

答案1

获得就是为此而设计的。它是一个 CLI 工具。

  1. 下载 wget。官方网站只提供源代码,因此你可能想要使用其他人构建的 wget(最新版本,EXE,您可能需要 x64 版本)。
  2. 转到下载 wget.exe 的文件夹,然后在文件夹背景上按 [shift] + [右键单击]。然后单击“在此处打开 PowerShell 窗口”。
  3. 现在我们可以运行命令了。例如,输入.\wget.exe --help并按回车键。这将打印一堆关于如何使用 wget 的文本。

在继续之前,我们有必要了解为什么“下载网页目录中的所有文件”是不可能的,以及 wget 是如何做到这一点的。在本地计算机上,您可以打开一个文件夹并查看其中的所有文件。HTTP 支持此功能(称为WebDAV),但几乎每个 Web 服务器都将其关闭。有些 Web 服务器有一种替代方法,它们会自动生成目录索引。这些自动生成的目录索引只是包含目录中每个文件链接的普通 HTML 页面。如果相关服务器为您执行此操作,那很好,但出于以下几个原因,它可能不执行此操作:

  • 服务器管理员已将其关闭(例如:使用Options -IndexesApache 中的设置)
  • 您感兴趣的文件夹已经设置了默认页面(因此您看到的是默认页面,而不是目录列表)

好的,我们已经确定我们需要知道文件的名称才能下载它们,但我们没有办法只列出目录中所有文件的名称。但是 wget 可以做一些聪明的事情。它可以从给定的页面开始,查找该页面引用的所有文件(图像、链接等),查找这些页面引用的所有文件,查找这些页面引用的所有页面等。这个过程被称为“抓取”网站,这是搜索引擎查找内容的方式。这种方法的一个好处是,如果您使用的服务器恰好打开了目录索引,它就可以利用这些目录索引(因为它只是一个链接页面)。

现在我们必须编写 wget 命令。wget 有很多选项,因为在抓取网站时有很多权衡。如果你抓取的速度太快,你可能会让服务器不堪重负并被禁止。如果你没有任何停止条件,你可能会试图下载整个互联网(尽管 wget 确实有默认设置来防止这种情况发生)。

.\wget.exe "https://www.example.com/foo/example.html" --recursive --no-parent --level=5

具体来说:

  • 开始于https://www.example.com/foo/example.html
  • --recursive- 做爬行的事情
  • --no-parent- 切勿下载(甚至不要查看)外部的页面https://www.example.com/foo/
  • --level=5- 最多 5 页深度

如果所有内容都在 中,那么这种方法效果很好foo。但听起来您的起点 ( example.html) 可能不在 中foo。简单(但效率低下)的选项是让 wget 下载整个站点,然后删除您不需要的目录。默认情况下,wget 不会查看您www.example.com为其提供的域 ( ) 之外的任何内容,因此这可能对您来说足够好:

.\wget.exe "https://www.example.com/example.html" --recursive --level=5

答案2

即使没有索引文件,浏览器也能够显示内容,但可以配置服务器以禁止它

如果网站允许,您可以尝试在 powershell 中使用此解决方案:如何使用 PowerShell 从 Web 下载整个文件夹的文件/子文件夹

对于 Linux 上的解决方案,你可以尝试以下操作:CURL 下载目录

相关内容