25

Wget 具有-H“跨度主机”选项

Span to any host—‘-H’
The ‘-H’ option turns on host spanning, thus allowing Wget's recursive run to visit any host referenced by a link. Unless sufficient recursion-limiting criteria are applied depth, these foreign hosts will typically link to yet more hosts, and so on until Wget ends up sucking up much more data than you have intended. 

我想做一个递归下载(比如第 3 级),我想获取图像、样式表、javascript 等(即正确显示页面所需的文件),即使它们在我的主机之外。但是,我不想跟随指向另一个 HTML 页面的链接(因为那样它可以转到另一个 HTML 页面,以此类推,然后数字可能会爆炸。)

有可能以某种方式做到这一点吗?对于图像/样式表/javascript案例和链接案例,选项控件似乎-H跨越到其他主机,而wget不允许我将两者分开。

4

5 回答 5

19

下载页面中的所有依赖项

第一步是下载特定页面的所有资源。如果您查看wget 的手册页,您会发现:

...要下载单个页面及其所有必需品(即使它们存在于不同的网站上),并确保该批次在本地正确显示,除了 -p 之外,作者还喜欢使用一些选项:

wget -E -H -k -K -p http://<site>/<document>

获取多个页面

不幸的是,这只适用于每页。您可以使用 启用递归-r,但随后会遇到跟踪外部站点并炸毁的问题。如果您知道可用于资源的域的完整列表,则可以将其限制为仅使用 的域-D,但这可能很难做到。我建议使用-np(无父目录)的组合并-l限制递归的深度。您可能会开始获取其他网站,但至少会受到限制。如果您开始遇到问题,您可以使用--exclude-domains来限制已知的问题原因。最后,我认为这是最好的:

wget -E -H -k -K -p -np -l 1 http://<site>/level

限制域

为了帮助确定需要包含/排除哪些域,您可以使用此答案来 grep 一个或两个页面(您希望 grep.orig文件)并列出其中的链接。从那里你可能能够建立一个体面的应该包含的域列表,并使用-D参数对其进行限制。或者您至少可以找到一些您不想包含的域并使用--exclude-domains. 最后,您可以使用该-Q参数来限制下载的数据量,以防止磁盘被填满。

参数的描述

  • -E
    • 如果下载了 application/xhtml+xml 或 text/html 类型的文件并且 URL 不以 regexp 结尾,则\.[Hh][Tt][Mm][Ll]?,此选项将导致后缀 .html 附加到本地文件名。
  • -H
    • 在进行递归检索时启用跨主机。
  • -k
    • 下载完成后,将文档中的链接进行转换,使其适合本地查看。这不仅影响可见的超链接,还影响链接到外部内容的文档的任何部分,例如嵌入的图像、到样式表的链接、到非 HTML 内容的超链接等。
  • -K
    • 转换文件时,请备份带有 .orig 后缀的原始版本。
  • -p
    • 此选项使 Wget 下载正确显示给定 HTML 页面所需的所有文件。这包括内联图像、声音和引用样式表等内容。
  • -np
    • 递归检索时永远不要上升到父目录。这是一个有用的选项,因为它保证只会下载特定层次结构之下的文件。
  • -l
    • 指定递归最大深度级别深度。
  • -D
    • 设置要遵循的域。domain-list 是以逗号分隔的域列表。请注意,它不会打开 -H。
  • --exclude-domains
    • 指定不遵循的域。
  • -Q
    • 指定自动检索的下载配额。该值可以以字节(默认)、千字节(带有 k 后缀)或兆字节(带有 m 后缀)指定。
于 2013-05-30T21:45:40.157 回答
2

只是把wget -E -H -k -K -p -r http://<site>/下载一个完整的网站。如果在下载时打开某些页面并且其资源不可用,请不要紧张,因为当 wget 完成这一切时,它会转换它们!

于 2014-02-23T23:49:24.560 回答
1

要下载所有“正确显示页面所需的文件”,您可以使用-por --page-requisites,也许与-Qor一起使用--quota

于 2013-05-30T21:33:33.643 回答
1

尝试使用 wget--accept-regex标志;posix--regex-type被编译成 wget 标准,但pcre如果你需要更详细的东西,你可以在 perl 正则表达式引擎中编译:

例如,以下将获取外部站点上的所有 png 深度一级以及任何其他在 url 中包含单词 google 的页面: wget -r -H -k -l 1 --regex-type posix --accept-regex "(.*google.*|.*png)" "http://www.google.com"

它实际上并没有解决在外部站点上向下搜索多个级别的问题,因为您可能必须编写自己的蜘蛛。但是--accept-regex在大多数情况下,使用您可能会接近您正在寻找的内容。

于 2016-04-06T16:56:05.210 回答
0

在域的单层中,您可以在内部检查所有链接,也可以使用以下命令检查第三方服务器上的所有链接。

wget --spider -nd -e robots=off -Hprb --level=1 -o wget-log -nv http://localhost

这里的限制是它只检查一个层。这适用于 CMS,您可以使用 GET 变量而不是 CMS 生成的 URL 来展平站点。否则,您可以使用您最喜欢的服务器端脚本在目录中循环此命令。有关所有选项的完整说明,请查看此 Github 提交。

https://github.com/jonathan-smalls-cc/git-hooks/blob/LAMP/contrib/pre-commit/crawlDomain.sh

于 2014-06-06T17:15:36.260 回答