Я хочу использовать PhantomJS в Python. Я искал эту проблему, но не смог найти правильные решения.
Я считаю, что os.popen()
может быть хорошим выбором. Но я не мог передать ему некоторые аргументы.
Использование subprocess.Popen()
может быть правильным решением. Я хочу знать, есть ли лучшее решение или нет.
Есть ли способ использовать PhantomJS в Python?
Ответ 1
Самый простой способ использовать PhantomJS в Python - это через Selenium. Самый простой способ установки
- Установить NodeJS
- Используя менеджер пакетов Node, установите phantomjs:
npm -g install phantomjs-prebuilt
- установить селен (в вашем 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')
Рекомендации:
Ответ 2
Недавно 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
Ответ 3
Теперь, когда GhostDriver поставляется вместе с PhantomJS, стало еще удобнее использовать его через Selenium.
Я попробовал установку Node PhantomJS, как было предложено Pykler, но на практике я обнаружил, что она медленнее, чем автономная установка PhantomJS. Я полагаю, что автономная установка ранее не предоставляла эти функции, но с версии v1.9 это очень многое делает.
Теперь вы можете использовать это как
import selenium.webdriver
driver = selenium.webdriver.PhantomJS()
driver.get('http://google.com')
# do some processing
driver.quit()
Ответ 4
Вот как я тестирую javascript, используя PhantomJS и Django:
мобильный /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);
});
мобильный /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
Ответ 5
Ответ @Pykler отличный, но требования к Node устарели. Комментарии в этом ответе предлагают более простой ответ, который я поставил здесь, чтобы сэкономить время других:
-
Установить PhantomJS
Как указывает @Vivin-Paliath, это отдельный проект, а не часть Node.
Mac:
brew install phantomjs
Ubuntu:
sudo apt-get install phantomjs
так далее
-
Настройте virtualenv
(если вы еще этого не сделали):
virtualenv mypy # doesn't have to be "mypy". Can be anything.
. mypy/bin/activate
Если на вашей машине установлены Python 2 и 3, вам может потребоваться запустить virtualenv-3.6 mypy
или аналогичный.
-
Установить селен:
pip install selenium
-
Попробуйте простой тест, например, заимствованный из документации:
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
это то, что я делаю, 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')
Ответ 7
Если вы используете Anaconda, установите с помощью:
conda install PhantomJS
в script:
from selenium import webdriver
driver=webdriver.PhantomJS()
работает отлично.
Ответ 8
Если вы используете Buildout, вы можете легко автоматизировать процессы установки, описанные Pykler, используя gp.recipe.node.
[nodejs]
recipe = gp.recipe.node
version = 0.10.32
npms = phantomjs
scripts = phantomjs
Эта часть устанавливает node.js как двоичный (по крайней мере, в моей системе), а затем использует npm для установки PhantomJS. Наконец, он создает точку входа bin/phantomjs
, с которой вы можете позвонить webdriver PhantomJS. (Чтобы установить Selenium, вам нужно указать его в своих требованиях к яйцам или в конфигурации Buildout.)
driver = webdriver.PhantomJS('bin/phantomjs')
Ответ 9
Существует проблема, в то время как я пытался получить скриншоты с помощью PhantomJs & Python, некоторые из полученных мной изображений загружены не полностью. У кого-нибудь есть подсказки? Это мой код
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("https://world.taobao.com")
driver.save_screenshot('x.png')
Я попытался решить эту проблему с помощью driver.implicitly_wait(5)
, но это не сработало. введите описание изображения здесь