Чи є спосіб використовувати PhantomJS в Python?


203

Я хочу використовувати PhantomJS в Python . Я вирішив цю проблему, але не зміг знайти належне рішення.

Я вважаю, що os.popen() може бути хорошим вибором. Але я не міг передати йому деякі аргументи.

subprocess.Popen()Наразі використання може бути правильним рішенням. Хочу знати, чи є краще рішення чи ні.

Чи є спосіб використовувати PhantomJS в Python?


Моя відповідь нижче розповідає, як це зробити. Просто дивлячись на ваше питання і насправді саме це робить Селен, subprocess.popenале з деякими розширеними можливостями, щоб зробити api безшовним.
Піклер

@flyer: Ви, мабуть, повинні подумати про зміну прийнятої відповіді, див. нижче. Дякую.
dotancohen

Відповіді:


373

Найпростіший спосіб використання PhantomJS в python - це через Selenium. Найпростіший спосіб установки

  1. Встановити NodeJS
  2. За допомогою менеджера пакунків Node встановіть phantomjs: npm -g install phantomjs-prebuilt
  3. встановити селен (у вашому 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')

Список літератури:


40
Це прекрасно працювало і, ймовірно, врятувало мені дні. Дякую. Якщо хтось хоче повернути всю виведену сторінку як джерело, це так driver.page_source.
scharfmn

4
Це працює прекрасно, і я приємно здивований, тому що phantomjs.org/faq.html каже, що "не модуль Node.js", - це оболонка npm на npmjs.org/package/phantomjs змушує себе поводитися з цією метою. У моєму випадку я хотів це зробити: bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")і ... це спрацювало!
MarkHu

8
Я погоджуюся, що привид має шалену залежність, і я насправді не зміг його встановити і запустити навіть після встановлення мільйонів X11 пов'язаних бібліотек. Привид - це страшилка.
Піклер

5
@phabtar Вам потрібно пройти шлях до phantomjs як перший аргумент до PhantomJS ... або виправити систему Windows, щоб мати можливість бачити phantomjs.
Pykler

2
Німе запитання: чому мені потрібно встановити node-js? чи немає іншого способу отримати pahantomJs?
Ейльдоса

80

Нещодавно PhantomJS взагалі відмовився від підтримки Python . Однак PhantomJS тепер вбудовує драйвер Ghost .

Новий проект , так як активізував заповнити порожнечу: 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 ... спосіб простіше, ніж намагатися змусити PyQT або PySide працювати належним чином. Що приємно щодо фантома, він справді безголовий і не вимагає роботи UI / X11 пов'язаних ліфтів.
Pykler

12
Я додав відповідь нижче, пояснюючи вподобане рішення після спроби використовувати ghost.py і ненавиджу своє життя
Pykler

8
"Ненавиджу моє життя" Піклера - це не заниження. Якби хтось змінив би "правильну відповідь" на це питання на Pykler's, я б заощадив зусилля на день.
YPCrumble

2
@YPCrumble: на жаль, тільки ОП може це зробити; змінити прийняту відповідь.
Martijn Pieters

3
Спробувавши цілу низку різних підходів сьогодні вранці, рішення @Pykler закінчилося якнайшвидше.
andyzinsser

40

Оскільки GhostDriver поставляється в комплекті з PhantomJS, користуватися ним через Selenium стало ще зручніше.

Я спробував встановити Node 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()

3
особлива вдячність за вказівку на відповідь SO щодо встановлення PhantomJS на Ubuntu, мені це допомогло.
Денніс Голомазов

Швидкий спосіб встановити Selenium, який я нещодавно дізнався - це: у Windows введіть: C: \ Python34 \ Scripts \ pip.exe встановити Selenium.
ntk4

8

Ось як я тестую 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);
});

мобільний / тести.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


Дякую. Я використовував підпроцес. Відкрийте для виклику скрипта phantomjs, і він спрацював :)
листівка

Ви бачите, як це обмежено? Все, що ви робите, - це робити виклик оболонки для виконання phantomjs - ви фактично не використовуєте "належний" інтерфейс, через який ви можете правильно обробляти винятки, блокувати тощо.
kamelkev

@kamelkev: Я бачу, як це обмежено. Перевагою є те, що цей метод дозволяє мені використовувати функції завантаження Django для створення тестової бази даних з правильним вмістом для кожного тесту. І так, це може поєднуватися з іншими відповідями, щоб отримати найкраще з обох світів.
Еміль Стенстрем

6

Відповідь на @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. Встановити селен:

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

Як встановити PhantomJSна windows? Схоже, це не працює за допомогою pipкоманди.
д.м.н. Хайрул Басар

1
Pip - інсталятор пакету python, тому він працює з селеном, який доступний у вигляді пакету python. PhantomJS не є пакетом python, тому не працюватиме з pip. Я зробив швидкий Google для "PhantomJS встановити вікна", і є хороші хіти.
Ендрю Е

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 для linux64
Євген Пахомов

чорт, я люблю конду <3, що було так легко. я на ОСХ.
O.rka

1

Якщо ви використовуєте 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. (Щоб встановити Selenium, його потрібно вказати у своїх вимогах до яєць або в конфігурації Buildout.)

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

1
Ще один спосіб автоматизувати процес інсталяції за допомогою збірки - це просто використання gp.recipe.phantomjs, яке налаштовує phantomjsіcasperjs
gakhov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.