Scraper multi-fuente de ofertas laborales para los 23 municipios del Oriente Antioqueño (Colombia). Recopila, almacena, analiza y exporta vacantes de 8 plataformas de empleo diferentes.
| Zona | Municipios |
|---|---|
| Altiplano (9) | Marinilla, Rionegro, El Santuario, La Ceja, El Carmen de Viboral, Guarne, El Retiro, La Unión, San Vicente Ferrer |
| Embalses (7) | El Peñol, Guatapé, San Carlos, San Rafael, Granada, Alejandría, Concepción |
| Páramo (4) | Sonsón, Nariño, Argelia, Abejorral |
| Bosques (3) | Cocorná, San Francisco, San Luis |
| Fuente | Método | Detalle |
|---|---|---|
| Computrabajo | HTML paginado (Playwright) | Sí |
| ElEmpleo | HTML paginado (Playwright) | Sí |
| Indeed | HTML paginado (Playwright) | Sí |
| Comfama | HTML paginado (Playwright) | Sí |
| HTML paginado (Playwright) | No (requiere login) | |
| SENA | Cartelera AJAX + JSON-LD | Sí |
| Comfenalco | Descarga y parseo de PDF | No |
| Magneto365 | HTML SSR + JSON-LD | Sí |
marinilla_empleos/
├── main.py # Punto de entrada CLI
├── config.py # Configuración central (municipios, fuentes, slugs)
├── database.py # SQLite: crear tablas, insertar, consultar
├── analisis_oferta.py # Análisis NLP: cargos, salarios, skills, distribución
├── exportar_base.py # Exportación a Excel/CSV con columnas calculadas
├── scraper.py # Scraper legacy (Computrabajo directo)
├── requirements.txt
└── scrapers/
├── __init__.py
├── base.py # BaseScraper (Template Method pattern)
├── factory.py # Factory: instancia scrapers por nombre
├── orchestrator.py # Orquestador: ejecuta scrapers en paralelo
├── utils.py # Utilidades: delays, stealth JS, user-agents
├── dedup.py # Deduplicación cruzada entre fuentes
├── computrabajo.py
├── elempleo.py
├── indeed.py
├── comfama.py
├── linkedin.py
├── sena.py
├── comfenalco.py
└── magneto.py
# Clonar el repositorio
git clone https://github.com/Cespial/marinilla_empleos.git
cd marinilla_empleos
# Crear entorno virtual (recomendado)
python -m venv venv
source venv/bin/activate # macOS/Linux
# Instalar dependencias
pip install -r requirements.txt
# Instalar navegadores para Playwright
playwright install chromiumpython main.py --list-sources# Todas las fuentes, todos los municipios
python main.py
# Solo fuentes específicas
python main.py --sources computrabajo elempleo magneto
# Solo municipios específicos
python main.py --municipios Marinilla Rionegro Guatapé# Carga ~37 ofertas de ejemplo y ejecuta análisis
python main.py --demo# Con datos demo exhaustivos (~176 ofertas, 23 municipios, 24 sectores)
python exportar_base.py --demo
# Exportar datos reales existentes
python exportar_base.pypython main.py --analisispython main.py --dedup-reportEl reporte incluye:
- Top 10 cargos más solicitados
- Análisis salarial: promedio, mediana, distribución por rangos
- Top 20 skills extraídas por NLP de las descripciones
- Distribución por municipio
- Distribución por fuente
El archivo .xlsx generado contiene 5 hojas:
| Hoja | Contenido |
|---|---|
Ofertas_Laborales |
Todas las ofertas con 17 columnas |
Resumen_Sector |
Ofertas y salario promedio por sector económico |
Resumen_Municipio |
Ofertas y salario promedio por municipio |
Resumen_Fuente |
Ofertas por fuente de scraping |
Top_Skills |
30 skills más frecuentes |
sector_economico— Clasificación automática (24 sectores: Textil, Floricultura, Turismo, Hidroeléctrica, Minería, Café, etc.)nivel_formacion— Profesional, Tecnólogo, Técnico, Bachiller, Certificación Específicatipo_contrato— Indefinido, Término fijo, Obra o labor, Prestación de servicios, Temporalsalario_min/salario_max/salario_promedio— Valores numéricos extraídosskills_detectadas— Excel, inglés, licencias, certificaciones, etc.
- Python 3.10+
- Playwright — Navegación headless con stealth anti-detección
- BeautifulSoup4 — Parsing HTML
- pandas — DataFrames, análisis, exportación
- NLTK — Procesamiento de lenguaje natural (tokenización, stopwords)
- pdfplumber — Extracción de datos de PDFs (Comfenalco)
- openpyxl — Generación de archivos Excel
- SQLite — Base de datos local
MIT