为了实现自动化,我需要递归下载网页。我使用 wget,因为它可能是目前对程序员最友好的工具,使用 -r 标志来触发链接跟踪。
然而,wget 不能处理漂亮的 URL,例如http://webpage/index.php/my/pretty/link,将它们视为子目录。
这个问题有解决办法吗?(我不想修改该网页的源代码)
干杯,MH
编辑:问题解决
感谢您的深刻答复!
我已经设法解决了这个问题——不过,通过对提到的网页做一些小的修改。
我所做的很简单:我使用了服务器的 URL 重写功能,并将 URL 从http://网页/my/pretty/link到http://webpage/index.php/my/pretty/link。然后,使用以下 wget 标志:
wget --mirror --page-requisites --html-extension --convert-links http://webpage/
瞧!一切都完美无缺(尽管如此,在此过程中仍会创建目录,但从这一点开始使用某种脚本来处理它就很简单了)。
答案1
那么,wget 应该如何知道 index.php/my/pretty 是否真的不是目录?从 HTTP 客户端的角度来看,这一点并不明显。
也许你可以wget --exclude-directories
解决这个问题?或者也许可以检查一下wget -nd
,它将创建一组平面文件(而不是目录树)。看看这些。
答案2
漂亮的 URL 通常不是自力更生的,它们更频繁地使用机制来回传递数据(通常通过 POST 或 cookie)到后端基于 MVC 框架的应用程序。
如果您使用多个 wget 调用,则值得注意的是 wget 使用 cookie,但默认情况下不会保存它们......这意味着每个 wget 都将从一个新的 cookie 开始,并且不会有可用的状态信息。--save-cookies(文件名)和 --load-cookies(文件名)选项将为您提供帮助。
如果 Web 应用程序使用 POST 作为机制,我猜您可能必须编写一个专门针对该网站的特定爬虫程序。
答案3
也许你可以使用带有 iMacros 插件的 Firefox 来代替 wget?它有命令行支持,但不能自动跟踪链接(你需要编写脚本)。
http://wiki.imacros.net/iMacros_for_Firefox#Command_Line_Support
我每天用它来下载各种报告。
答案4
如果你多次访问同一个网站,那么你可以考虑使用别名命令,你可以为 wget 创建一个带有完整路径名的友好别名
alias mywget='wget http://domain.com/file/?search&channel=24'
显然,添加你需要的任何开关,然后你的用户就可以运行 mywget 来执行该功能
虽然我不确定一旦它碰到&会发生什么,因为你通常会将这样的网址放在引号中
希望有帮助