lunes, abril 12, 2021

Ejemplo sencillo de python con selenium con docker

 He usado Selenium (https://www.selenium.dev) para interactuar con sitios web, en particular Selenium WebDriver y lo he usado con Python, en el ejemplo de abajo tengo un script solo para sacar el titulo del ultimo post de este blog, para este caso estoy usando chrome junto con el chromedriver los cuales necesitan tener la misma versión.

web.py

from selenium import webdriver

# define webdriver options
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver",options=options)
driver.get('https://moyoy.blogspot.com')

# get title of last post based on xpath 
last_post_xpath = '//*[@id="Blog1"]/div[1]/div[1]/div/div/div/h3/a'
last_post_title = driver.find_element_by_xpath(last_post_xpath).text
print(last_post_title)
driver.quit()


Como esto se puede ejecutar desde una maquina sin interfaz grafica buscaba crear un contenedor para poder estar haciendo pruebas y después poder desplegar una pequeña aplicación que usaría las librerías de Selenium pero me tope con varios problemas hasta que logre crear un contenedor que me pudiera ejecutar el script de arriba

Dockerfile

FROM python:3.8

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# set display port to avoid crash
ENV DISPLAY=:99

# upgrade pip
RUN pip install --upgrade pip

# install selenium
RUN pip install selenium

# add basic script
ADD web.py .
CMD ["python3", "web.py"]


Con los siguientes comandos construyen el contenedor y después lo ejecutan 

$docker build -t selenium-python .

$docker run -it selenium-python


tony@x220:~/docker/selenium-python$ docker run -it selenium-python
Invocando un pipeline de gitlab a través de la API


Dure varias horas buscando la configuración de un contenedor que me funcionara por lo que dejo este ejemplo muy básico aquí en caso de que otra persona tenga el mismo problema.

Existen algunos cambios recientes en Selenium y en como se define el driver en el código de python, posiblemente haga una actualización sobre ello


Gracias a la información en este repo pude resolver algunos de los problemas con los que me encontré:

https://hub.docker.com/r/joyzoursky/python-chromedriver/


No hay comentarios: