Есть ли способ использовать PhantomJS в Python?
Я хочу использовать PhantomJS на Python. Я погуглил эту проблему, но не смог найти правильные решения.
найти os.popen()
может быть хорошим выбором. Но я не мог передать ему некоторые аргументы.
используя subprocess.Popen()
может быть правильным решением сейчас. Я хочу знать, есть ли лучшее решение или нет.
есть ли способ использовать PhantomJS в Python?
8 ответов:
самый простой способ использовать PhantomJS в python - через Selenium. Самый простой способ установки
- установить NodeJS
- С помощью диспетчера пакетов узла установите phantomjs:
npm -g install phantomjs-prebuilt
- установите 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 она очень сильно это делает.
- Установить PhantomJS (http://phantomjs.org/download.html) (Если вы находитесь на Linux, следующие инструкции помогут https://stackoverflow.com/a/14267295/382630)
- установите 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 отлично, но требование узла устарело. Комментарии в этом ответе предлагают более простой ответ, который я поставил здесь, чтобы сэкономить время других:
Установить PhantomJS
как указывает @Vivin-Paliath, это автономный проект, а не часть узла.
Mac:
brew install phantomjs
Ubuntu:
sudo apt-get install phantomjs
etc
настройка
virtualenv
(если вы еще нет):virtualenv mypy # doesn't have to be "mypy". Can be anything. . mypy/bin/activate
если ваша машина имеет как Python 2 и 3 Вам может понадобиться запустить
virtualenv-3.6 mypy
или аналогичные.установить selenium:
pip install selenium
попробуйте простой тест, как это заимствовано из 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')