Alexander A. E. Full Stack Developer

colegios.pe: comparador de colegios del Perú

Portada de colegios.pe con el buscador de colegios por nombre o lugar

Elegir colegio en el Perú es un problema de información. Los datos están, pero repartidos en seis sistemas distintos del MINEDU, en formatos que no se hablan entre sí: un DBF que se publica cada semana, fichas HTML por institución, planillas de matrícula y padrones de alimentación escolar.

colegios.pe junta todo eso en un catálogo y lo pone en una búsqueda que un padre puede usar desde el celular.

El problema concreto

Una familia en Lima quiere saber qué colegios hay en su distrito, cuánto cuesta la pensión, si es mixto, si recibe alimentación escolar y qué dicen otras familias. Esa información hoy se consigue llamando por teléfono o preguntando en un grupo de WhatsApp.

Del otro lado, hay colegios que no tienen ni página web y no aparecen en ninguna búsqueda. El catálogo también les sirve: un colegio sin web existe en el padrón oficial, y por tanto existe en el comparador.

De dónde salen los datos

Antes de escribir una línea de código hice un documento por fuente con qué trae, con qué cobertura y qué no se puede creer. Esa parte es la que decide el producto.

  • ESCALE (padrón de servicios educativos): la base oficial de todas las instituciones, publicada semanalmente en DBF. Es el esqueleto del catálogo.
  • Identicole: la ficha ampliada por colegio —pensiones, infraestructura, equipamiento—, pero publicada como páginas HTML, una por institución.
  • Matrícula oficial: la única fuente que cubre a los privados. Ahí aparecen 23.281 colegios que no están en ningún otro sitio.
  • Padrón PAE / Qali Warma: qué colegios reciben alimentación escolar y a cuántos alumnos atienden.
  • Deserción por distrito: el contexto del distrito, no del colegio, que cambia mucho la lectura de una ficha.
  • Sedes COAR: dirección y correo de los colegios de alto rendimiento.
Pieza Cifra
Colegios 180.890
Con matrícula oficial 110.093
Con alimentación escolar (PAE) 65.288
Con contexto de distrito 117.209
Fichas de Identicole 8.242
Sedes COAR 28

Dos detalles que parecen menores y no lo son:

  1. Un colegio no es un local. La clave real es COD_MOD + ANEXO, porque un mismo local puede albergar varios servicios educativos con niveles distintos. Si usas solo el código modular, duplicas o mezclas colegios.
  2. Un dato faltante no es un cero. Si una fuente no trae la pensión, la ficha dice "sin dato", no "S/ 0". Rellenar huecos con ceros es la forma más rápida de mentirle al usuario.

Cómo está construido

Scrapers

Seis fuentes en un monorepo con uv, cada una con su parser y sus fixtures. Los tests no tocan la red: se ejecutan contra muestras guardadas, así que un cambio en el HTML de origen se ve como un test rojo y no como un catálogo corrupto. Son 138 tests.

API

FastAPI con SQLAlchemy y Alembic sobre PostgreSQL. Búsqueda por nombre y por código con relevancia ponderada, filtros, conteos por distrito, radio por cercanía, reseñas, leads y un panel para que un colegio reclame su ficha. 222 tests.

Frontend

SvelteKit. Buscador con filtros y mapa, ficha del colegio, comparador, landings por distrito, avisos de matrícula y panel del colegio. 91 tests unitarios y 58 de extremo a extremo con Playwright contra un navegador real.

Despliegue

VPS de OVH con nginx delante: el frontend compilado en un servicio y la API en otro, los dos con systemd. Las migraciones van antes de reiniciar y el despliegue tiene un comando de estado para saber qué versión está corriendo sin entrar a mirar logs.

Lo que fue difícil

  • Reconciliar fuentes que no comparten clave. La matrícula usa una codificación y el padrón otra; el trabajo es unir sin inventar colegios nuevos.
  • El volumen de Identicole. Son fichas individuales, no un archivo: hay que ir colegio por colegio, con pausas y reintentos, y asumir que una parte va a fallar y se reintenta después.
  • Los datos oficiales tienen huecos. El código tiene que funcionar con datos incompletos y decirlo en la interfaz, no esconderlo.

Qué sigue

Faltan el scrape de las secundarias de Identicole (para la jornada escolar completa) y el de las privadas (para las pensiones), y la pasada de UX en pantallas medianas. El resto —comparador, panel del colegio, avisos de matrícula— ya está en producción.

Pruébalo

Está abierto en colegios.pe. Si encuentras una ficha con datos raros, escríbeme: la corrección de datos es parte del producto, no un ticket de soporte.

También puedes ver el resto de mis proyectos.

Comentarios !

comments powered by Disqus