私が使用したいPhantomJSをしてPythonの。私はこの問題をググりましたが、適切な解決策を見つけることができませんでした。
私は見つけるos.popen()
良い選択かもしれません。しかし、私はそれにいくつかの引数を渡すことができませんでした。
subprocess.Popen()
今のところ、これを使用するのが適切な解決策かもしれません。より良い解決策があるかどうか知りたい。
PythonでPhantomJSを使用する方法はありますか?
私が使用したいPhantomJSをしてPythonの。私はこの問題をググりましたが、適切な解決策を見つけることができませんでした。
私は見つけるos.popen()
良い選択かもしれません。しかし、私はそれにいくつかの引数を渡すことができませんでした。
subprocess.Popen()
今のところ、これを使用するのが適切な解決策かもしれません。より良い解決策があるかどうか知りたい。
PythonでPhantomJSを使用する方法はありますか?
回答:
PythonでPhantomJSを使用する最も簡単な方法は、Seleniumを使用することです。最も簡単なインストール方法は
npm -g install phantomjs-prebuilt
インストール後、ファントムは次のように簡単に使用できます。
from selenium import webdriver
driver = webdriver.PhantomJS() # or add to your PATH
driver.set_window_size(1024, 768) # optional
driver.get('https://google.com/')
driver.save_screenshot('screen.png') # save a screenshot to disk
sbtn = driver.find_element_by_css_selector('button.gbqfba')
sbtn.click()
システムパス環境変数が正しく設定されていない場合は、の引数として正確なパスを指定する必要がありますwebdriver.PhantomJS()
。これを交換してください:
driver = webdriver.PhantomJS() # or add to your PATH
...以下を使用:
driver = webdriver.PhantomJS(executable_path='/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs')
参照:
driver.page_source
です。
bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")
そしてそれはうまくいった!
PhantomJSは最近、Pythonサポートを完全に廃止しました。ただし、PhantomJSにはGhost Driverが組み込まれています。
それ以来、新しいプロジェクトが空白を埋めるために強化されました:ghost.py
。おそらく代わりにそれを使いたいでしょう:
from ghost import Ghost
ghost = Ghost()
with ghost.start() as session:
page, extra_resources = ghost.open("http://jeanphi.me")
assert page.http_status==200 and 'jeanphix' in ghost.content
GhostDriverがPhantomJSにバンドルされているため、Seleniumを介して使用することがさらに便利になりました。
Pyklerの提案に従って、PhantomJSのノードインストールを試しましたが、実際には、PhantomJSのスタンドアロンインストールよりも遅いことがわかりました。スタンドアロンのインストールでは、これらの機能は以前は提供されていなかったと思いますが、v1.9の時点では、ほとんど提供されています。
これでこんな風に使えます
import selenium.webdriver
driver = selenium.webdriver.PhantomJS()
driver.get('http://google.com')
# do some processing
driver.quit()
PhantomJSとDjangoを使用してJavaScriptをテストする方法は次のとおりです。
mobile / test_no_js_errors.js:
var page = require('webpage').create(),
system = require('system'),
url = system.args[1],
status_code;
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
});
};
page.onResourceReceived = function(resource) {
if (resource.url == url) {
status_code = resource.status;
}
};
page.open(url, function (status) {
if (status == "fail" || status_code != 200) {
console.log("Error: " + status_code + " for url: " + url);
phantom.exit(1);
}
phantom.exit(0);
});
mobile / tests.py:
import subprocess
from django.test import LiveServerTestCase
class MobileTest(LiveServerTestCase):
def test_mobile_js(self):
args = ["phantomjs", "mobile/test_no_js_errors.js", self.live_server_url]
result = subprocess.check_output(args)
self.assertEqual(result, "") # No result means no error
テストを実行します。
manage.py test mobile
@Pyklerによって答えは素晴らしいですが、ノードの要件は時代遅れです。その回答のコメントは、より簡単な回答を示唆しています。これを他の時間を節約するためにここに入れました。
PhantomJSをインストールする
@ Vivin-Paliathが指摘するように、これはスタンドアロンプロジェクトであり、Nodeの一部ではありません。
マック:
brew install phantomjs
Ubuntu:
sudo apt-get install phantomjs
等
を設定しvirtualenv
ます(まだ設定していない場合):
virtualenv mypy # doesn't have to be "mypy". Can be anything.
. mypy/bin/activate
マシンにPython 2と3の両方が搭載されている場合は、実行virtualenv-3.6 mypy
または同様のものが必要になる場合があります。
セレンをインストールします。
pip install selenium
このドキュメントから借りたような簡単なテストを試してください:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.PhantomJS()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
PhantomJS
Windows にインストールする方法は?pip
コマンドを使用しても動作しないようです。
これは私がやっていることです、python3.3。サイトの膨大なリストを処理していたため、ジョブがリスト全体を実行するには、タイムアウトで失敗することが不可欠でした。
command = "phantomjs --ignore-ssl-errors=true "+<your js file for phantom>
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
# make sure phantomjs has time to download/process the page
# but if we get nothing after 30 sec, just move on
try:
output, errors = process.communicate(timeout=30)
except Exception as e:
print("\t\tException: %s" % e)
process.kill()
# output will be weird, decode to utf-8 to save heartache
phantom_output = ''
for out_line in output.splitlines():
phantom_output += out_line.decode('utf-8')
Anacondaを使用している場合は、次のようにインストールします。
conda install PhantomJS
あなたのスクリプトで:
from selenium import webdriver
driver=webdriver.PhantomJS()
完璧に動作します。
使用している場合はビルドアウトを、あなたは簡単にPyklerを使用して記述していること、インストールプロセスを自動化することができるgp.recipe.nodeのレシピを。
[nodejs]
recipe = gp.recipe.node
version = 0.10.32
npms = phantomjs
scripts = phantomjs
その部分は、node.jsをバイナリーとして(少なくとも私のシステムでは)インストールし、次にnpmを使用してPhantomJSをインストールします。最後にbin/phantomjs
、PhantomJS Webdriverを呼び出すことができるエントリポイントを作成します。(Seleniumをインストールするには、卵の要件またはBuildout構成で指定する必要があります。)
driver = webdriver.PhantomJS('bin/phantomjs')
gp.recipe.phantomjs
、その構成さphantomjs
とcasperjs
subprocess.popen
それがSeleniumが行うこととまったく同じですが、APIをシームレスにするいくつかの拡張機能があります。