使用 --mirror 时 wget 会跳过不以斜线结尾的链接的 index.html

使用 --mirror 时 wget 会跳过不以斜线结尾的链接的 index.html

我正在使用 wget --mirror --convert-links 来镜像网站,并且我发现当该网站包含指向子目录的链接时,例如:

<a href="subdir">

这将在 Web 浏览器中显示 subdir/index.html 的内容,wget 正在获取索引.html 中链接到的文档,但不是索引.html 本身。

如果我将链接更改为:

<a href="subdir/">

然后index.html也被获取。

我可以在 wget 命令上放置一个标志以使其自动执行此操作吗?

我在 CentOS 7 下使用 wget 版本 1.14。

答案1

Wget 应该将页面保存为subdir.目标路径和文件名基于链接结构(而不​​是基于应用任何重定向后的最终 URL)。

您可以添加选项-E将文档另存为subdir.html.我知道,它并不完美。

答案2

我也遇到了这个问题。这似乎是早就知道的,不可能用 pure 做到这一点wget。我开了一个wget 跟踪器上的问题。在这里我提出几个我想到的解决方案。

手动下载目录

首先,您需要下载所有可以下载的内容:

wget -c --no-check-certificate --recursive --page-requirements --no-clobber --domains mysite.org --exclude-directories=/loginhttps://mysite.org

然后,手动保存需要保存find的本地目录列表 ( ):-type d

find mysite.org -path 'mysite.org/static' -prune -o -type d

自从静止的人们不太可能浏览,我们不会将其另存为索引.html,并且find操作-prune禁用该路径上的搜索。它有更详细的解释堆栈溢出。当您想要禁用多个路径时,请使用括号。完整的脚本是:

for dir in `find mysite.org \( \
        -path 'mysite.org/static' -o \
        -path 'mysite.org/media' \)
    -prune -o -type d`
do
    echo $dir
    wget --force-directories $dir -O $dir/index.html
done

由于我们逐一下载文件,因此我们使用完整的本地路径保存它们--force-directories(否则它们将保存到当前目录)。另外,我们需要手动提供带有-O选项的输出文件名(否则wget将拒绝将结果保存到现有目录)。

不幸的是,find还会列出目录staticmedia,因此您可以grep在之后使用(我忽略了)。您还可以将所需的目录名称保存到文件中并使用它wget -i links.txt- 但是,在这种情况下,您将无法为这些链接提供输出文件名。

仅下载目录

我尝试仅下载目录(以斜线结尾的链接):

wget -pr -A '/,index.html' https://mysite.org/

这里,-A/--accept是要接受的文件名后缀或模式的逗号分隔列表。-p和以前一样,是为了保存页面必需品(它也保存本地目录结构)并且-r用于递归。第一个后缀意味着我们有一个目录(以“/”结尾),而第二个后缀是保存该目录所必需的:没有它,结果索引.html将被立即删除。

不幸的是,这对我的网站不起作用,因为有些链接以斜杠结尾,有些链接则不然。没有办法以其他方式区分“目录”路径和最终链接,并且链接末尾的斜杠看起来像是多余的符号,所以我放弃了这个想法。

最后的评论

下载站点可能需要一段时间,因此如果您从服务器进行下载并希望在一段时间后断开连接,请使用nohup.

我想提一下我发现的一件奇怪的事情。有时wget将 html 页面与服务器响应一起保存,即可以在页面开头看到几行技术信息(“HTTP/1.1 200 OK”等)。我不确定这是否是wget我的旧nginx服务器的问题,但也可以通过重新下载损坏的页面来手动修复:

grep -RIl nginx * > bad.txt
wget -x -i bad.txt

确保首先删除损坏的页面,因为如果它们存在,则不会重新下载它们(如果没有或,wget我找不到覆盖该页面的密钥)。-r-p

也许这个细节与问题无关,但它表明仍然需要手动干预才能获得wget结果,您应该为此做好准备。

相关内容