1

我正在尝试使用 wget 下载网站中文件夹下的所有文件夹结构和文件。

假设有一个网站,例如:

http://test/root. Under root it is like


/A

    /A1/file1.java

/B

    /B1/file2.html

我的 wget cmd 是:

wget -r http://test/root/

我得到了所有文件夹和 html 文件,但没有 java 文件。这是为什么?

更新1:

我可以使用以下方法在浏览器中访问该文件:

http://test/root/A/A1/file1.java

我也可以使用以下方法下载这个单独的文件:

wget http://test/root/A/A1/file1.java
4

2 回答 2

1

wget可以按照链接

如果没有指向子目录中文件的链接,则 wget 将找不到这些文件。wget不会猜测任何文件名,不会详尽地测试文件名,wget也不会练习黑魔法。

于 2012-08-02T21:36:25.680 回答
0

仅仅因为您可以在浏览器中访问文件并不意味着wget一定可以检索它。您的浏览器具有能够识别目录结构的代码,wget只知道您告诉它什么。

您可以先尝试将 java 文件添加到accept列表中,也许这就是它所需要的:

wget -r -A "*.java" http://text/root

但听起来您正试图获得该站点的完整离线镜像。让我们开始——就像我们试图弄清楚的任何命令一样——使用man wget

Wget 可以跟踪HTML、XHTML 和 CSS 页面中的链接,创建远程网站的本地版本,完全重建原始站点的目录结构。这有时被称为“递归下载”。在这样做的同时,Wget 尊重机器人排除标准 (/robots.txt)。可以指示 Wget 将下载文件中的链接转换为指向本地文件,以便离线查看。

我们需要的

1. 要下载的文件的正确链接。

在您的intex.html文件中,您必须提供指向 Java 文件的链接,否则wget将无法识别为需要下载。对于您当前的目录结构,确保file2.html包含指向 java 文件的链接。将其格式化为链接到当前目录之上的目录:

<a href="../test/root/A/A1/file1.java">JavaFile</a>

但是,如果file1.java不敏感并且您经常这样做,则将index.html文件放在root目录中并链接到以下内容会更简洁且代码更少:

<a href="/A/A1/file1.java">JavaFile</a>

如果你想要 Java 文件并想忽略 HTML,你可以--reject像这样使用:

wget  -r -nH --reject="file2.html"
### Or to reject ALL html files ###
wget -r -nH --reject="*.html"

这将递归地 ( -r) 从我们指定的点开始遍历所有目录。

2. 尊重robots.txt

确保如果您的目录/robots.txt中有文件,*/root/*它不会阻止爬网。如果是这样,您需要wget使用命令中的以下选项wget通过添加来指示忽略它:

wget ... -e robots=off http://test/root

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

此外,wget必须指示将链接转换为下载的文件。如果您已正确完成上述所有操作,那么您应该没问题。我发现获取所有文件的最简单方法是使用mirror命令,前提是在非公共目录后面没有隐藏任何内容。

尝试这个:

wget -mpEk http://text/root/

# If robots.txt is present:

wget -mpEk robots=off http://text/root/

首选使用-m代替,-r因为它没有最大递归深度并且它会下载所有资产。Mirror 非常擅长确定站点的完整深度,但是如果您有许多外部链接,您最终可能会下载的不仅仅是您的站点,这就是我们使用-p -E -k. 制作页面的所有先决条件文件和保留的目录结构应该是输出。-k将链接转换为本地文件。由于您应该设置一个链接,因此您应该file1.java../A1/目录中获得一个。但是,此命令应该按原样工作,而无需将特定链接放置到您的index.html或内部的 java 文件中,file2.html但它不会受到伤害,因为它保留了目录的其余部分。镜像模式也适用于设置为ftp://还。

一般经验法则:

根据您正在做镜像的站点的一侧,您正在向服务器发送许多调用。为了防止您被列入黑名单或被切断,请使用该wait选项来限制您的下载。如果它是您发布的站点一侧的站点,则不必这样做,但是您要镜像的任何大型站点都需要使用它:

wget -mpEk --no-parent robots=off --random-wait http://text/root/
于 2021-09-02T05:02:55.837 回答