Capítulo 4 de 10 · 100 proyectos para hacer con tu coding agent

Datos, scraping y ETL (31-40)

Extraer, limpiar, mover y consultar datos. Desde un scraper que se porta bien hasta un motor que ejecuta SQL sobre ficheros CSV.

6 min de lecturaActualizado el 8 de septiembre de 2026

Los datos siempre llegan sucios, en el formato equivocado y con una fila en medio que rompe el parser. Es así y no va a cambiar. Estos diez proyectos van de construir las tuberías que arreglan eso y, de paso, de enterarte de qué hace por dentro una herramienta como Pandas o DuckDB cuando la usas.

31. Scraper educado con caché

Un rastreador que no tira el servidor de nadie. Respeta robots.txt, guarda en caché lo que ya ha descargado y puede reanudarse donde lo dejaste si lo matas a medias.

Construye un rastreador web reutilizable.

- Respeta robots.txt y crawl-delay, con un User-Agent identificable.
- Caché en disco por URL con respeto a ETag y Last-Modified.
- Cola de URLs persistente: si lo matas, "reanudar" continúa donde iba.
- Límite de concurrencia por dominio, reintentos con retroceso ante 5xx.
- Extracción declarativa con selectores CSS definidos en un YAML.

Modo --dry-run que muestre qué URLs visitaría sin descargar nada.

32. Detector de cambios en páginas web

Vigila una URL, extrae un trozo concreto y te avisa cuando cambia. Es de los proyectos más útiles de la lista: precios, plazas libres en un curso, convocatorias que salen sin avisar.

Haz una herramienta que vigile páginas web y avise de cambios.

- Configuración por URL: selector CSS o XPath del fragmento a vigilar,
  frecuencia, y normalización (quitar espacios, fechas, contadores).
- Diff legible del contenido extraído entre dos comprobaciones.
- Notificación por correo, webhook o notificación de escritorio.
- Historial de valores, para poder graficar la evolución de un precio.

Lo importante: evitar falsos positivos por cambios irrelevantes del HTML.
Enséñame cómo lo consigues.

33. Motor de consultas SQL sobre CSV

Cargas un CSV y le lanzas un SELECT. Escribir el parser, el planificador y los operadores es, con diferencia, la mejor forma que conozco de entender qué hace una base de datos por dentro.

Implementa un motor de consultas que ejecute SQL sobre ficheros CSV/Parquet.

Alcance: SELECT con WHERE, GROUP BY, ORDER BY, LIMIT y JOIN de dos tablas.
Estructura: tokenizador -> parser a AST -> planificador lógico -> operadores
en iterador (volcano model).

- Empuja los filtros hacia la lectura (predicate pushdown) y demuestra la mejora.
- JOIN por hash, con explicación de cuándo sería mejor un merge join.
- Comando EXPLAIN que muestre el plan.

Compara los tiempos con sqlite3 sobre el mismo dataset y sé honesto con el resultado.

34. Validador de calidad de datos

Defines reglas sobre un dataset y el pipeline falla cuando algo se sale de ellas. Parece poca cosa, pero es lo que separa un proceso de datos fiable de una bomba de relojería que explotará un lunes.

Crea un validador de calidad de datos configurable.

Reglas en YAML: tipos, rangos, no nulos, unicidad, expresiones regulares,
integridad referencial entre ficheros, y frescura (la fecha máxima no puede
tener más de N días).

- Informe con filas afectadas y ejemplos, en consola y en HTML.
- Código de salida distinto de cero si falla una regla marcada como bloqueante.
- Perfilado automático: dado un dataset limpio, propón un fichero de reglas inicial.

35. Herramienta de migración entre bases de datos

Mover datos de MySQL a PostgreSQL sin sorpresas con los tipos, las fechas y esos NULL que alguien guardó como cadena vacía. Quien lo ha hecho a mano sabe de qué hablo.

Escribe una herramienta que migre datos entre dos bases de datos SQL.

- Introspección del esquema origen y generación del DDL destino, con mapeo
  de tipos explícito y configurable.
- Copia por lotes con cursor, memoria constante aunque la tabla tenga 50 M de filas.
- Verificación posterior: conteos, sumas de control por columna y muestreo.
- Reanudable por tabla, y capaz de continuar desde la última clave copiada.

Documenta las trampas que encuentres: fechas cero, enteros sin signo, colaciones.

36. Deduplicación difusa de registros

El mismo cliente escrito de cinco maneras distintas. Normalización, bloqueo por claves y medidas de similitud. Es el problema clásico del «record linkage», y no está resuelto del todo en ningún sitio.

Construye un deduplicador de registros de personas o empresas.

- Normalización: mayúsculas, acentos, abreviaturas de vía, sufijos societarios.
- Bloqueo (blocking) para no comparar N*N: agrupa por claves candidatas.
- Similitud combinada: Jaro-Winkler para nombres, Levenshtein para direcciones,
  exacta para identificadores; puntuación ponderada configurable.
- Salida: grupos de duplicados con puntuación y una interfaz para revisarlos.

Dame métricas de precisión y exhaustividad sobre un conjunto etiquetado a mano.

37. Orquestador de pipelines con dependencias

Un Airflow en miniatura. Un grafo de tareas, ejecución en orden topológico, reintentos y un estado que sobreviva a un reinicio.

Implementa un orquestador de tareas por dependencias (DAG).

- Definición de tareas en código, con dependencias explícitas.
- Detección de ciclos antes de ejecutar, con mensaje claro.
- Ejecución en paralelo respetando el orden topológico, con límite de workers.
- Estado persistido: reintentar solo las tareas fallidas y sus descendientes.
- Vista en terminal del progreso del grafo.

Test obligatorio: un DAG con 20 tareas donde falla una del medio; al reintentar
no debe volver a ejecutar las que ya salieron bien.

38. Almacén de series temporales

Guardar millones de métricas ocupa sorprendentemente poco si compactas bien. Codificación delta, bloques por tiempo y downsampling. Los bytes por punto antes y después impresionan.

Haz un almacén de series temporales orientado a métricas.

- Escritura: (métrica, etiquetas, timestamp, valor float).
- Almacenamiento por bloques temporales, con compresión delta-of-delta para
  timestamps y XOR (estilo Gorilla) para valores.
- Consultas por rango y por etiquetas, con agregaciones: avg, max, rate.
- Downsampling automático de datos con más de X días.

Enséñame los bytes por punto antes y después de la compresión.

39. Buscador con índice invertido

Sin Elasticsearch. Tokenizas, montas el índice invertido, aplicas BM25 y de repente entiendes por qué los buscadores devuelven lo que devuelven, y en ese orden.

Construye un motor de búsqueda de texto completo sobre un directorio
de documentos.

- Tokenización, minúsculas, eliminación de vacías y stemming para español.
- Índice invertido con posiciones, persistido en disco.
- Ranking BM25, búsqueda de frase exacta con comillas, y operadores AND/OR/NOT.
- Fragmentos de contexto resaltados en los resultados.
- Índice incremental: reindexar solo lo que cambió.

Explícame la fórmula de BM25 en el README con tus propias palabras.

40. Panel personal de finanzas a partir de extractos

Importas los CSV del banco, categorizas movimientos y ves a dónde se te va el dinero. Todo en local, sin darle tus extractos a nadie.

Crea una aplicación local de finanzas personales.

- Importación de extractos CSV de varios bancos, con perfiles de mapeo por banco.
- Deduplicación de movimientos al reimportar el mismo periodo.
- Categorización por reglas (regex sobre el concepto) más sugerencias
  aprendidas de lo que ya categoricé a mano.
- Vistas: gasto mensual por categoría, evolución, y gastos recurrentes detectados.
- Todo en SQLite local, sin conexiones a internet.

Las cantidades se manejan en céntimos enteros, nunca en float. Ponlo en un test.