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.