我在项目工作时遇到了问题。我想“抓取”某些感兴趣的网站并将其保存为“完整网页”,包括样式和图像,以便为它们构建镜像。我多次给网站添加书签以便稍后阅读,几天之后网站就被关闭了,因为它遭到黑客入侵而且所有者没有备份数据库。
当然,我可以使用fopen("http://website.com", "r")
或fsockopen()
轻松地使用php阅读文件,但主要目标是保存完整的网页,以防它出现故障,它仍然可用其他人喜欢“编程时间机器”:)
有没有办法在没有阅读的情况下执行此操作并保存页面上的每个链接?
Objective-C解决方案也很受欢迎,因为我也试图弄清楚它的更多内容。
谢谢!
答案 0 :(得分:16)
您实际上需要解析引用的html和所有css文件,这并不容易。然而,快速的方法是使用像wget这样的外部工具。安装wget后,您可以从命令行运行
wget --no-parent --timestamping --convert-links --page-requisites --no-directories --no-host-directories -erobots=off http://example.com/mypage.html
这将下载mypage.html和所有链接的css文件,图像以及在css中链接的图像。
在系统上安装 wget 之后,您可以使用php的system()
函数以编程方式控制 wget 。
注意:您至少需要 wget 1.12才能正确保存通过css文件引用的图片。
答案 1 :(得分:3)
有没有办法在没有阅读的情况下执行此操作并保存页面上的每个链接?
简短回答:不。
更长的答案:如果您想要保存网站中的每个页面,您将不得不在某个级别上阅读某些内容的网站中的每个页面。
可能值得研究Linux应用wget
,这可能会做你想要的事情。
警告中的一个词 - 站点通常具有到其他站点的链接,这些站点具有到其他站点的链接等等。确保在蜘蛛中放置某种stop if different domain
条件!
答案 2 :(得分:1)
如果您更喜欢Objective-C解决方案,则可以使用WebArchive class from Webkit 它提供了一个公共API,允许您将整个网页存储为.webarchive文件。 (就像Safari保存网页时一样)。
webarchive format的一些不错的功能:
答案 3 :(得分:0)
无论什么应用程序要做的工作(您的代码或您找到的代码)都必须完全这样做:下载页面,解析它以获取对外部资源的引用和指向其他页面的链接,然后下载所有这些东西。这就是网络的运作方式。
但是,为什么不查看 curl 和 wget ,而不是自己进行繁重的工作?它们是大多数类Unix操作系统的标准配置,并且完全符合您的要求。就此而言,您的浏览器也可能至少在单页基础上(尽管安排它也更难)。
答案 4 :(得分:0)
我不确定你是否需要一个编程解决方案来“抓取网站”或个人需要保存网站以供离线观看,但如果是后者,那么有一个很棒的Windows应用程序 - Teleport Pro和{{ 3}}对于Mac。
答案 5 :(得分:0)
您可以使用IDM(互联网下载器管理)下载完整的网页,还有HTTrack。