web-dev-qa-db-ja.com

機械化とJavaScript

Mechanizeを使用して、DOMイベントやAJAXを含むアクティブなJavaScriptでWebページへのブラウジングをシミュレートしたいのですが、これまでのところ、これを行う方法はありません。

私はいくつかのPython SpynnerやZopeのようなJavaScriptをサポートするクライアントブラウザーを調べましたが、どれも実際には機能しません。Spynnerは常にPyQtをクラッシュさせ、ZopeはJavaScriptをサポートしていないようです。

WATIRのようなPythonのみ(追加プロセスなし)でブラウジングをシミュレートする方法や、実際にページをブラウジングするかのようにJavaScriptを完全にサポートしながらFirefoxまたはInternet Explorerを操作するライブラリはありますか?

26
Jeff Klip

私は Phantom JS と呼ばれるMechanize(私が大好きです)のこの新しい代替手段を試してみました。

これは、SafariやChrome=のようなフルWebキットブラウザーですが、ヘッドレスでスクリプト可能です。pythonではなく、javascriptでスクリプトを記述します(少なくとも)。

あなたが始めるためのいくつかのサンプルスクリプトがあります。 Firebugを使用するのとよく似ています。私は数分使っただけですが、最初からかなり生産的であることがわかりました。

24
newz2000

から http://wwwsearch.sourceforge.net/mechanize/faq.html#general

自動化したいページでこれに遭遇した場合、4つのオプションがあります。ここでは、大まかに単純な順に示します。

JavaScriptが何をしているかを理解し、Pythonコードでエミュレートします。たとえば、CookieをCookieJarインスタンスに手動で追加したり、HTMLFormsでメソッドを呼び出したり、urlopenを呼び出したりします。上記のreフォームを参照してください。 。

JavaScriptを知っているJavaのJythonのHtmlUnitまたはHttpUnitを使用します。

Mechanizeを使用する代わりに、ブラウザを自動化してください。たとえば、COMオートメーションインターフェイスを介してMS Internet Explorerを使用し、Python for Windows extensions、aka pywin32、aka win32all(eg simple function、pamie; pywin32 chapter from the O'Reilly book)またはctypes(例)この種のことは、オートメーションAPIが不足している場合にWindowsでも役立つかもしれません。FirefoxにはPyXPCOMがあります。

野心的になり、適切なインタープリター(MozillaのJavaScriptインタープリターなど)に作業を自動的に委任します。これはHtmlUnitとhttpunitが行うことです。私は数年前にこれらの線に沿って急上昇しましたが、それは(まだ)うまくやるためにはかなりの仕事になると思います。

16
Jordan

基本的に、JavaScriptを処理するものが必要な場合は、実際のJavaScriptエンジンが必要です。これらには必ず実際のブラウザーの自動化が含まれます(これにはヘッドレスブラウザーも含まれます)。

JavaのHtmlUnitは、実際のブラウザのJavaScriptエンジンを使用しないため、あまりうまく機能しません。 (newz2000が指摘するように)ファントムJSは理想的に聞こえますが、JavaScriptでページを操作するとき、処理しているページを実際に表示できない場合、スクリプトをデバッグするのは非常に難しい場合があります。

これにより、さまざまなブラウザを自動化するフルpython APIを備えたSelenium Webdriverなどのソリューションが提供されますが、Java jarを実行すると、実際にブラウザが起動します。なので、純粋なpython=解決策ではありません(ただし、これはできる限り近いと思います)。

6
cerberos

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または選択した任意の要素で使用可能なメソッドを見つけることができます。またはprint(dir(browser))などを実行して、何が利用できるかを確認します。

4
Josh

PyV8を使用してpythonでDOM上でJSを実行する方法の例は、次の場所にあります。

https://github.com/buffer/thug

これは、mechanizeと一緒に実行するのがかなり簡単なはずです。

3
Michael