爬取整个网站

66
我正在寻找一个程序来爬取并下载整个企业网站。该网站由已停止工作的CMS驱动,修复它很昂贵而且我们能够重新开发网站。因此,我只想获取整个网站作为普通HTML / CSS / 图像内容,并根据需要进行小的更新,直到新网站出现。有任何建议吗?

可能是下载网页的工作本地副本的重复问题。 - jww
5个回答

74
wget \
     --recursive \
     --no-clobber \
     --page-requisites \
     --html-extension \
     --convert-links \
     --restrict-file-names=windows \
     --domains www.website.com \
     --no-parent \
         www.website.com

在这里阅读更多相关内容


2
wget不支持同时使用“convert-links”和“no-clobber”。在这种情况下,它会忽略“no-clobber”。 - BryanH
2
如果您想爬取带有HTML5标签(如音频或视频)的网站,则必须使用最新版本的wget。对于这些标签的支持是在2012-2013年之间添加的。我刚从他们的Git存储库中编译了最新版本,它成功获取了我所需的网站,包括视频文件。 - Nicolay Doytchev
6
在这种情况下,--domains参数是否应与要抓取的站点名称(在本例中为website.com,而不是.org)相同? - user151841
@lightrush 你能提供版本号码吗? - Screenack
你应该添加一个 --wait=5 参数,就像其他答案一样。在爬取数据时要考虑周全! - ximo
wget也会遵守robots.txt文件,所以如果您仍然无法正常爬取,请添加“-e robots=off”。 - blacktide

56

我知道这个命令已经非常老了,但我想提供我的意见。

wget -m -k -K -E -l 7 -t 6 -w 5 http://www.website.com

以下是每个开关的一些解释:

-m 实际上,这意味着“镜像站点”,它通过站点蜘蛛爬行递归地抓取页面和图片。它会检查时间戳,因此如果您第二次使用此开关运行 wget,则只会更新新于上次的文件/页面。

-k 这将修改 html 中的链接以指向本地文件。如果您在整个网站中使用类似于 page2.html 的东西作为链接,而实际上您正在使用完整的 http://www.website.com/page2.html,您可能需要或想要这个。我打开它只是为了安全起见——否则至少有一个链接可能会导致问题。

-K 上面的选项(小写 k)编辑 html。如果您也想要“未更改”的版本,请使用此开关,它将保存更改后的版本和原始版本。如果出现问题并且您想比较两个版本,这是一个好习惯。您随时可以稍后删除不想要的那个版本。

-E 这将使用“正确的扩展名”保存 HTML 和 CSS。小心使用此选项——如果您的网站上并没有每个页面都有 .html 扩展名,那么它会添加它。但是,如果您的网站已经使用了像“htm”之类的文件命名,则现在将以“.htm.html”的形式结束。

-l 7 默认情况下,我们上面使用的 -m 会递归/蜘蛛爬行整个站点。通常来说这没问题。但有时您的网站会有一个无限循环,在这种情况下,wget 将永远下载。想象一下典型的 website.com/products/jellybeans/sort-by-/name/price/name/price/name/price 示例。现在这种情况比较少见——大多数网站表现良好,不会这样做,但为了安全起见,请确定从主页到达任何真实页面可能需要的最多点击次数,稍微增加一些(如果您设置了值为 7 并在一小时后发现您的网站深度为 8 级,那将很糟糕!)并使用该数字。当然,如果您知道您的网站具有良好的结构,没有必要包括此选项,并且可以放心地知道您的网站上的隐藏页面的层数为 50 级。

-t 6如果尝试访问/下载某个页面或文件失败,则设置在放弃该文件并继续进行之前的重试次数。通常希望它最终放弃(如果您想无限尝试,请将其设置为0),但是如果网站只是短暂地出现问题,也不希望它放弃。我认为6次是合理的。

-w 5这告诉wget在抓取下一个文件之前等待几秒钟(在本例中为5秒)。在这里使用某些东西(至少1秒)通常非常关键。让我解释一下。默认情况下,wget会尽可能快地获取页面。这很容易成为每秒多个请求,这有可能对服务器造成巨大负载(特别是如果网站使用PHP编写,在每个请求上进行MySQL访问,并且不使用缓存)。如果网站在共享主机上,该负载可能会使某人被踢出他们的主机。即使在VPS上,它也可能使一些网站屈服。即使该网站本身幸存下来,接收到大量请求可能会看起来像DOS攻击,这很可能会导致IP自动阻止。如果您不能确定该网站能否处理大量的流量,请使用-w #开关。5通常是相当安全的。甚至1大多数情况下也可以。但一定要使用某些东西。


40

以上所有方法都没有完全满足我的需求(需要整个网站和所有资产)。但是这个方法可行。

首先,按照教程在OSX上安装wget。

然后运行以下命令:

wget --recursive --html-extension --page-requisites --convert-links http://website.com

3
如果你只需要从一个URL及其子域名获取内容,可以添加--no-parent参数。 - magnudae
1
请确保在网站强制使用www的情况下包含www,否则它将无法下载任何内容。 - Jack

30

考虑使用HTTrack。它是一个免费且易于使用的离线浏览器实用程序。

它允许你将整个网站从互联网下载到本地目录,递归创建所有目录,获取服务器上的HTML、图片和其他文件并保存到你的计算机上。


0

最好的方法是使用wget进行爬取,正如@Abhijeet Rastogi的答案所建议的那样。 如果您不熟悉它,则Blackwidow是一个不错的爬虫。 我以前用过它。 http://www.sbl.net/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接