Scraper automatizado para extraer sentencias judiciales desde juris.pjud.cl y almacenarlas en Supabase con embeddings vectoriales para búsquedas semánticas.
- ✅ Extracción automática de sentencias de múltiples tribunales
- ✅ Detección de duplicados basada en ROL único
- ✅ Embeddings vectoriales con OpenAI para búsquedas semánticas
- ✅ Almacenamiento en Supabase con pgvector
- ✅ Optimizado para Render.com como Background Worker
- ✅ Logging detallado con timestamps
- ✅ Configuración flexible via variables de entorno
juris.pjud.cl → Puppeteer → Procesamiento → OpenAI Embeddings → Supabase + pgvector
- Node.js >= 20.0.0
- Cuenta en Render.com
- Cuenta en Supabase
- API Key de OpenAI (opcional)
- Clonar el repositorio
git clone https://github.com/tu-usuario/jurisprudencia-scraper.git
cd jurisprudencia-scraper- Instalar dependencias
npm install- Configurar variables de entorno
cp env.example .env
# Editar .env con tus credenciales- Ejecutar localmente
npm startAsegúrate de que tu repositorio contenga:
- ✅
package.jsoncon scriptstart - ✅
main.jscomo punto de entrada - ✅
.gitignoreexcluyendonode_modulesy.env
- Ve a dashboard.render.com
- Clic en "New +" → "Background Worker"
- Conecta tu cuenta de GitHub
- Selecciona el repositorio del scraper
Build Command:
npm installStart Command:
npm startEnvironment: Node
En la sección Environment agrega:
# Supabase
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_ANON_KEY=tu-clave-anonima
# OpenAI (opcional)
OPENAI_API_KEY=sk-tu-clave-openai
ENABLE_EMBEDDINGS=true
# Configuración del scraper
TRIBUNAL=Corte_Suprema
START_DATE=01/01/2024
END_DATE=31/12/2024
MAX_SENTENCIAS=100
DELAY_BETWEEN_REQUESTS=2000
DEBUG=falseClic en "Create Background Worker" y espera a que se complete el deploy.
Ejecuta este SQL en tu proyecto Supabase:
-- Habilitar extensión pgvector
CREATE EXTENSION IF NOT EXISTS vector;
-- Tabla de jurisprudencia
CREATE TABLE jurisprudencia_cs (
id BIGSERIAL PRIMARY KEY,
rol VARCHAR(255) UNIQUE NOT NULL,
fecha DATE,
tribunal VARCHAR(255),
caratulado TEXT,
texto_completo TEXT,
considerandos TEXT,
resolucion TEXT,
enlace VARCHAR(500),
hash_contenido VARCHAR(64),
embeddings vector(1536),
fecha_ingreso TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Índice para búsquedas vectoriales
CREATE INDEX ON jurisprudencia_cs USING ivfflat (embeddings vector_cosine_ops);
-- Índices para búsquedas tradicionales
CREATE INDEX idx_jurisprudencia_rol ON jurisprudencia_cs(rol);
CREATE INDEX idx_jurisprudencia_fecha ON jurisprudencia_cs(fecha);
CREATE INDEX idx_jurisprudencia_tribunal ON jurisprudencia_cs(tribunal);-- Habilitar RLS
ALTER TABLE jurisprudencia_cs ENABLE ROW LEVEL SECURITY;
-- Política para lectura pública
CREATE POLICY "Permitir lectura pública" ON jurisprudencia_cs
FOR SELECT USING (true);
-- Política para inserción desde el scraper
CREATE POLICY "Permitir inserción desde scraper" ON jurisprudencia_cs
FOR INSERT WITH CHECK (true);| Variable | Descripción | Ejemplo |
|---|---|---|
SUPABASE_URL |
URL de tu proyecto Supabase | https://xxx.supabase.co |
SUPABASE_ANON_KEY |
Clave anónima de Supabase | eyJ... |
OPENAI_API_KEY |
API Key de OpenAI | sk-... |
ENABLE_EMBEDDINGS |
Habilitar embeddings | true |
TRIBUNAL |
Tribunal a scrapear | Corte_Suprema |
START_DATE |
Fecha inicio (DD/MM/YYYY) | 01/01/2024 |
END_DATE |
Fecha fin (DD/MM/YYYY) | 31/12/2024 |
MAX_SENTENCIAS |
Máximo de sentencias | 100 |
SEARCH_TERM |
Término de búsqueda | derecho laboral |
DELAY_BETWEEN_REQUESTS |
Delay entre requests (ms) | 2000 |
DEBUG |
Modo debug | false |
Corte_Suprema- Corte SupremaCorte_de_Apelaciones- Cortes de ApelacionesPenales- Juzgados PenalesFamilia- Juzgados de FamiliaLaboral- Juzgados LaboralesCivil- Juzgados Civiles
Los logs se pueden ver en tiempo real en la pestaña "Logs" de tu servicio en Render.
El scraper muestra estadísticas al finalizar:
=== ESTADÍSTICAS FINALES ===
Duración total: 125 segundos
Total procesadas: 50
Exitosas: 45
Duplicadas: 3
Errores: 2
============================
Para ejecutar el scraper periódicamente:
-
Cron Job en Render:
- Crea un Cron Job en lugar de Background Worker
- Configura el schedule (ej:
0 2 * * *para diario a las 2 AM)
-
Webhook desde otro servicio:
- Crea un Web Service en lugar de Background Worker
- Configura un endpoint que ejecute el scraper
- ✅ Variables de entorno para credenciales
- ✅ Detección de duplicados
- ✅ Rate limiting con delays
- ✅ Logging sin información sensible
- ✅ Manejo de errores robusto
- Verificar que el sitio juris.pjud.cl esté accesible
- Revisar si cambiaron los selectores CSS
- Verificar variables
SUPABASE_URLySUPABASE_ANON_KEY - Confirmar que la tabla
jurisprudencia_csexiste
- Verificar variable
OPENAI_API_KEY - Confirmar que
ENABLE_EMBEDDINGS=true
- Aumentar
DELAY_BETWEEN_REQUESTS - Verificar conectividad de red
MIT License - ver LICENSE para detalles.
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
- 📧 Email: contacto@redjudicial.cl
- 🌐 Web: www.redjudicial.cl
- 📱 GitHub Issues: Crear issue
Desarrollado con ❤️ por RedJudicial