我有一些在工作中必须使用的“公司”系统。其中一些很糟糕,有框架、弹出窗口等。
我正在考虑使用curl 或类似的东西来自动化一些东西。我需要登录,单击超链接,设置一些数据,然后他们会发布一些信息。
可以使用curl吗?或者我会更好地使用像 Selenium 这样的东西吗?
答案1
对于简单的情况下载页面的内容,使用卷曲或者获取。两者都是命令行工具,旨在通过 HTTP 下载文件,并且有很多选项。就您而言,您可能需要使这些工具看起来更像浏览器;卢茨基的回答和企鹅359的回答提到一些在这方面有用的curl 和wget 选项。
有时,当你需要时登录,首先在网络浏览器中手动登录要容易得多,然后导出网络浏览器的 cookie(扩展如所有cookies或者导出 CookieFirefox 可以提供帮助)。
如果你需要解析内容某些页面或邮寄表格,您可能需要比curl和wget更高级的工具。 Perl 有一些不错的工具LWP
(libwww)和HTML::TreeBuilder
(HTML 树)或带有标准库的Python(尤其是httplib
和htmllib
)。
了解更多复杂的相互作用有一个网站,参考是Perl的WWW::机械化。这个 Perl 库定义了像 Web 浏览器一样与网站交互的高级函数,包括 POSTing、表单、cookie,但不包括 Javascript。如果 Perl 不是你的菜,这个库有其他语言中具有类似功能的模仿品,例如Python机械化和红宝石机械化。
最后,当你需要的时候JavaScript,通常的方法是使用由浏览器自动化框架驱动的网络浏览器。硒和瓦提尔是受欢迎的选择;也可以看看除了 SeleniumRC 之外,还有什么好的工具可以获取包含 JavaScript 后绘制内容的网页吗?
答案2
是的,使用curl 完全可以实现。最重要的是在使用curl 和 之间保存和重新加载cookie --cookie-jar
。您还可以根据需要发布表单数据。我通常使用名为 Live HTTP Headers 的 Firefox 插件来捕获浏览网站时发生的情况。它会记录任何标题,还会记录任何表单帖子,这在尝试弄清楚如何使用curl时非常有帮助。我编写了 bash 脚本,自动执行各种curl 调用,并使用管道和临时文件(由 提供mktemp
)在网页上进行一些有限的处理,但如果必须进行大量网页处理,我通常会切换到带有 LibWWW 的 Perl。
答案3
我最喜欢的是wget
,所以我会举一个例子。您想要做的是尽可能地复制您的浏览器会话,因此请使用相关的命令行参数。必要的内容取决于网站检查您的浏览器的彻底程度。--referer
(原文如此) 通常就足够了,但您可能还需要--user-agent
和--load-cookies
。
这种技术基本上是浏览器欺骗 - 您试图将wget
自己作为浏览器呈现给网站。您将面临的最大问题是验证码,它没有出现在您给出的示例网站中。另外,请确保遵守网站的时间政策(在本例中为 45 秒),否则您可能会被阻止。
大概是不是可以跨不同会话下载同一文件 - 站点将特定文件的下载权限授予特定会话。