私はウェブスクレイピングプロジェクトに取り組んでいます。私が作業しているWebサイトの1つに、Javascriptからのデータがあります。
以前の質問の1つ から、PythonからJavascriptを直接呼び出すことができるという提案がありましたが、これを実現する方法がわかりません。
例:JavaScript関数がadd_2(var,var2)
として定義されている場合
そのJavaScript関数をPythonからどのように呼び出すのですか?
Pythonバインディングを持つJavaScriptインタープリターを見つけてください。(Rhinoを試してみてください?V8?SeaMonkey?)。
ただし、Python自体にはJavaScriptインタープリターは含まれていません。
最近発見した興味深い代替手段はPython bond モジュールで、NodeJsプロセス(v8エンジン)との通信に使用できます。
使用法は pyv8 バインディングに非常に似ていますが、直接修正なしで任意のNodeJsライブラリを使用できます。これはメジャーです私にとってのセールスポイント。
pythonコードは次のようになります。
val = js.call('add2', var1, var2)
あるいは:
add2 = js.callable('add2')
val = add2(var1, var2)
ただし、関数の呼び出しはpyv8よりも明らかに遅いため、ニーズに大きく依存します。多くの面倒な作業を行うnpm
パッケージを使用する必要がある場合は、bond
が最適です。さらに多くのnodejsプロセスを並行して実行することもできます。
ただし、多数のJS関数を呼び出す必要がある場合(たとえば、ブラウザー/バックエンド間で同じ検証関数を使用する場合)、pyv8
は間違いなくずっと速くなります。
PythonからJavaScriptと対話するには、ChromeおよびSafariの背後にあるブラウザーレンダラーであるwebkitを使用します。 Qtを介したWebkitへの Pythonバインディングがあります 。特に、 evaluateJavaScript() というJavaScriptを実行するための関数があります。
JavaScriptを実行して最終的なHTMLを抽出する完全な の例を次に示します 。
最終的にはページからJavaScriptを取得し、インタープリター(v8やRhinoなど)を介して実行できます。ただし、 Selenium や Splinter などのいくつかの機能テストツールを使用すると、簡単な方法で良い結果を得ることができます。これらのソリューションはブラウザを起動し、ページを効果的にロードします-遅くなる可能性がありますが、期待されるブラウザ表示コンテンツが利用可能であることを保証します。
たとえば、次のHTMLドキュメントを考えます。
<html>
<head>
<title>Test</title>
<script type="text/javascript">
function addContent(divId) {
var div = document.getElementById(divId);
div.innerHTML = '<em>My content!</em>';
}
</script>
</head>
<body>
<p>The element below will receive content</p>
<div id="mydiv" />
<script type="text/javascript">addContent('mydiv')</script>
</body>
</html>
以下のスクリプトはSplinterを使用します。 SplinterはFirefoxを起動し、ページの読み込みが完了すると、JavaScriptによってdivにコンテンツが追加されます。
from splinter.browser import Browser
import os.path
browser = Browser()
browser.visit('file://' + os.path.realpath('test.html'))
elements = browser.find_by_css("#mydiv")
div = elements[0]
print div.value
browser.quit()
結果は、stdoutに印刷されたコンテンツになります。
Popenを介してノードを呼び出すことができます。
print execute('''function (args) {
var result = 0;
args.map(function (i) {
result += i;
});
return result;
}''', args=[[1, 2, 3, 4, 5]])
最近、さまざまな方法の全体的な要約を行いました。
PyQt4 node.js/zombie.js phantomjs
Phantomjsが勝者であり、多くの例で非常に簡単です。