使用wget递归地获取包含任意文件的目录

我有一个web目录,我存储一些配置文件。我想使用wget将这些文件拉下来并保持它们当前的结构。例如,远程目录看起来像:

http://mysite.com/configs/.vim/

.vim包含多个文件和目录。我想用wget在客户端复制它。似乎无法找到正确的wget标志组合来完成这项工作。什么好主意吗?

929570 次浏览
wget -r http://mysite.com/configs/.vim/

对我有用。

也许你有一个。wgetrc干扰它?

你只要加一个-r就可以了

wget -r http://stackoverflow.com/

您必须将-np/--no-parent选项传递给wget(当然,除了-r/--recursive之外),否则它将遵循我的站点上的目录索引中的链接到父目录。所以命令看起来是这样的:

wget --recursive --no-parent http://example.com/configs/.vim/

为了避免下载自动生成的index.html文件,使用-R/--reject选项:

wget -r -np -R "index.html*" http://example.com/configs/.vim/

递归下载一个目录,该目录拒绝index.html*文件,下载时不包含主机名、父目录和整个目录结构:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data

对于其他有类似问题的人。Wget遵循robots.txt,这可能不允许您抓取站点。不用担心,你可以把它关掉:

wget -e robots=off http://www.example.com/

http://www.gnu.org/software/wget/manual/html_node/Robot-Exclusion.html < a href = " http://www.gnu.org/software/wget/manual/html_node/Robot-Exclusion.html " > < / >

下面是完整的wget命令,用于从服务器目录下载文件(忽略robots.txt):

wget -e robots=off --cut-dirs=3 --user-agent=Mozilla/5.0 --reject="index.html*" --no-parent --recursive --relative --level=1 --no-directories http://www.example.com/archive/example/5.3.0/

如果--no-parent没有帮助,你可以使用--include选项。

目录结构:

http://<host>/downloads/good
http://<host>/downloads/bad

你想下载downloads/good而不是downloads/bad目录:

wget --include downloads/good --mirror --execute robots=off --no-host-directories --cut-dirs=1 --reject="index.html*" --continue http://<host>/downloads/good

您应该使用-m (mirror)标志,因为这样可以避免混淆时间戳并无限地递归。

wget -m http://example.com/configs/.vim/

如果你加上其他人在这篇文章中提到的要点,它将是:

wget -m -e robots=off --no-parent http://example.com/configs/.vim/

使用下面的命令,递归获取用户名和密码的目录:

wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/

Wget 1.18可能工作得更好,例如,我被1.12版本的bug咬了,其中…

wget --recursive (...)

...只检索index.html而不是所有文件。

解决方法是注意到一些301重定向,并尝试新的位置-给定新的URL, wget得到目录中的所有文件。

这个版本递归下载,不创建父目录。

wgetod() {
NSLASH="$(echo "$1" | perl -pe 's|.*://[^/]+(.*?)/?$|\1|' | grep -o / | wc -l)"
NCUT=$((NSLASH > 0 ? NSLASH-1 : 0))
wget -r -nH --user-agent=Mozilla/5.0 --cut-dirs=$NCUT --no-parent --reject="index.html*" "$1"
}

用法:

  1. 添加到~/.bashrc或粘贴到终端
  2. # EYZ0

所有你需要的是两个标志,一个是"-r"递归和"--no-parent"(或-np)为了不进入'.'".."。是这样的:

# EYZ0

< p >就是这样。它将下载到以下本地树:./example.com/configs/.vim。 然而,如果你不想要前两个目录,那么使用额外的标志--cut-dirs=2,就像前面的回复中建议的那样:

# EYZ0

它只会下载你的文件树到./.vim/

事实上,我从这个答案中得到的第一行正是从wget手册中得到的,他们在4.3节的末尾有一个非常干净的例子。

下面的选项似乎是处理递归下载时的完美组合:

wget -nd -np -P /dest/dir——recursive http://url/dir1/dir2

为方便起见,手册页中的相关片段:

   -nd
--no-directories
Do not create a hierarchy of directories when retrieving recursively.  With this option turned on, all files will get saved to the current directory, without clobbering (if a name shows up more than once, the
filenames will get extensions .n).




-np
--no-parent
Do not ever ascend to the parent directory when retrieving recursively.  This is a useful option, since it guarantees that only the files below a certain hierarchy will be downloaded.

递归wget忽略机器人(用于网站)

wget -e robots=off -r -np --page-requisites --convert-links 'http://example.com/folder/'

-e robots=off使它忽略该域的robots.txt

-r使它递归

-np = no parent,所以它不会跟随链接到父文件夹

首先,感谢所有发帖的人。这是我的“终极”;Wget脚本递归下载一个网站:

wget --recursive ${comment# self-explanatory} \
--no-parent ${comment# will not crawl links in folders above the base of the URL} \
--convert-links ${comment# convert links with the domain name to relative and uncrawled to absolute} \
--random-wait --wait 3 --no-http-keep-alive ${comment# do not get banned} \
--no-host-directories ${comment# do not create folders with the domain name} \
--execute robots=off --user-agent=Mozilla/5.0 ${comment# I AM A HUMAN!!!} \
--level=inf  --accept '*' ${comment# do not limit to 5 levels or common file formats} \
--reject="index.html*" ${comment# use this option if you need an exact mirror} \
--cut-dirs=0 ${comment# replace 0 with the number of folders in the path, 0 for the whole domain} \
$URL

然后,从main.css?crc=12324567这样的url中输入剥离查询参数,并运行本地服务器(例如,通过您刚刚获得的目录中的python3 -m http.server)来运行JS可能是必要的。请注意,--convert-links选项仅在完整爬行完成后才生效。

此外,如果你正在尝试wget一个可能很快就会崩溃的网站,你应该与档案团队取得联系,并要求他们将你的网站添加到他们的ArchiveBot队列中。

听起来你是想要镜像你的文件。虽然wget有一些有趣的FTP和SFTP用途,但一个简单的镜像应该可以工作。只是一些注意事项,以确保您能够正确下载文件。

尊重# EYZ0

如果您的public_htmlwwwconfigs目录中有/robots.txt文件,请确保它不会阻止爬行。如果是这样,你需要在你的wget命令中使用以下选项来指示wget忽略它:

wget -e robots=off 'http://your-site.com/configs/.vim/'

将远程链接转换为本地文件。

此外,wget必须是指示才能将链接转换为下载的文件。如果你正确地做了上面的所有事情,你在这里应该没问题。我发现的获取所有文件的最简单方法是使用mirror命令,前提是在非公共目录下没有隐藏任何文件。

试试这个:

wget -mpEk 'http://your-site.com/configs/.vim/'


# If robots.txt is present:


wget -mpEk robots=off 'http://your-site.com/configs/.vim/'


# Good practice to only deal with the highest level directory you specify (instead of downloading all of `mysite.com` you're just mirroring from `.vim`


wget -mpEk robots=off --no-parent 'http://your-site.com/configs/.vim/'
使用-m而不是-r是首选,因为它没有最大递归深度,并且它会下载所有资产。Mirror可以很好地确定一个网站的深度,但是如果你有很多外部链接,你可能最终下载的不仅仅是你的网站,这就是为什么我们使用-p -E -k。生成页面的所有先决条件文件和保存的目录结构都应该是输出。-k将链接转换为本地文件。 因为你应该有一个链接设置,你应该得到你的配置文件夹的文件/.vim.

镜像模式也适用于设置为ftp://的目录结构。

一般经验法则:

根据您要镜像的站点的哪一侧,您将向服务器发送许多调用。为了防止你被列入黑名单或被切断,使用wait选项来限制你的下载。

wget -mpEk --no-parent robots=off --random-wait 'http://your-site.com/configs/.vim/'

但是如果您只是下载../config/.vim/文件,就不必担心忽略父目录并下载单个文件。