Scraper automatizado desarrollado con Python y Requests para la extracción masiva de ofertas laborales desde el portal Laborum.cl.
En lugar de renderizar la página con un navegador, el scraper consume directamente la API interna del sitio (la misma que usa el frontend), lo que lo hace rápido, liviano y apto para correr en GitHub Actions.
- Consumo directo de la API: Obtiene las ofertas en JSON (título, empresa, ubicación, tipo, modalidad y descripción completa), sin navegador ni parsing de HTML.
- Filtro de fecha automático: El filtro de publicación (hoy, menor a 2 días, 1 semana, 1 mes, …) se deriva del slug de
BASE_URLenconfig.py. - Evasión de Bloqueos: Sesión con cookies del sitio y retrasos aleatorios con distribución uniforme entre páginas.
- Gestión de Datos:
- Guarda el contenido de cada oferta en archivos
.txtindividuales. - Genera un Excel maestro con historial rodante de 30 días.
- Guarda el contenido de cada oferta en archivos
- Detección de Duplicados: Las ofertas ya vistas (por id) no se vuelven a procesar.
- Análisis por Puntaje: Cada oferta se puntúa según keywords de perfil data/automatización y se marcan flags (remoto, híbrido, inglés, part-time, práctica, trainee).
- Ejecución Automática: Workflow de GitHub Actions que corre el scraper a diario y commitea los resultados en
data/.
- Python: 3.12+
- Dependencias: Listadas en
requirements.txt(Requests, Pandas, openpyxl, etc.)
- Clonar el repositorio o descargar los archivos.
- Instalar dependencias:
pip install -r requirements.txt
El script se ejecuta desde main.py y acepta los siguientes argumentos:
| Argumento | Descripción | Por Defecto |
|---|---|---|
--dir |
Directorio raíz donde se guardarán los resultados. | data |
--pages |
Cantidad máxima de páginas a recorrer (0 para todas; 50 ofertas por página). | 0 (Todas) |
--delay |
Tiempo promedio de espera (segundos) entre páginas. | 3.0 |
python main.py --dir data --pages 5 --delay 2.5Para cambiar la ventana de ofertas (hoy / 2 días / 1 semana / 1 mes), edita BASE_URL en config.py — el filtro de la API se deriva automáticamente del enlace.
laborum_scraper/
├── main.py # Punto de entrada y orquestación del flujo.
├── scraper.py # Cliente de la API y procesamiento de ofertas.
├── processor_utils.py # Análisis por puntaje/keywords y flags de modalidad.
├── config.py # Configuración global (URL del listado, fecha).
├── utils.py # Funciones auxiliares (logs, historial, limpieza).
├── requirements.txt # Librerías necesarias.
└── readme.md # Documentación del proyecto.
Los archivos se organizan automáticamente en la carpeta indicada en --dir (en GitHub Actions: data/ en la raíz del repo):
- Raw Data (
/laborum/raw_data/YYYY-MM-DD/*.txt):- Un archivo por cada oferta, nombrado como
titulo_sanitizado_idOferta.txt. - Contiene URL, empresa, ubicación, tipo y la descripción completa de la vacante.
- Un archivo por cada oferta, nombrado como
- Summary Data (
/laborum/summary_data.xlsx):- Excel maestro consolidado (historial rodante de 30 días) con columnas:
Fecha,Nombre,Empresa,Ubicacion,Tipo,Pageweb,puntaje_data,keyword,ingles,remoto,hibrido,presencial,part_time,practica,trainee,automatizacion,oferta.
- Excel maestro consolidado (historial rodante de 30 días) con columnas:
Las carpetas de raw_data y las filas del Excel con más de 30 días se eliminan automáticamente en cada corrida.
El scraper sigue este ciclo de vida:
- Inicio: Limpia datos antiguos y carga el historial del Excel maestro (ids ya vistos).
- Sesión: Visita la página del listado para obtener las cookies que exige la API.
- Extracción: Recorre la API página a página (50 ofertas por página), analiza cada oferta nueva y guarda su
.txt. - Paginación: Aplica un retraso aleatorio entre páginas hasta agotar el total reportado por la API.
- Cierre: Consolida historial + ofertas nuevas en el Excel maestro (también se guarda incrementalmente cada 5 páginas).
Este proyecto tiene fines educativos. El uso de herramientas de web scraping debe respetar los términos y condiciones del sitio web (laborum.cl/robots.txt) y la legislación vigente sobre protección de datos.