机械化和Javascript

我想使用Mechanize来模拟浏览到包含DOM事件和AJAX的活动JavaScript的网页,到目前为止我还没有find办法做到这一点。

我看过一些支持JavaScript的Python客户端浏览器,比如Spynner和Zope,他们都没有为我工作。 Spynner始终崩溃PyQt和Zope不支持JavaScript,因为它似乎。

有没有一种方法来模拟只用Python浏览,没有额外的进程,如WATIR或操作Firefox或Internet Explorer的库,同时完全支持Javascript,就像实际浏览页面一样?

我已经玩过机械化(我喜欢)这个新的替代scheme,称为Phantom JS 。

它是一个完整的networking工具包浏览器,如Safari或Chrome,但是没有头文件和脚本。 你用JavaScript编写脚本,而不是Python(据我所知至less)。

有一些示例脚本可以帮助您开始。 这很像使用Firebug。 我只用了几分钟,但是从一开始我就发现我的工作非常有成效。

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

如果你在一个你想要自动化的页面中遇到这个问题,你有四个选项。 在这里他们大致按照简单的顺序。

找出JavaScript正在做什么,并在Python代码中模拟它:例如,通过手动向CookieJar实例添加Cookie,在HTMLForms上调用方法,调用urlopen等。请参阅上面的表单。

使用Java的HtmlUnit或HttpUnit从Jython,因为他们知道一些JavaScript。

而不是使用机械化,而是自动化浏览器。 例如,使用MS Internet Explorer通过其COM自动化接口,使用Python for Windows扩展,又名pywin32,又名win32all(例如简单的函数,pamie;来自O'Reilly的书的pywin32章节)或ctypes(示例)。 在缺乏自动化API的情况下,这种事情也可能在Windows上有用。 对于Firefox,有PyXPCOM。

变得雄心勃勃,并自动将工作委托给适当的解释器(例如Mozilla的JavaScript解释器)。 这是HtmlUnit和httpunit的function。 几年前,我在这方面做了一个突破,但是我认为做好这件事还是会有很多工作的。

基本上,如果你想要一些处理JavaScript的东西,那么你需要一个真正的JavaScript引擎,这些总是涉及自动化一个真正的浏览器(我包括在这个无头的)。

Java的HtmlUnit没有做很好的工作,因为它不使用实际浏览器的JavaScript引擎。 Phantom JS听起来很理想(正如newz2000指出的那样),但是我发现当用JavaScript处理页面时,如果你实际上看不到你正在处理的页面,那么debugging你的脚本将会非常困难。

这导致像Selenium Webdriver这样的解决scheme,它有一个完整的Python API来自动化各种浏览器,但是你必须运行一个java jar,它实际上启动了浏览器,所以不是你以后的纯python解决scheme(但我认为这是closures,因为你可以得到)。

一个例子如何使用PyV8,用python在DOM上运行JS可以在这里find:

https://github.com/buffer/thug

这应该相当容易,使其与机械化一起运行。

你可以用Python来使用Selenium。 然后,您可以删除JavaScript生成的内容,并使用额外的JavaScript(以及Python)操作页面。

# In your virtualenv: pip install selenium from selenium import webdriver # Launch Firefox GUI browser = webdriver.Firefox() # Alternatively, you can drive PhantomJS without a GUI # With Node.js installed: `npm install -g phantomjs` # browser = webdriver.PhantomJS() # Fetch a webpage browser.get('http://example.com') # If you need the whole HTML document # just like inspecting the rendered page with the console html = browser.page_source # Get an element, even if it was created with JS button = browser.find_element_by_css_selector('div.some-class > \ input.the-submit-button') # Click on something button.click() # Execute some JavaScript (assumes jQuery is loaded on the page) browser.execute_script("$('html, body').animate({ scrollTop: 500 }, 50);") 

您可以在Python REPL中运行代码,并使用自动完成来发现browser可用的方法或您select的任何元素。 或者做一些像print(dir(browser))来看看有什么可用。