Wget跨度主机仅用于images / stylesheets / javascript但不包含链接

时间:2013-05-27 21:12:04

标签: download wget

Wget拥有-H“span host”选项

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级),我想获得图像,样式表,javascripts等(即,正确显示页面所需的文件),即使它们在我的外面主办。但是,我想要关注到另一个HTML页面的链接(因为它可以转到另一个HTML页面,依此类推,那么数字可能会爆炸。)

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

5 个答案:

答案 0 :(得分:17)

下载页面中的所有相关性

第一步是下载特定页面的所有资源。如果你查看man pages for 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

限制域名

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

参数说明

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

要下载所有“正确显示页面所需的文件”,您可以使用-p--page-requisites,也可以使用-Q--quota

答案 3 :(得分:1)

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

E.g。以下内容将获得一级深度的外部网站上的所有png以及在网址中包含google一词的任何其他网页: wget -r -H -k -l 1 --regex-type posix --accept-regex "(.*google.*|.*png)" "http://www.google.com"

它实际上并没有解决在外部网站上放下多个级别的问题,因为你可能需要编写自己的蜘蛛。但是在大多数情况下,使用--accept-regex你可能接近你正在寻找的东西。

答案 4 :(得分: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