我正在使用 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
还会列出目录static
和media
,因此您可以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
结果,您应该为此做好准备。