Skip to content

Youngermaster/SISPRO-Scraper

Repository files navigation

SISPRO-Scraper

Scraper en TypeScript + Playwright para extraer tablas de referencia del portal público de SISPRO (Sistema de Información de la Protección Social de Colombia).

Genera archivos JSON por tabla listos para alimentar MongoDB o una base SQLite embebida (p. ej. en una app React Native).

Tablas soportadas

Code Descripción Items aprox.
CIE10 Clasificación Internacional de Enfermedades 12.634
CUPS Clasificación Única de Procedimientos 10.024
DCI Denominación Común Internacional 9.605
IUM Identificador Único de Medicamentos 34.108

Añadir una nueva tabla = una entrada en src/config/tables.ts.

Arquitectura

src/
├── index.ts              ← CLI (parseArgs)
├── runner.ts             ← orquesta 1-tabla o --all (secuencial)
├── config/
│   ├── tables.ts         ← registro central de tablas
│   ├── stealth.ts        ← delays, locale, UA
│   └── env.ts            ← validación zod de .env
├── scraper/
│   ├── browser.ts        ← lanzamiento de Chromium
│   ├── navigator.ts      ← selectores + paginación
│   ├── extractor.ts      ← parseo dinámico de headers/filas
│   └── scrapeTable.ts    ← loop por tabla con checkpoints
├── services/
│   ├── logger.ts         ← pino (pretty/JSON)
│   └── storage.ts        ← CheckpointStorage + atomicWriteJson
├── utils/
│   ├── delay.ts          ← randomDelay/sleep
│   ├── retry.ts          ← withRetry + backoff exponencial
│   └── fs.ts             ← ensureDir, atomicWriteJson
└── types/                ← SisproRow, ScrapeResult, ...

Requisitos

  • Node.js ≥ 20.6 (usamos --env-file nativo, sin dotenv).
  • pnpm (ver packageManager en package.json).

Inicio rápido

# 1. Instalar dependencias y el browser
pnpm install
npx playwright install chromium

# 2. Configurar entorno
cp .env.example .env

# 3. Smoke test: 2 páginas de CIE10 con UI visible
pnpm sample --table CIE10 --debug

# 4. Scrape real de una tabla
pnpm scrape --table CIE10

# 5. Scrape de las 4 tablas (secuencial, 60-90 min por IUM)
pnpm scrape --all

Los JSON se escriben en ./output/{CODE}.json. Los samples en ./output/samples/{CODE}.json.

CLI

pnpm scrape --table CIE10            # una tabla
pnpm scrape --all                    # todas, secuencial
pnpm scrape --table IUM --debug      # headless=false (UI visible)
pnpm scrape --table CUPS --max-pages 2  # limita páginas
pnpm sample --table DCI              # alias: 2 páginas → output/samples/

Variables en .env (ver .env.example):

Variable Default Descripción
OUTPUT_DIR ./output Dónde guardar los JSON
MAX_PAGE_SIZE 2000 Tamaño del <select> de paginación SISPRO
HEADLESS true false = muestra el browser
LOG_LEVEL info trace/debug/info/warn/error
LOG_PRETTY true false = JSON estructurado

Testing

pnpm test          # unit tests (retry, tables, extractor con happy-dom)
pnpm test:watch
pnpm typecheck
pnpm lint

Los tests del extractor usan un DOM en memoria — no necesitan Playwright ni el portal.

Qué hacer si SISPRO bloquea

  1. Aumentar minDelay/maxDelay en src/config/stealth.ts en ~50%.
  2. Correr con --debug para observar el browser.
  3. Activar rotación de UAs: usar pickRandomUserAgent() (ya disponible) en browser.ts por sesión.
  4. Bajar longBreakEvery de 10 a 5.

Consideraciones legales

  • Se accede exclusivamente a datos públicos del portal SISPRO del Ministerio de Salud.
  • Los delays implementados respetan los recursos del servidor público.
  • Las tablas son catálogos de referencia clínica; no contienen datos personales.

Licencia

Apache-2.0 — ver LICENSE.

About

Scraper en TypeScript + Playwright para extraer tablas de referencia del portal público de SISPRO

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors