【问题标题】:Mechanize and Javascript机械化和Javascript
【发布时间】:2011-08-13 04:46:59
【问题描述】:

我想使用 Mechanize 来模拟浏览带有活动 JavaScript 的网页,包括 DOM 事件和 AJAX,但到目前为止我还没有找到这样做的方法。

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

有没有一种方法可以模拟仅使用 Python 进行浏览(无额外进程),例如 WATIR 或操作 Firefox 或 Internet Explorer 的库,同时完全支持 Javascript,就像实际浏览页面一样?

【问题讨论】:

  • Zope 测试浏览器(基于机械化构建)从未声称支持 JavaScript;你在哪里读到它可能?
  • 您能解释一下您要解决的问题吗?可能你根本不需要启用 JavaScript。
  • 告诉我们您想要做什么,我们会告诉您是否可以帮助您!
  • 我正在尝试使用严格的 python 来模拟浏览。我不能使用其他任何东西,因为我需要使用一些我(目前)只能在 python 中执行的特定调整和钩子。我什至愿意付出努力并尝试连接 Mechanize 和 PyV8,但我不知道从哪里开始......以前有人做过类似的事情吗?

标签: javascript python browser mechanize


【解决方案1】:

我玩过这个名为 Phantom JS 的新 Mechanize 替代品(我喜欢它)。

它是一个完整的网络工具包浏览器,如 Safari 或 Chrome,但它是无头且可编写脚本的。你用javascript编写脚本,而不是python(至少据我所知)。

有一些示例脚本可以帮助您入门。这很像使用 Firebug。我只用了几分钟,但我发现我从一开始就很有效率。

【讨论】:

  • 不错的工具!为什么人们在没有解释的情况下投反对票?
  • 这是因为 1)当问题明确要求使用 Python 工具时,它是一个 Javascript 工具;2)通过 Python 中的 JS API 操作该工具充其量只是一个 hacky PITA。
  • +1 我认为 phnatomjs 是要走的路,而 JavaScript 是 web 的语言
  • PhantomJS 是否真的运行它加载的页面上的 javascript? (与 phantomjs 脚本中的 javascript 不同。)我认为确实如此,但很难确定。
  • 是的,PhantomJS 运行页面就像普通的网络浏览器一样,虽然没有 UI。
【解决方案2】:

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

如果您在想要自动化的页面中遇到此问题,您有四个选择。在这里,大致按简单顺序排列。

弄清楚 JavaScript 在做什么并在你的 Python 代码中模拟它:例如,通过手动将 cookie 添加到你的 CookieJar 实例、调用 HTMLForms 上的方法、调用 urlopen 等。参见上面的 reforms。

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

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

要有雄心并自动将工作委派给适当的解释器(例如 Mozilla 的 JavaScript 解释器)。这就是 HtmlUnit 和 httpunit 所做的。几年前我在这些方面做了一个飙升,但我认为(仍然)要做好很多工作。

【讨论】:

  • 选项 #1 和 #3 纯粹是 python。
  • #1 确实是 python,这可能会是什么,但我也对将来如何概括该过程感兴趣。 #3 真的是在使用 COM 和 IE...
  • @Jeff 为什么使用无头浏览器或浏览器自动化程序会出现问题?
【解决方案3】:

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

Java 的 HtmlUnit 做得不是很好,因为它不使用来自实际浏览器的 javascript 引擎。 Phantom JS 听起来很理想(正如 newz2000 指出的那样),但是我发现在使用 javascript 操作页面时,如果您实际上看不到正在处理的页面,那么调试脚本可能会非常困难。

这导致了诸如 Selenium Webdriver 之类的解决方案,它具有完整的 python API 来自动化各种浏览器,但是你必须运行一个 java jar 并且它实际上会启动浏览器,所以不是你所追求的纯 python 解决方案(但我认为这是尽可能接近的)。

【讨论】:

  • 我使用 Selenium 通过 Python API 自动化 Firefox。这有点小问题,但它通常可以工作,并且可能是我见过的最好的解决方案。
  • 我也求助于 Selenium 来为需要运行 Javascript 的项目自动浏览网页。对于本地开发,我使用了chromedirver,而对于生产,我使用了Selenium ServerSelenium Python binding docs 很有帮助。
【解决方案4】:

您可以将 Selenium 与 Python 一起使用。然后,您可以抓取 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 或您选择的任何元素上可用的方法。或执行print(dir(browser)) 之类的操作以查看可用的内容。

【讨论】:

    【解决方案5】:

    可以在这里找到一个如何使用 PyV8,通过 python 在 DOM 上运行 JS 的示例:

    https://github.com/buffer/thug

    这应该很容易让它和mechanize一起运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多