wget 会记得每个作业中哪个 URL 已经下载了吗?

wget 会记得每个作业中哪个 URL 已经下载了吗?

假设我运行 wget 来下载包含多个页面的网站或论坛主题,并从最后一页开始下载,但如您所知,它们始终链接到第一页和最后一页,因此 wget 会不断下载这些页面 - 因为它们始终存在 - 当它当前正在下载其他每个页面时?

例如我运行:

wget --mirror https://ubuntuforums.org/showthread.php?t=1422475&page=9

正如您所看到的,该线程有链接到第一页和最后一页的按钮,并且这两个按钮始终显示,因此当 wget 下载该 URL 时,它会在转到第 8 页时下载第一页和最后一页,然后在第 7 页再次下载,然后第 6 页再次下载,依此类推,或者它会记住它已经解析了第 1 页和第 9 页(第一页和最后一页),所以它会忽略后续页面上的那些?

我不想通过不断请求我已经拥有的 URL 来导致我想要存档的服务器超载。

答案1

不,wget它足够聪明,可以跟踪它下载了哪些 URL。它甚至有一个特征要利用这一点:

-k
--convert-links

下载完成后,转换文档中的链接,使其适合本地查看。这不仅会影响可见的超链接,还会影响文档中链接到外部内容的任何部分,例如嵌入的图像、样式表链接、非 HTML 内容的超链接等。

每个链接将以以下两种方式之一进行更改:

  • Wget 已下载的文件的链接将被更改为以相对链接的形式引用它们指向的文件。

    例如:如果下载的文件/foo/doc.html链接到/bar/img.gif,也下载了,则 中的链接doc.html将被修改为指向“ ../bar/img.gif”。这种转换对于任意目录组合都可靠地起作用。

  • Wget 尚未下载的文件的链接将被更改为包含主机名和它们指向位置的绝对路径。

    例如:如果下载的文件/foo/doc.html链接到/bar/img.gif(或../bar/img.gif),则 doc.html 中的链接将被修改为指向http://hostname/bar/img.gif

因此,本地浏览可以可靠地工作:如果链接文件已下载,则链接将引用其本地名称;如果未下载,则链接将引用其完整的 Internet 地址,而不是显示断开的链接。先前的链接转换为相对链接的事实确保您可以将下载的层次结构移动到另一个目录。

您也可以轻松地验证这一点,例如使用以下两个 HTML 文件:

==> foo.html <==
<html>
    <body>
        <a href="bar.html">bar</a>
    </body>
</html>

==> bar.html <==
<html>
    <body>
        <a href="foo.html">foo</a>
    </body>
</html>

并以调试输出wget递归foo.html检索内容为:

...
bar.html: merge(‘http://localhost:8000/bar.html’, ‘foo.html’) -> http://localhost:8000/foo.html
appending ‘http://localhost:8000/foo.html’ to urlpos.
no-follow in bar.html: 0
Deciding whether to enqueue "http://localhost:8000/foo.html".
Already on the black list.
Decided NOT to load it.
FINISHED --2021-01-29 20:20:29--
Total wall clock time: 0.003s
Downloaded: 2 files, 122 in 0s (16.2 MB/s)

相关内容