Volver al blog
Python para automatización: casos reales que hemos resuelto
Python 10 de abril de 2025 10 min de lectura

Python para automatización: casos reales que hemos resuelto

No teoría — ejemplos concretos de scripts Python que usamos en producción: scraping con manejo de errores robusto, automatización de reportes y bots que funcionan sin supervisión.

BKLN Software

Equipo de desarrollo de BKLN Software & Systems.

Por qué Python para automatizar

Hay una razón por la que Python es el lenguaje de automatización por excelencia: la distancia entre "tengo una idea" y "esto funciona" es extraordinariamente corta.

En BKLN hemos resuelto con Python tareas que antes costaban horas de trabajo manual. Aquí van tres casos reales.

Caso 1: Extracción de datos con tolerancia a fallos

El primer script que construimos para un cliente era un extractor de datos de portales web. El problema clásico de scraping no es obtener los datos — es que el script falle a las 2 de la mañana porque una página tardó demasiado o cambió su estructura.

La solución fue un extractor con reintentos automáticos y logging detallado:

import requests
from bs4 import BeautifulSoup
import time
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('scraper.log'),
        logging.StreamHandler()
    ]
)

def fetch_with_retry(url, max_retries=3, delay=2):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, timeout=10)
            response.raise_for_status()
            return response
        except requests.RequestException as e:
            logging.warning(f"Intento {attempt + 1} fallido: {e}")
            if attempt < max_retries - 1:
                time.sleep(delay * (attempt + 1))
    logging.error(f"Todos los intentos fallaron para {url}")
    return None

Con este patrón, el script no muere al primer error. Reintenta con espera exponencial, registra todo en un archivo de log y continúa con el siguiente elemento. El cliente lo ejecuta cada noche con cron y a la mañana tiene los datos listos.

Caso 2: Generación automática de reportes en PDF

Un cliente necesitaba un reporte semanal de ventas que antes preparaba manualmente en Excel — dos horas de trabajo cada lunes. Lo automatizamos con Python + reportlab.

La clave fue separar la lógica de datos de la lógica de presentación:

def generar_reporte(datos, periodo):
    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer, pagesize=A4)
    elementos = []

    # Título
    estilos = getSampleStyleSheet()
    elementos.append(Paragraph(f"Reporte de ventas — {periodo}", estilos['Title']))
    elementos.append(Spacer(1, 20))

    # Tabla de datos
    tabla_datos = [['Producto', 'Unidades', 'Total XAF']]
    for fila in datos:
        tabla_datos.append([fila['producto'], str(fila['unidades']), f"{fila['total']:,}"])

    tabla = Table(tabla_datos, colWidths=[200, 80, 100])
    tabla.setStyle(tabla_estilo())
    elementos.append(tabla)

    doc.build(elementos)
    return buffer.getvalue()

El script se ejecuta los lunes a las 7:00 AM y envía el PDF por email automáticamente. El cliente no toca nada.

Caso 3: Monitor de disponibilidad con alertas

Para otro cliente construimos un monitor que comprueba cada 5 minutos si su aplicación responde correctamente y envía un mensaje de WhatsApp si detecta un problema.

import schedule
import requests

def comprobar_servicio(url, umbral_ms=2000):
    try:
        inicio = time.time()
        r = requests.get(url, timeout=10)
        duracion_ms = (time.time() - inicio) * 1000

        if r.status_code != 200:
            alertar(f"⚠️ {url} devuelve {r.status_code}")
        elif duracion_ms > umbral_ms:
            alertar(f"🐢 {url} tarda {duracion_ms:.0f}ms (umbral: {umbral_ms}ms)")
        else:
            logging.info(f"✓ {url} — {duracion_ms:.0f}ms")

    except requests.RequestException as e:
        alertar(f"🔴 {url} no responde: {e}")

schedule.every(5).minutes.do(lambda: comprobar_servicio("https://tu-app.com"))

while True:
    schedule.run_pending()
    time.sleep(1)

Simple, efectivo, sin dependencias de terceros innecesarias.

Lo que tienen en común estos scripts

Los tres comparten el mismo principio: hacen una sola cosa y la hacen bien. No intentan ser frameworks. No tienen configuración XML ni YAML. Son scripts Python directos que cualquier desarrollador puede leer, modificar y mantener.

La automatización no tiene que ser compleja para ser valiosa. A veces el mayor impacto viene de la tarea más aburrida que alguien estaba haciendo a mano.

PythonAutomatizaciónScrapingScripts

¿Necesitas ayuda técnica?

Construimos lo que necesitas.

Aprende más

Cursos prácticos en español.