web-dev-qa-db-ja.com

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

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

私はos.popen()が良い選択かもしれないと思います。しかし、私はそれにいくつかの議論を渡すことができませんでした。

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

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

201
flyer

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

  1. インストール NodeJS
  2. Nodeのパッケージマネージャを使ってphantomjs install:npm -g install phantomjs-prebuilt
  3. seleniumをインストールします(あなたの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')

参考文献:

369
Pykler

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
80
Martijn Pieters

GhostDriverはPhantomJSにバンドルされているので、Seleniumを通して使うのがさらに便利になりました。

Pyklerが示唆しているように、PhantomJSのNodeインストールを試しましたが、実際にはPhantomJSのスタンドアロンインストールより遅いことがわかりました。私は、スタンドアロンインストールでこれらの機能が以前には提供されていなかったと思いますが、v1.9の時点では、そうなっています。

  1. PhantomJS( http://phantomjs.org/download.html )をインストールします(Linuxを使用している場合は、以下の手順に従ってください https://stackoverflow.com/a/14267295/38263
  2. Pipを使ってSeleniumをインストールします。

今、あなたはこのように使うことができます

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

driver.quit()
39
Pankaj

以下は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

8
Emil Stenström

@Pyklerによる回答 は素晴らしいですが、Nodeの要件は古くなっています。その答えの中のコメントはもっと単純な答えを示唆しています。

  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. Seleniumをインストールします。

    pip install Selenium
    
  4. docs から借用した簡単なテストを試してください。

    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()
    
6
Andrew E

これは私がしていること、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')
5
tlib

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

conda install PhantomJS

あなたのスクリプトで:

from Selenium import webdriver
driver=webdriver.PhantomJS()

完璧に動作します。

4
clg4

Buildout を使っている場合、Pyklerが gp.recipe.node レシピを使って記述しているインストールプロセスを簡単に自動化することができます。

[nodejs]
recipe = gp.recipe.node
version = 0.10.32
npms = phantomjs
scripts = phantomjs

その部分はnode.jsを(少なくとも私のシステムでは)バイナリとしてインストールしてからnpmを使ってPhantomJSをインストールします。最後にエントリポイントbin/phantomjsが作成されます。これを使ってPhantomJS Webドライバを呼び出すことができます。 (Seleniumをインストールするには、Eggの要件またはBuildoutの設定で指定する必要があります。)

driver = webdriver.PhantomJS('bin/phantomjs')
1
Denis Drescher