library - web scraping python beautifulsoup
no se puede llamar a Firefox del selenio en python en la máquina AWS (3)
Estoy tratando de usar selenio de Python para raspar algunas páginas de dinámica con javascript. Sin embargo, no puedo llamar a Firefox después de seguir las instrucciones del selenio en la página de pypi (http://pypi.python.org/pypi/selenium). Instalé Firefox en AWS ubuntu 12.04. El mensaje de error que recibí es:
In [1]: from selenium import webdriver
In [2]: br = webdriver.Firefox()
---------------------------------------------------------------------------
WebDriverException Traceback (most recent call last)
/home/ubuntu/<ipython-input-2-d6a5d754ea44> in <module>()
----> 1 br = webdriver.Firefox()
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout)
49 RemoteWebDriver.__init__(self,
50 command_executor=ExtensionConnection("127.0.0.1", self.profile,
---> 51 self.binary, timeout),
52 desired_capabilities=DesiredCapabilities.FIREFOX)
53
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.pyc in __init__(self, host, firefox_profile, firefox_binary, timeout)
45 self.profile.add_extension()
46
---> 47 self.binary.launch_browser(self.profile)
48 _URL = "http://%s:%d/hub" % (HOST, PORT)
49 RemoteConnection.__init__(
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in launch_browser(self, profile)
42
43 self._start_from_profile_path(self.profile.path)
---> 44 self._wait_until_connectable()
45
46 def kill(self):
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in _wait_until_connectable(self)
79 raise WebDriverException("The browser appears to have exited "
80 "before we could connect. The output was: %s" %
---> 81 self._get_firefox_output())
82 if count == 30:
83 self.kill()
WebDriverException: Message: ''The browser appears to have exited before we could connect. The output was: Error: no display specified/n''
Busqué en la web y descubrí que este problema sucedió con otras personas (https://groups.google.com/forum/?fromgroups=#!topic/selenium-users/21sJrOJULZY). Pero no entiendo la solución, si es así.
¿Alguien puede ayudarme por favor? ¡Gracias!
El problema es que Firefox requiere una pantalla. He usado pyvirtualdisplay en mi ejemplo para simular una pantalla. La solucion es:
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(1024, 768))
display.start()
driver= webdriver.Firefox()
driver.get("http://www.somewebsite.com/")
<---some code--->
#driver.close() # Close the current window.
driver.quit() # Quit the driver and close every associated window.
display.stop()
Tenga en cuenta que pyvirtualdisplay requiere uno de los siguientes back-ends: Xvfb, Xephyr, Xvnc.
Esto debería resolver su problema.
Esto ya está en el comentario de la pregunta de OP, pero para plantearlo como una respuesta. Puede ejecutar Selenium en segundo plano sin abrir una ventana de navegador real.
Por ejemplo, si usas Chrome, establece estas opciones:
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.set_headless(headless=False)
Luego, cuando llamas a tu controlador web, tu configuración se convierte en un parámetro:
browser = webdriver.Chrome(chrome_options=chrome_options)
Yo también tuve el mismo problema. Estaba en Firefox 47 y Selenium 2.53. Entonces, lo que hice fue degradar Firefox a 45. Esto funcionó.
1) Eliminar primero Firefox 47:
sudo apt-get purge firefox
2) Verifique las versiones disponibles:
apt-cache show firefox | grep Version
Mostrará las versiones de Firefox disponibles como:
Version: 47.0+build3-0ubuntu0.16.04.1
Version: 45.0.2+build1-0ubuntu1
3) Decir qué versión descargar
sudo apt-get install firefox=45.0.2+build1-0ubuntu1
4) A continuación, no tiene que actualizar a la versión más nueva.
sudo apt-mark hold firefox
5) Si quieres actualizar más tarde
sudo apt-mark unhold firefox
sudo apt-get upgrade
Espero que esto ayude.