我正在尝试使用以下命令下载站点:
wget -r -l 0 -p -k -m -e robots=off --restrict-file-names=nocontrol,unix http://example.com
例如,当它找到链接时http://example.com/direction
,它会在磁盘上创建一个文件./example.com/direction
然后,例如,它在“方向”中找到一些其他文件(链接),假设http://example.com/direction/11
用一些 HTMLwget
重写旧文件./example.com/direction
,并将其转换到目录中。然后./example.com/direction/11
在那里写入新文件。
如果它在里面发现一个新文件/direction/11
,那么它也会重写11
并将其转换为目录。
因此,看来我丢失了所有目录索引文件。
wget 本身有解决这个问题的办法吗?
答案1
这可能并不适用于所有情况,但我能够使用一个有点出乎意料的标签来解决这个问题。
来自 wget 1.17.1 手册:
‘-E’
‘--adjust-extension’
‘application/xhtml+xml’
如果下载了类型为或的文件‘text/html’
且 URL 不以 regexp 结尾‘\.[Hh][Tt][Mm][Ll]?’
,则此选项将导致将后缀‘.html’
附加到本地文件名。
因此,在您的情况下,当 wget 找到链接时http://example.com/direction
,它将检查页面是否为 html 格式。如果是,它将把它作为 保存到本地磁盘/example.com/direction.html
。然后当它看到 时http://example.com/direction/11
,它将把它作为 保存到磁盘/example.com/direction/11
,这样就不会覆盖第一个文件。假设真正的目录结构是/example.com/direction/index.html
,它不会与远程目录结构完全匹配,但至少它不会错误地覆盖文件。
答案2
好吧,仅使用 Wget 来解决这个问题几乎是不可能的。让我先试着向你解释一下这个问题。
首先,Wget 尝试下载http://site.com/direction
。当 Wget 发送此路径的请求时,服务器将使用中可用的数据进行响应http://site/com/example/index.html
。但是,此时,Wget 还不知道发送给它的数据对应于路径:example/index.html。现在,当 Wget 找到另一个文件时,http://site.com/example/11
同样的事情又会发生。但是,它必须首先创建目录 example/,然后无条件删除旧文件才能执行此操作。在我看来,Wget 应该检测它是否正在用目录替换文件并将文件保存为索引文件。但是,到目前为止,它还没有这样做。