Есть ли способ использовать PhantomJS в Python?


Я хочу использовать PhantomJS на Python. Я погуглил эту проблему, но не смог найти правильные решения.

найти os.popen() может быть хорошим выбором. Но я не мог передать ему некоторые аргументы.

используя subprocess.Popen() может быть правильным решением сейчас. Я хочу знать, есть ли лучшее решение или нет.

есть ли способ использовать PhantomJS в Python?

8 198

8 ответов:

самый простой способ использовать PhantomJS в python - через Selenium. Самый простой способ установки

  1. установить NodeJS
  2. С помощью диспетчера пакетов узла установите phantomjs:npm -g install phantomjs-prebuilt
  3. установите selenium (в вашем virtualenv, если вы используете это)

после установки вы можете использовать phantom так же просто, как:

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

ссылки:

PhantomJS недавно dropped Python support в целом. Однако PhantomJS теперь вставляет Водитель-Призрак.

новый проект с тех пор активизировался, чтобы заполнить пустоту: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.

я попробовал установку узла PhantomJS, как предложил Pykler, но на практике я обнаружил, что это медленнее, чем автономная установка PhantomJS. Я предполагаю, что автономная установка не предоставляла эти функции ранее, но с v1.9 она очень сильно это делает.

  1. Установить PhantomJS (http://phantomjs.org/download.html) (Если вы находитесь на Linux, следующие инструкции помогут https://stackoverflow.com/a/14267295/382630)
  2. установите Selenium с помощью pip.

теперь вы можете использовать вот так

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

driver.quit()

вот как я тестирую javascript с помощью PhantomJS и Django:

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

это то, что я делаю, 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()

отлично работает.

The ответ @Pykler отлично, но требование узла устарело. Комментарии в этом ответе предлагают более простой ответ, который я поставил здесь, чтобы сэкономить время других:

  1. Установить PhantomJS

    как указывает @Vivin-Paliath, это автономный проект, а не часть узла.

    Mac:

    brew install phantomjs
    

    Ubuntu:

    sudo apt-get install phantomjs
    

    etc

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

В случае, если вы используете климатическое оборудование, вы можете легко автоматизировать процессы установки, которые Pykler описывает с помощью gp.рецепт.узел рецепт.

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

эта часть устанавливает узел.js как двоичный (по крайней мере, в моей системе), а затем использует npm для установки PhantomJS. Наконец, он создает точку входа bin/phantomjs, который вы можете назвать PhantomJS webdriver С. (Чтобы установить Selenium, вам нужно указать его в ваших требованиях к яйцу или в сборке конфигурация.)

driver = webdriver.PhantomJS('bin/phantomjs')