Hemos hablado sobre cómo automatizar tareas utilizando Selenium y también cómo incluir código python en ellas.

La potencia y facilidad de uso de Selenium la ha convertido en una de principales herramientas con las que testear flujos en páginas web y una de las más utilizadas por la comunidad de python.

Sin embargo los problemas llegan cuando queremos llevar nuestra solución a la nube y poder, por ejemplo, dejar automatizados nuestros tests de Selenium.

Aunque existen opciones, e instalar Python y Selenium en un hosting es una de ellas, puede requerir por tu parte ciertos conocimientos extra para configurar y administrar el sistema, instalar un certificado de seguridad o crear una Web App.

Esto puede terminar dificultando la puesta en funcionamiento de tu solución en la nube, por lo que quiero compartirte el método que personalmente utilizo para publicar mis automatizaciones con Selenium.

Python Anywhere es un servicio en la nube que te permite disponer de un servidor donde ejecutar código escrito en Python junto a un framework (a elegir) para convertirlo en Web App.

Todo viene instalado y preconfigurado desde un inicio, lo que te permite comenzar a trabajar literalmente en cuestión de minutos.

Sumado a que entre los distintos planes que ofrece incluye uno completamente gratuito, supone una muy buena opción a considerar para aquellos proyectos de mediana o pequeña escala, prototipos o proyectos en fase de desarrollo.

A continuación quiero mostrarte cómo automatizar tareas que requieren de Selenium utilizando pythonanywhere, las limitaciones que esto presenta y por último cómo solventar algunas de ellas con Botize.

Terminaremos con un ejemplo paso a paso donde construiremos una tarea automática que, dado una keyword, buscará los 10 primeros resultados en Internet y nos los enviará por email, todo desplegado en la nube y de manera gratuita.

Activación del entorno

Python anywhere simplifica este paso al máximo. Únicamente necesitas registrarte aquí y crear un primera Web App. Automáticamente le asignará un dominio con HTTPS e instalará y configurará el framework que elijas.

Una vez hecho esto podrás añadir tu código y llamarlo a través de la url que elijas.

Aquí tienes uno a uno los pasos para registrarte y crear tu primera Web App con pythonanywhere.

Incluir Selenium

Selenium hace uso de un navegador web para ejecutar los distintos comandos de nuestros tests. Al ser Python Anywhere una solución en la nube y no haber ningún dispositivo de vídeo donde Selenium pueda abrir y mostrar un navegador web, Python Anywhere solventa este punto por medio de un dispositivo virtual (PyVirtualDisplay).

Sin embargo, Python Anywhere actualmente solo soporta el navegador Firefox.

Esto no sería un problema sino fuera porque la versión que soporta ya entrados en 2021 continúa siendo la v17.0 de Firefox, una versión que vió la luz en 2012 y que ya no soportan muchas webs, como por ejemplo Instagram.

Por suerte existe una manera de pedir la activación de Chrome y solucionar así esta primera limitación.

Limitaciones de la cuenta gratuita de Python Anywhere

La cuenta gratuita viene con dos limitaciones más que deberemos tener en cuenta.

La primera de ellas afecta a Selenium y es que solo es posible acceder a un listado específico de dominios, actualmente compuesto de 3453 dominios, todos ellos de sitios que han sido validados y que cuentan con un API publica.

La razón de esta limitación es evitar el uso indebido de Selenium desde el anonimato que ofrecen las cuentas gratuitas. Las demás cuentas por el contrario, pueden acceder a cualquier dominio dado que en este caso el usuario puede llegar a ser identificado con sus datos de pago, como explica Python Anywhere.

La segunda limitación tiene que ver con el sistema de programación de tareas y también afecta solamente a las cuentas gratuitas. En este caso el programador de tareas está limitado a una ejecución diaria.

Este es un aspecto que con Botize podemos solucionar al poder ejecutar llamadas a la Web App con la frecuencia que necesitemos. Pudiendo además enviarle parámetros y recibirlos para accionar con ellos otras automatizaciones.

A continuación vamos a ver un ejemplo concreto en el que programaremos una tarea automática que ejecutará una vez cada hora una Web App que crearemos y que usará Selenium para devolvernos las páginas que ocupan las primeras posiciones en internet dada una keyword cualquiera.

Este ejemplo, incluso programado para ejecutarse una vez cada hora, funciona perfectamente con una cuenta gratuita de Python Anywhere.

Ejemplo paso a paso

Desde tu Dashboard de PythonAnywhere haz clic en «Open Web tab» para acceder al apartado de aplicaciones web.

Haz clic en el botón «Add a new web app» para crear la aplicación.

A continuación se muestra el nombre de dominio que te ha asignado PythonAnywhere. Si bien las cuentas gratuitas no permiten modificarlo, esto no tiene porqué suponer un problema.

Haz clic en Next para continuar.

Ahora debemos elegir el framework de la App Web y la versión de Python a usar. Para este ejemplo haré uso del framework Flash y la versión de Python 3.8.

A continuación puedes personalizar la ruta de tu aplicación aunque no es necesario y puedes dejarlo tal cual está.

Haz un clic en Next para continuar.

Ahora tu entorno ya está instalado y configurado.

En el caso de tener una cuenta gratuita necesitarás hacer un clic en el botón «Run until 3 months from today» cada 3 meses para mantenerla activa.

Para acceder al directorio de archivo de la Web App que se ha creado haz clic en la opción Files del menú superior.

El código de nuestra aplicación deberá crearse dentro de la carpeta «mysite«. Haz clic en ella para ver qué contiene.

Actualmente solo existe el archivo flask_app.py. Este es el archivo principal de la aplicación y donde escribiremos el nuestro. Haz un clic en él para abrirlo en el editor de código de PythonAnywhere.

Actualmente la aplicación cuenta con el código básico para ejecutar el framework de Flask y mostrar en pantalla el mensaje «Hello from Flask!» cuando se invoca la ruta «/».

Puedes comprobar que esto es así incluyendo el dominio que te asignó PythonAnywhere en un navegador web.

Elimina el código actual para incluir el de nuestro ejemplo.

En primer lugar incluiremos las distintas librerías que serán necesarias, entre ellas request para recuperar los parámetros de la tarea automática y pyvirtualdisplay, webdriver y Keys para ejecutar Selenium.

from flask import Flask
from flask import request
from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import json

Seguidamente instanciamos Flask y creamos la ruta que utilizaremos en el navegador para llamar a nuestro código.

app = Flask(__name__)

@app.route('/',methods=["GET"])
def botize():

A continuación vamos a leer los argumentos que GET, por donde la tarea automática nos enviará la keyword a buscar.

data = request.args
keyword = data.get("keyword","")

Finalmente ejecutaremos selenium para acceder al buscador, escribir la keyword y recuperar el ranking de resultados.

    data = request.args
    keyword = data.get("keyword","test")

    with Display():

        browser = webdriver.Firefox()

        try:
            browser.get('http://www.google.com')

            search = browser.find_element_by_name('q')
            search.send_keys(keyword)
            search.send_keys(Keys.RETURN)

            results = []

            elems = browser.find_elements_by_xpath('//div[@class="g"]')

            for elem in elems:
                results.append({
                    "title":elem.find_element_by_xpath(".//a//h3").text,
                    "url": elem.find_element_by_tag_name("a").get_attribute("href")
                })

            return {
                "meta": {"code":200},
                "data": {"ranking":json.dumps(results)}
            }

        finally:
            browser.quit()

Como puedes ver el script termina devolviendo un objeto con los datos obtenidos. Este objeto lo recibirá la tarea automática de modo que pueda hacer distintas operaciones con él: notificarlo por email, guardarlo en una base de datos, enviarnoslo por medio de una notificación Push, etc.

Para terminar guarda los cambios haciendo un clic en Save y reinicia la Web App haciendo un clic en el botón de refrescar (↻) que queda situado a la derecha.

Es hora de probar el resultado manualmente. Abre un navegador e introduce la dirección de tu dominio seguido de la ruta seguido de una keyword.

Como resultado se mostrará el objeto con la estructura que hemos indicado y los datos que se han obtenido del buscador.

Creando la tarea automática

Creemos la tarea automática que se encargará de ejecutar la Web App cada hora.

Accede a Botize y crea una nueva tarea o directamente haz clic aquí.

Estás en el editor de tareas de Botize. El primer paso es seleccionar el servicio que dará comienzo a la tarea, en nuestro caso la llamada a la Web App que haremos mediante un Webhook. Haz clic en el icono de Webhooks como se muestra en la imagen.

De entre las distintas operaciones que podemos automatizar elige la opción «Ejecutar una petición GET«.

En el campo URL especifica el dominio de tu Web App y en el campo «Parámetros GET» el parámetro keyword junto a la keyword que quieras utilizar.

Haz clic en Siguiente para continuar y Botize mostrará de nuevo los servicios que podemos utilizar para seguir automatizando acciones con el resultado de la Web App.

Dado que hemos recibido un JSON con todos los resultados del buscador, utilizaremos Mustache para generar un template con él y finalmente nos lo enviaremos por email.

En la caja de búsqueda escribe mustache y selecciona este servicio.

A continuación haz clic en la opción «Renderizar una plantilla«.

En el campo Hash escribe {{ranking}}, que es la cadena JSON que nos ha entregado la Web App.

En campo Template escribe el siguiente template, que recorre cada resultado y genera un listado HTML con él.

<h2>Resultados de la búsqueda</h2>
{{#.}}
  <a href="{{url}}" target="_blank">{{url}}</a>
  <h3>{{title}}</h3>
  <hr>
{{/.}}

Tan solo nos queda añadir un último paso, el envío del template con los resultados de la búsqueda por email.

Haz un clic en el botón Siguiente.

Para añadir el último paso haz un clic en el icono «+» situado a la derecha de Mustache.

De entre los distintos servicios que podemos automatizar ahora, selecciona Botize Mail como se muestra en la siguiente imagen.

Elige la opción «Ejecutar un email desde bot@botize.com«, para que Botize te envíe un correo con el template a tu dirección.

En el campo Para indica tu dirección de correo, en el campo Mensaje añade la etiqueta Template y marca la opción «enviar como HTML«.

Pulsa el botón Siguiente para continuar y aparecerá un mensaje indicando que, para poder recibir emails en la cuenta que has indicado, primero deberás confirmar que eres el propietario de dicha cuenta enviando primero un email desde esta a bot@botize.com con el asunto BOTIZE.

Una vez enviado el email pulsa el botón Verificar y para terminar el botón de Guardar cambios.

Tu tarea ya está lista y por defecto configurada para ejecutarse una vez cada hora, de tal modo que recibirás un email con los resultados para la palabra clave indicada.

Enhorabuena, acabas de crear todo un sistema de automatización en la nube, incluyendo servicios de Botize para enviar emails, código Python y un flujo de Selenium para obtener información de un sitio web de acuerdo a parámetros.

Si por el contrario tienes problemas con alguno de los pasos puedes dejarlo en los comentarios de esta entrada.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *