phantomjsdriver phantom macosx example python phantomjs

python - macosx - phantomjsdriver



¿Hay alguna manera de usar PhantomJS en Python? (8)

Quiero usar PhantomJS en Python . Busqué en Google este problema pero no pude encontrar soluciones adecuadas.

Creo que os.popen() puede ser una buena opción. Pero no pude pasarle algunos argumentos.

Utilizar subprocess.Popen() puede ser una solución adecuada por ahora. Quiero saber si hay una mejor solución o no.

¿Hay alguna manera de usar PhantomJS en Python?


Ahora, desde que GhostDriver viene con PhantomJS, se ha vuelto aún más conveniente usarlo a través de Selenium.

Probé la instalación de PhantomJS en el nodo, como lo sugirió Pykler, pero en la práctica encontré que era más lenta que la instalación independiente de PhantomJS. Supongo que la instalación independiente no proporcionó estas características anteriormente, pero a partir de la v1.9, lo hace en gran medida.

  1. Instale PhantomJS ( http://phantomjs.org/download.html ) (Si está en Linux, las siguientes instrucciones lo ayudarán a https://.com/a/14267295/382630 )
  2. Instale Selenium utilizando pip.

Ahora puedes usar así

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


Así es como pruebo javascript utilizando PhantomJS y 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

Ejecutar pruebas :

manage.py test mobile


En caso de que esté utilizando Buildout , puede automatizar fácilmente los procesos de instalación que Pykler describe usando la receta gp.recipe.node .

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

Esa parte instala node.js como binario (al menos en mi sistema) y luego usa npm para instalar PhantomJS. Finalmente, crea un punto de entrada bin/phantomjs , con el que puede llamar al controlador web de PhantomJS. (Para instalar Selenium, debe especificarlo en sus requisitos de Egg o en la configuración de Buildout).

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


La forma más fácil de usar PhantomJS en python es a través de Selenium. El método de instalación más simple es

  1. Instala NodeJS
  2. Usando el administrador de paquetes de Node, instale phantomjs: npm -g install phantomjs-prebuilt
  3. instale selenium (en su virtualenv, si lo está usando)

Después de la instalación, puede usar phantom tan simple como:

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

Si la variable de entorno de la ruta del sistema no está configurada correctamente, deberá especificar la ruta exacta como un argumento para webdriver.PhantomJS() . Reemplace esto:

driver = webdriver.PhantomJS() # or add to your PATH

... con lo siguiente:

driver = webdriver.PhantomJS(executable_path=''/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs'')

Referencias:


La respuesta de @Pykler es excelente, pero el requisito de Nodo no está actualizado. Los comentarios en esa respuesta sugieren la respuesta más simple, que he puesto aquí para ahorrar tiempo a otros:

  1. Instala PhantomJS

    Como señala @ Vivin-Paliath, es un proyecto independiente, que no forma parte de Node.

    Mac:

    brew install phantomjs

    Ubuntu:

    sudo apt-get install phantomjs

    etc

  2. Configura un virtualenv (si aún no lo has hecho):

    virtualenv mypy # doesn''t have to be "mypy". Can be anything. . mypy/bin/activate

    Si su máquina tiene Python 2 y 3, es posible que necesite ejecutar virtualenv-3.6 mypy o similar.

  3. Instalar selenio:

    pip install selenium

  4. Prueba una prueba simple, como esta tomada de los 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()


PhantomJS recientemente eliminó el soporte de Python por completo. Sin embargo, PhantomJS ahora incorpora Ghost Driver .

Desde entonces, se ha ghost.py un nuevo proyecto para llenar el vacío: ghost.py . Probablemente quieras usar eso en su lugar:

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


Si usa Anaconda, instale con:

conda install PhantomJS

en su guión:

from selenium import webdriver driver=webdriver.PhantomJS()

funciona perfectamente.


esto es lo que hago, python3.3. Estaba procesando grandes listas de sitios, por lo que fallar en el tiempo de espera fue vital para que el trabajo se ejecutara en toda la lista.

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