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).
| 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.
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, ...
- Node.js ≥ 20.6 (usamos
--env-filenativo, sindotenv). pnpm(verpackageManagerenpackage.json).
# 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 --allLos JSON se escriben en ./output/{CODE}.json. Los samples en ./output/samples/{CODE}.json.
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 |
pnpm test # unit tests (retry, tables, extractor con happy-dom)
pnpm test:watch
pnpm typecheck
pnpm lintLos tests del extractor usan un DOM en memoria — no necesitan Playwright ni el portal.
- Aumentar
minDelay/maxDelayensrc/config/stealth.tsen ~50%. - Correr con
--debugpara observar el browser. - Activar rotación de UAs: usar
pickRandomUserAgent()(ya disponible) enbrowser.tspor sesión. - Bajar
longBreakEveryde 10 a 5.
- 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.
Apache-2.0 — ver LICENSE.