PythonでPhantomJSを使用する方法はありますか?


203

私が使用したいPhantomJSをしてPythonの。私はこの問題をググりましたが、適切な解決策を見つけることができませんでした。

私は見つけるos.popen() 良い選択かもしれません。しかし、私はそれにいくつかの引数を渡すことができませんでした。

subprocess.Popen()今のところ、これを使用するのが適切な解決策かもしれません。より良い解決策があるかどうか知りたい。

PythonでPhantomJSを使用する方法はありますか?


以下の私の答えは、それを行う方法を示しています。あなたの質問を見るだけで、実際にはsubprocess.popenそれがSeleniumが行うこととまったく同じですが、APIをシームレスにするいくつかの拡張機能があります。
ピクラー2015年

@flyer:承認された回答の変更を検討する必要があります。以下を参照してください。ありがとうございました。
dotancohen 2015

回答:


373

PythonでPhantomJSを使用する最も簡単な方法は、Seleniumを使用することです。最も簡単なインストール方法は

  1. NodeJSをインストールする
  2. Nodeのパッケージマネージャーインストールphantomjsを使用します。 npm -g install phantomjs-prebuilt
  3. セレンをインストールする(virtualenvを使用している場合)

インストール後、ファントムは次のように簡単に使用できます。

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')

参照:


40
これは美しく機能し、おそらく私を数日間救いました。ありがとうございました。レンダリングされたページ全体をソースとして戻したい場合は、driver.page_sourceです。
scharfmn

4
これは、美しく作業を行い、そしてので、私は愉快に驚いphantomjs.org/faq.htmlは「Node.jsのモジュールがない」でNPMラッパー--yet言うnpmjs.org/package/phantomjsが、それは、この目的のために動作します。私の場合、私はこれをやりたかった:bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")そしてそれはうまくいった!
MarkHu 2013

8
ゴーストにはクレイジーな依存関係があることに同意します。実際、何百万ものX11関連ライブラリをインストールした後でも、ゴーストを起動して実行することに失敗しました。ゴーストはホラーストーリーです。
Pykler、2013年

5
@phabtar PhantomJSの最初の引数としてphantomjsへのパスを渡すか、またはphantomjsを表示できるようにWindowsのsyspathを修正する必要があります。
ピクラー2013

2
ばかげた質問:なぜnode-jsをインストールしなければならないのですか?pahantomJsを取得する他の方法はありませんか?
Eildosa、2015年

80

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

21
サポートが削除されたにもかかわらず、npm(ノードパッケージマネージャー)をインストールし、それを使用して最新のphantomjs(webdriverサポート付き)をインストールし、Pythonにセレンをインストールする... ファントムの良いところは、それが本当にヘッドレスで、UI / X11関連のライブラリが機能する必要がないことです。
ピクラー2013年

12
ghost.pyを使用しようとして私の人生を嫌った後の私の好ましい解決策を説明する以下の回答を追加しました
Pykler

8
ピクラーの「私の人生を憎む」は控えめな表現ではありません。誰かがこの質問の「正解」をパイクラーに変更した場合、私は1日の労力を節約できただろう。
YPCrumble 2013

2
@YPCrumble:残念ながらOPだけがそれを行うことができます。受け入れられた回答を変更します。
Martijn Pieters

3
今朝、さまざまなアプローチを試した後、@ Pyklerソリューションは最もスムーズに機能するようになりました。
andyzinsser 2013年

40

GhostDriverがPhantomJSにバンドルされているため、Seleniumを介して使用することがさらに便利になりました。

Pyklerの提案に従って、PhantomJSのノードインストールを試しましたが、実際には、PhantomJSのスタンドアロンインストールよりも遅いことがわかりました。スタンドアロンのインストールでは、これらの機能は以前は提供されていなかったと思いますが、v1.9の時点では、ほとんど提供されています。

  1. PhantomJSをインストールします( http://phantomjs.org/download.html) Linuxを使用している場合は、次の手順がhttps://stackoverflow.com/a/14267295/382630に役立ちます
  2. pipを使用してSeleniumをインストールします。

これでこんな風に使えます

import selenium.webdriver
driver = selenium.webdriver.PhantomJS()
driver.get('http://google.com')
# do some processing

driver.quit()

3
UbuntuでのPhantomJSのインストールに関するSOの回答を指摘してくれて特に感謝します。
Dennis Golomazov 2013

私が学んだばかりのSeleniumをインストールする簡単な方法は、Windowsでは次のように入力します:C:\ Python34 \ Scripts \ pip.exe install Selenium。
ntk4 2016

8

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


ありがとう。私はsubprocess.Popenを使用してphantomjsスクリプトを呼び出し、それは機能しました:)
チラシ

これがどのように制限されているかわかりますか?あなたがやっているすべてはphantomjsを実行するシェルの呼び出しをしている-あなたが実際になど、あなたが適切に例外を処理するのに経由する「適切な」インターフェースを使用してブロックしていない
kamelkev

@kamelkev:これには限界があると思います。良い点は、この方法により、Djangoのブートストラップ機能を使用して、テストごとに適切なコンテンツでテストデータベースをセットアップできることです。そして、はい、それは他の答えと組み合わせて両方の世界のベストを得ることができます。
EmilStenström2013年

6

@Pyklerによって答えは素晴らしいですが、ノードの要件は時代遅れです。その回答のコメントは、より簡単な回答を示唆しています。これを他の時間を節約するためにここに入れました。

  1. PhantomJSをインストールする

    @ Vivin-Paliathが指摘するように、これはスタンドアロンプ​​ロジェクトであり、Nodeの一部ではありません。

    マック:

    brew install phantomjs

    Ubuntu:

    sudo apt-get install phantomjs

  2. を設定しvirtualenvます(まだ設定していない場合):

    virtualenv mypy  # doesn't have to be "mypy". Can be anything.
    . mypy/bin/activate

    マシンにPython 2と3の両方が搭載されている場合は、実行virtualenv-3.6 mypyまたは同様のものが必要になる場合があります。

  3. セレンをインストールします。

    pip install selenium
  4. このドキュメントから借りたような簡単なテストを試してください:

    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()

PhantomJSWindows にインストールする方法は?pipコマンドを使用しても動作しないようです。
MD。ハイルバザール

1
PipはPythonパッケージインストーラーであるため、Pythonパッケージとして入手可能なセレンで動作します。PhantomJSはpythonパッケージではないため、pipでは機能しません。私は「PhantomJSインストールウィンドウズ」のグーグルをすばやく実行し、良いヒットがあります。
アンドリューE

5

これは私がやっていることです、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')

おかげで、目的に合わせて味を変えることができました。
iChux

5

Anacondaを使用している場合は、次のようにインストールします。

conda install PhantomJS

あなたのスクリプトで:

from selenium import webdriver
driver=webdriver.PhantomJS()

完璧に動作します。


現在のところ、デフォルトのチャネルにはPhantomJS for linux64が含まれていません
Eugene Pakhomov

くそー、私はconda <3がとても簡単だったのが大好きです。私はosxを使っています。
O.rka

1

使用している場合はビルドアウトを、あなたは簡単に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')

1
もう一つの方法はそれだけで使用だ増築してインストールプロセスを自動化するためにgp.recipe.phantomjs、その構成さphantomjscasperjs
gakhov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.