4.5Automatización y web scraping
Lo esencial en 30 segundos
- ROI primero : tarea de 30 min/semana + script de 2 h = rentabilizado en un mes ; pathlib, openpyxl/pandas, logging como caja de herramientas.
- Dúo estático :
requests.getrecupera (timeout, user-agent),BeautifulSoupanaliza (select) ; Selenium pilota un navegador para JavaScript. - Reflejo de Nabil : robots.txt + CGU ANTES de la primera petición, pausas entre peticiones, API oficial preferida al scraping.
Mini-caso hilado — Nabil automatiza su vigilancia de precios
Cada lunes, Nabil, en Argel, recoge a mano precios públicos para su vigilancia competitiva : 30 minutos de copiar-pegar. Escribe un script cortés : lee el robots.txt y las CGU del sitio, espacía sus peticiones 2 segundos con un user-agent identificado, extrae los precios con BeautifulSoup y los guarda en CSV con logs. Cuando el sitio ofrece una API oficial, cambia a ella. Último hito del hilo : el analista que ganó sus lunes — limpiamente.
Último caso del hilo 4.1-4.5 — Nabil cierra sus especializaciones.
1. Automatizar lo rentable
Automatizamos lo repetitivo : archivos, hojas de cálculo (openpyxl/pandas), informes, correos — con pathlib para las rutas. La regla : calcular el ROI antes de programar (30 min/semana contra 2 h de desarrollo = rentable en un mes). Y lo fiabilizamos : logging para trazar, try específicos con alertas, pruebas sobre copias (nunca sobre los originales) y luego planificación (cron, Programador) para girar solo. Nabil prueba su renombrado sobre copias antes de tocar las carpetas reales.
2. Raspar con cortesía : requests, BeautifulSoup, Selenium
Para páginas estáticas : requests.get descarga (con timeout y User-Agent identificado), BeautifulSoup analiza el HTML (select(".prix")), guardamos en CSV. La cortesía : leer robots.txt, espaciar las peticiones (time.sleep), nunca saturar — si no, bloqueo. Para JavaScript y el desplazamiento infinito : Selenium pilota un navegador real, más pesado. Y la regla maestra : si existe una API oficial (o si login/CGU lo prohíben), la usamos — el scraping viene en último lugar, nunca contra las reglas.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — La vigilancia de precios de Nabil
El scraper cortés de Nabil, con las API reales :
r = requests.get(url, timeout=10, headers={"User-Agent": "veille-perso"})
prix = BeautifulSoup(r.text, "html.parser").select_one(".prix").text
logging.info("%s : %s", url, prix) # todo trazado
time.sleep(2) # cortesía : espaciar las peticiones
Lectura : recuperar, analizar, trazar, esperar.
Lección : timeout + user-agent + pausa = scraper cortés.
Vocabulario de la sección
- Automatización / ROI
- Confiar las tareas repetitivas a un script (archivos, hojas de cálculo, informes) tras verificar que el tiempo ganado supera al tiempo de desarrollo.
Ejemplo sencillo: Nabil : 30 min/semana ahorrados por 2 h de desarrollo, rentable en un mes.
Lo que no es: automatizar una tarea hecha dos veces al año.
Reflejo: calcular el ROI antes de programar.
- requests + BeautifulSoup
- El dúo de páginas estáticas : requests descarga la página, BeautifulSoup analiza el HTML (select) para extraer los campos.
Ejemplo sencillo: Nabil extrae los precios públicos con select_one y los guarda en CSV.
Lo que no es: un navegador pilotado para una página estática simple.
Reflejo: timeout + user-agent + peticiones espaciadas, siempre.
- Selenium
- Pilotaje de un navegador real para páginas JavaScript (contenido cargado, desplazamiento infinito) — potente pero más pesado.
Ejemplo sencillo: Nabil recurre a él cuando los precios no están en el HTML inicial.
Lo que no es: saturar con requests un contenido generado en JS.
Reflejo: Selenium solo si lo estático no basta.
- robots.txt / CGU
- Las reglas de acceso de un sitio (archivo robots.txt, condiciones de uso) : lo que se puede recoger, a qué ritmo — para leer antes de la primera petición.
Ejemplo sencillo: Nabil lee ambas, espacía sus peticiones y cambia a la API oficial.
Lo que no es: raspar en masa un sitio que lo prohíbe.
Reflejo: autorizado + espaciado + trazado, o nos abstenemos.
En la práctica — En práctica — Automatizar y luego raspar con cortesía
- Elegid UNA tarea repetitiva, calculad su ROI (tiempo/semana contra tiempo de desarrollo) y automatizadla con pathlib/pandas.
- Añadid logging, try específicos con alertas, y probad sobre copias — nunca sobre los originales.
- Antes de todo scraping : leed CGU + robots.txt, buscad una API oficial y preved timeout, user-agent y pausas.
- Raspad (requests + BeautifulSoup), guardad en CSV, planificad (cron/Programador) y vigilad los logs.
Guion listo para decir — justificar su recogida (30 s)
« Soy Nabil : CGU y robots.txt leídos antes de la primera petición, API oficial preferida, peticiones espaciadas con user-agent identificado, todo trazado en logs. Nuestros lunes están automatizados — y nuestra recogida es defendible. »
Para decir antes de toda puesta en producción de un scraper ; mostrad CGU + logs.
Modelo copiar-pegar — scraper cortés (código probado)
import csv
import logging
import time
import requests
from bs4 import BeautifulSoup
logging.basicConfig(level=logging.INFO)
URLS = ["https://example.com/page-1", "https://example.com/page-2"]
HEADERS = {"User-Agent": "veille-perso (contact : exemple@domaine.test)"}
# Previo : leer https://example.com/robots.txt + CGU,
# preferir la API oficial si existe.
with open("prix.csv", "w", newline="", encoding="utf-8") as f:
out = csv.writer(f)
out.writerow(["url", "prix"])
for url in URLS:
r = requests.get(url, timeout=10, headers=HEADERS)
r.raise_for_status()
prix = BeautifulSoup(r.text, "html.parser").select_one(".prix").text.strip()
out.writerow([url, prix])
logging.info("%s : %s", url, prix)
time.sleep(2) # cortesía : espaciar las peticiones
Tarea ofimática
Renombrado, informes, correos : pathlib + pandas + logging, probado sobre copias y luego planificado.
Vigilancia ocasional
Como Nabil : pocas páginas, espaciadas, trazadas — el script gira el lunes, nadie piensa en ello.
Página JavaScript
¿Contenido ausente del HTML? Selenium pilota un navegador — más pesado, para reservar a ese caso.
Recogida regular
API oficial en cuanto exista : estable, autorizada, más rápida que todo scraping.
✓ Buenas prácticas
- Calcular el ROI antes de automatizar.
- Leer CGU + robots.txt antes de la primera petición.
- Logs + pruebas sobre copias + peticiones espaciadas.
✗ Errores frecuentes
- Raspar sin leer CGU ni robots.txt.
- Saturar sin pausa (bloqueo asegurado).
- Lanzar un script destructivo sin pruebas.
Puntos clave
- AUTOMATIZAR lo repetitivo rentable : pathlib, openpyxl/pandas, smtplib — ROI calculado.
- DÚO estático : REQUESTS (descarga) + BEAUTIFULSOUP (analiza HTML).
- SELENIUM = navegador pilotado para el JS ; API OFICIAL preferida al scraping.
- CORTESÍA : robots.txt, pausas, user-agent ; FIABILIDAD : logs, copias de prueba, planificación.
Reto 48h — aplica mañana
Automatizad 1 tarea repetitiva (ROI calculado, probada sobre copias) O raspad 2 páginas autorizadas (CGU leídas) con pausas + logs.
- Puedo citar ROI, requests, BeautifulSoup, Selenium.
- Sé explicar CGU/robots.txt + pausas.
- Tengo 1 script fiable o 1 recogida cortés funcionando.
Preguntas frecuentes
¿Es legal el web scraping?
Depende : CGU y robots.txt del sitio, derechos sobre los datos (incluidos personales), ritmo de recogida — todo enmarca lo permitido. Reglas de Nabil : leer CGU + robots.txt antes de la primera petición, espaciar las peticiones, preferir la API oficial, nunca recoger datos personales sin base legal y hacer validar por un jurista en caso de duda o uso profesional.
¿basta con requests o hace falta Selenium?
requests + BeautifulSoup bastan cuando los datos están en el HTML inicial (páginas estáticas) : rápido y ligero. Selenium se vuelve necesario cuando el contenido se genera en JavaScript (carga dinámica, desplazamiento infinito) : pilota un navegador real, más pesado y más lento. Empezamos en estático, pasamos al navegador solo si hace falta.
¿Qué dúo para raspar páginas estáticas?