Mechanize 和 Javascript

28 投票
5 回答
30583 浏览
提问于 2025-04-16 16:27

我想用Mechanize这个工具来模拟在一个有活跃JavaScript的网站上浏览,包括处理DOM事件和AJAX请求,但到目前为止我还没有找到办法。

我查看了一些支持JavaScript的Python客户端浏览器,比如Spynner和Zope,但它们都不太适合我。Spynner总是让PyQt崩溃,而Zope似乎也不支持JavaScript。

有没有办法只用Python来模拟浏览,就像WATIR或者那些可以操作Firefox或Internet Explorer的库一样,能够完全支持JavaScript,就像真的在浏览网页一样?

5 个回答

6

简单来说,如果你想处理与JavaScript相关的内容,你需要一个真正的JavaScript引擎,这通常意味着要自动化一个真实的浏览器(包括那些无头浏览器)。

Java的HtmlUnit效果不是很好,因为它并没有使用真正浏览器的JavaScript引擎。Phantom JS听起来很理想(正如newz2000所提到的),但是我发现当你需要处理带有JavaScript的页面时,如果看不到你正在操作的页面,调试你的脚本会非常困难。

这就引出了像Selenium Webdriver这样的解决方案,它有一个完整的Python API,可以自动化各种浏览器。不过,你需要运行一个Java的jar文件,它会真正启动浏览器,所以这并不是你想要的纯Python解决方案(但我觉得这是你能找到的最接近的选择)。

16

来自 http://wwwsearch.sourceforge.net/mechanize/faq.html#general

如果你在想要自动化的页面上遇到了这个情况,你有四个选择。下面是这些选择,按照简单程度大致排序。

首先,弄清楚这个JavaScript在做什么,然后在你的Python代码中模拟它的行为。比如说,可以手动把cookies添加到你的CookieJar实例中,调用HTML表单的方法,或者使用urlopen等。关于表单的内容可以参考上面的说明。

其次,可以使用Java的HtmlUnit或HttpUnit,这些工具在Jython中可以处理一些JavaScript。

第三个选择是,不用mechanize,直接自动化一个浏览器。比如说,可以通过MS Internet Explorer的COM自动化接口来实现,使用Python for Windows扩展,也就是pywin32,或者win32all(例如,简单的函数,pamie;O'Reilly书中的pywin32章节)或者ctypes(示例)。这种方法在Windows上也很有用,尤其是当自动化API不够时。对于Firefox,可以使用PyXPCOM。

最后,如果你想更进一步,可以自动将工作委托给合适的解释器(比如Mozilla的JavaScript解释器)。HtmlUnit和httpunit就是这样做的。我几年前尝试过这种方法,但我觉得要做好这件事还是需要花费不少精力。

24

我试过一个新的工具,叫做 Phantom JS,它是一个我非常喜欢的 Mechanize 的替代品。

这个工具就像 Safari 或 Chrome 这样的完整浏览器,但它是无头的,也就是说它没有界面,可以通过脚本来控制。你需要用 JavaScript 来编写脚本,而不是 Python(至少我知道的是这样)。

这里有一些示例脚本可以帮助你入门。使用起来很像 Firebug。我只用了几分钟,但我发现自己一开始就能很高效地工作。

撰写回答