Headless Browsing: Screenshot de sitio web con Python y pyppeteer.
La automatización del navegador es usar Python para ejecutar pasos e integrar información de un navegador web en nuestro flujo de datos, como parte de los procesos DevOps y Build Automation con Python.
En este caso concreto realizaremos la apertura de la página web «https://learnsql.com/«, tomaremos una captura de pantalla y la guardaremos en el directorio de nuestro proyecto. Su nivel de dificultad es mínimo pero su integración a un flijo de datos requerirá configuraciones adicionales.
Como sabemos, para realizar esto por ejemplo en Windows se requiere presionar la tecla del logotipo de Windows + Mayús + S. El escritorio se oscurecerá mientras seleccionas un área para la captura de pantalla. Sin embargo, podemos utilizar un código que automatiza esta función en Python. Lo primero es instalar las librerías necesarias, pyppeteer y asyncio:
pip install pyppeteer
pip install asyncio
Luego escribimos un código abreviado para abrir la página web y tomar una captura de pantalla, al cual nombraremos «web_screenshot.py»:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(options={'args': ['--no-sandbox']})
page = await browser.newPage()
await page.goto('https://learnsql.com/')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
Nota : cuando ejecuta pyppeteer por primera vez, descarga la última versión de Chromium (~150 MB) si no se encuentra en su sistema. Si no prefiere este comportamiento, asegúrese de tener instalado un binario de Chrome adecuado. Una forma de hacer esto es ejecutar pyppeteer-installel comando antes de usar esta biblioteca.
[INFO] Starting Chromium download.
Una vez terminada la ejecución del script podrá encontrar el screenshot de la página web «learnsql.com» en el directorio de su proyecto que se ha guardado con el nombre de «example.png».

Puede abrir la imagen para ver su contenido.

Este script puede configurarlo para una lista de URLs y obtener los screenshots de cada una, guardando las respectivas imágenes obtenidas en un directorio particular el cual podrá servidor como directorio «images», «assets», o «static» en su sitio web o aplicación.
Muchas proveedores de SaaS, y paneles de control web, han integrado en sus procesos el despliege de screenshot como parte de la información que ofrecen a sus osuarios, respecto de webs o aplicaciones que hospedan o administran.
El caso de Vercel, que automatiza la este proceso una vez que se ha hecho el deploy satisfactorio de la aplicación, y subsiguientes deploys.

Automatización en AirFlow
Para ejecutar automáticamente este script «web_screenshot.py» de Python con Apache Airflow, primero debe definir un DAG (Grafo Acíclico Dirigido) en un archivo Python que indique cómo y cuándo se debe ejecutar el archivo de Python. Luego, puede usar el programador de tareas incorporado de Airflow para planificar y ejecutar la DAG según lo programado.
Crea un DAG simple para ejecutar el código escrito en el archivo de Python llamado «web_screenshot.py» todos los días a las 3 a.m.
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
# definir la función que se ejecutará
def mi_funcion():
exec(open('/ruta/a/web_screenshot.py').read())
# definir el DAG
default_args = {
'owner': 'yo',
'depends_on_past': False,
'start_date': datetime(2023, 3, 11, 3, 0),
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG(
'demo',
default_args=default_args,
description='Ejecución de web_screenshot.py todos los días a las 3 a.m.',
schedule_interval=timedelta(days=1),
)
# definir el operador PythonOperator que ejecutará mi_funcion
mi_operador = PythonOperator(
task_id='mi_tarea',
python_callable=mi_funcion,
dag=dag,
)
# definir la dependencia del operador
mi_operador
En este ejemplo, la función mi_funcion() simplemente ejecuta el archivo «web_screenshot.py». Luego, se define un DAG llamado «demo» con un operador PythonOperator llamado «mi_tarea» que ejecutará mi_funcion().
El DAG está programado para comenzar a las 3 a.m. el día en que se defina y se repetirá diariamente (schedule_interval=timedelta(days=1)). Si desea programar la ejecución en un intervalo de tiempo diferente, simplemente modifique el argumento start_date y schedule_interval según sea necesario.
Una vez que haya definido su DAG, puede guardar el archivo Python y agregarlo al directorio «dags» en su instalación de Airflow. Airflow automáticamente detectará y cargará el DAG en su sistema, y se ejecutará según lo programado. Puede monitorear el progreso del DAG en la interfaz web de Airflow.

Utilidades avanzadas
La automatización dentro de un pipeline o flujo de datos entre procesos es parte del fundamento del DevOps. Con AirFlow puedes crear DAGs que analizen y verifiquen la integridad de procesos, reporten fallas mediante envio de correo electrónico, realizar labores de mantenimiento o respaldo en Bases de Datos, e incluso ejecutar trabajos de entrenamiento y predicción en sistemas de Inteligencia Artificial sobre nuevos datasets.
Para conocer más sobre la automatización con AirFlow puedes visitar su centro de documentación.
Cloud Composer
Servicio totalmente gestionado de orquestación de flujos de trabajo integrado en Apache Airflow sobre Google Cloud.
Capacitación recomendada
Para ahondar más en el tema de la automatización DevOps con Python te recomiendo seguir el programa especializado Python Scripting for DevOps Specialization en Coursera.
Lea también Tutorial ¿Cómo configurar Airflow en un servidor Ubuntu? Parte 1