Ejecutar Selenium Webdriver en Termux
Introducción
Termux es un entorno Linux para Android con el que, entre otras cosas, puedes ejecutar Python en dispositivos móviles. Para instalar Python simplemente ejecuta:
$ pkg install python
En Termux puedes hacer muchas cosas, pero algo que me costó mucho fue ejecutar selenium-webdriver en Termux. No hay problema en instalar selenium, simplemente hazlo mediante pip:
$ pip install selenium
El problema es que no hay manera de instalar Chomium o Firefox directamente: no hay un navegador web sobre el que automatizar tareas. La única solución es instalar Ubuntu en Termux.
Ubuntu en Termux
Instalación
Gracias al gestor de paquetes pkg y a proot es posible instalar Ubuntu en Termux simplemente ejecutando dos comandos:
$ pkg install proot-distro
$ proot-distro install ubuntu
Iniciar sesión
Para iniciar sesión (entrar en Ubuntu desde Termux) ejecuta lo siguiente:
$ proot-distro login ubuntu
Fíjate en que el prompt del terminal ha cambiado de $
a root@localhost:~#
: has iniciado sesión como usuario root en ubuntu, pero recuerda que este ubuntu se está ejecutando bajo proot, de modo que solamente puedes realizar acciones propias de root en el espacio limitado por proot (no eres root en Android y dentro de proot no puedes modificar el sistema).
Actualizar APT
No confundas el gestor de paquetes apt de Termux con el de Ubuntu. No son los mismos y tienen acceso a repositorios distintos.
Dentro de la sesión ubuntu ejecuta:
root@localhost:~# apt update
root@localhost:~# apt upgrade
A continuación instalaremos Firefox y geckodriver.
Firefox y Geckodriver
Dentro de la sesión ubuntu ejecuta los siguientes comandos para instalar Firefox y su webdriver:
root@localhost:~# apt install firefox
root@localhost:~# apt install firefox-geckodriver
Si intentas ejecutar Firefox mediante:
root@localhost:~# firefox
Se producirá un error, ya que no has instalado un gestor de ventanas en ubuntu. En otras palabras, Firefox no puede mostrar su interfaz gráfica. No obstante, para utilizar selenium no necesitamos instalar un gestor de ventanas, ya que podemos desplegar el navegador en modo headless.
Ejemplo (test.py)
Quizás te sorprenda que no es necesario que instales python en ubuntu si ya lo instalaste en Termux. Todos los programas que instales en la sesión ubuntu solamente son accesibles desde ubuntu, pero proot-distro install ubuntu
configuró algunas cosas por nosotros para que podamos acceder a los "programas globales" para no tener que reinstalarlos.
Como ya habíamos instalado python y selenium en Termux y en la sesión ubuntu hemos instalado Firefox y Geckodriver prueba a crear un script como el siguiente (por ejemplo con el editor nano):
# test.py
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.add_argument('--headless') # EN SEGUNDO PLANO, SIN GUI
driver = webdriver.Firefox(executable_path='/usr/bin/geckodriver', options=options)
driver.get('https://google.es')
html = driver.page_source
print(html)
driver.quit()
Mediante options.add_argument('--headless')
conseguimos que el navegador se ejecute en segundo plano y no se produzca error por no disponer el subsistema de un gestor de ventanas.
Puedes ejecutar el programa con cpython así:
root@localhost:~# python3 test.py
Comprobarás que funciona perfectamente
Usar pypy3 (opcional)
Si lo deseas puedes ejecutar selenium con pypy3 en lugar de cpython. pypy3 no está disponible para Termux pero si para Ubuntu. En el subsistema ubuntu ejecuta:
root@localhost:~# apt update
root@localhost:~# apt install pypy3
root@localhost:~# wget https://bootstrap.pypa.io/get-pip.py
root@localhost:~# pypy3 get-pip.py
root@localhost:~# rm get-pip.py
root@localhost:~# pypy3 -m pip install selenium
Ahora puedes ejecutar el ejemplo (test.py) que vimos anteriormente así:
root@localhost:~# pypy3 test.py
NOTAS SOBRE PROOT
En Termux puedes ejecutar otras distribuciones Linux gracias a proot, que es un programa similar a chroot pero que a diferencia de este no requiere que seas root a expensas de una penalización en el rendimiento. En el espacio de un usuario-no-root y con proot se puede ejecutar un proceso para el que el directorio raíz sea cualquier subdirectorio en el espacio de usuario. Esto significa que este proceso y sus subprocesos tienen su acceso limitado a este directorio, ya que lo consideran el directorio raíz. En este directorio puedes instalar una distribución linux distinta a la original que compartirá el kernel de la original, que en este caso es el kernel de Android.