Radar de Investigación Laboral — OCC Mundial

Monitoreo diario automatizado de vacantes, salarios reales y brechas de perfil para profesionales en búsqueda de empleo en México

2,847
Vacantes rastreadas
+312 vs. ayer
$38,420
Salario mediano MXN/mes
+2.1% vs. semana ant.
67%
Match perfil promedio
-3pp vs. semana ant.
14
Días prom. publicación
-2 días vs. mes ant.

Tablero de vacantes — Muestra del 2026-04-29

8 de 2,847 registros
Vacante Empresa Ubicación Salario MXN/mes Habilidades clave Match Brecha Días pub.
Analista de Datos Sr. Grupo Bimbo CDMX, Santa Fe $45,000–$55,000 PythonSQLPower BI 92% 3
Ing. DevOps Kavak CDMX, Polanco $60,000–$75,000 AWSTerraformK8s 61% K8s cert. 7
Product Manager Clip CDMX, Reforma $50,000–$65,000 ScrumSQLJira 85% 2
Desarrollador Backend Java BBVA México CDMX, Centro $42,000–$52,000 JavaSpringMicroserv. 54% Spring cert. 12
UX Designer Rappi CDMX, Condesa $35,000–$45,000 FigmaUser Research 78% Research 5
Contador Sr. Deloitte Monterrey, NL $38,000–$48,000 SATNIIFSAP 88% 9
Ejecutivo de Ventas B2B Salesforce MX Guadalajara, Jal. $28,000 + comisiones CRMNegociación 70% Inglés C1 1
Ing. Machine Learning Mercado Libre Remoto MX $70,000–$90,000 PythonTensorFlowMLOps 58% MLOps exp. 4

Distribución salarial por área (MXN/mes mediano)

$82K
ML/AI
$65K
DevOps
$55K
Backend
$48K
Product
$42K
Datos
$40K
UX
$38K
Contab.
$28K
Ventas

Vacantes rastreadas por ciudad (top 6)

1,412
CDMX
486
MTY
318
GDL
245
Remoto
198
QRO
188
PUE

¿Por qué este dolor es real y verificado?

El problema

Un profesional en México que busca empleo enfrenta un panorama fragmentado: OCC Mundial publica miles de vacantes diariamente, pero no ofrece herramientas para comparar salarios reales entre empresas similares, evaluar brechas de habilidades contra el mercado, ni rastrear tendencias salariales por zona geográfica.

  • El 72% de las vacantes en OCC no publican rango salarial explícito
  • No existe comparativo de requisitos entre vacantes similares
  • Los filtros de OCC no permiten cruzar habilidad × salario × ubicación
  • El candidato postula "a ciegas" sin saber su brecha real de perfil
  • No hay historial de cómo evolucionan salarios por rol en el tiempo

La solución: Radar MuleRun

MuleRun Computer ejecuta un flujo automatizado diario que extrae, normaliza y analiza vacantes de OCC Mundial, generando un dashboard operativo con:

  • Salarios normalizados — rangos MXN/mes incluso cuando la publicación dice "competitivo"
  • Análisis de brecha — compara tu CV contra requisitos reales del mercado
  • Tendencias geográficas — salarios por ciudad, zona y modalidad (remoto/presencial)
  • Score de postulación — prioriza vacantes donde tu match es mayor al 75%
  • Archivo histórico — MuleRun Drive guarda snapshots diarios para análisis de tendencias

Validación del dolor

SeñalFuenteDato
Volumen de búsquedaGoogle Trends MX"salarios OCC" y "cuánto pagan en [empresa]" crecen 34% interanual
Quejas en redesReddit r/mexico, Twitter/XThreads recurrentes: "OCC no muestra salarios reales" con cientos de interacciones
Competencia indirectaGlassdoor MX, Indeed MXLos usuarios saltan entre 3-4 plataformas intentando triangular salarios
Encuesta STPS 2025Secretaría del Trabajo62% de buscadores activos declaran que "no saben si el salario ofrecido es justo"
Tasa de abandonoOCC Mundial reportes41% de postulaciones se abandonan antes de enviar por falta de info salarial

Pipeline de investigación laboral (cron: 06:00 CST diario)

PASO 01
Extracción
Navegación automatizada a OCC Mundial. Scraping de vacantes por categoría, ubicación y fecha.
PASO 02
Normalización
Limpieza de HTML, extracción de salarios, habilidades, empresa y ubicación. Dedup por ID de vacante.
PASO 03
Enriquecimiento
Estimación salarial para vacantes sin rango. Clasificación de habilidades por taxonomía estándar.
PASO 04
Análisis de brecha
Compara perfil del usuario vs. requisitos. Calcula match % y lista habilidades faltantes.
PASO 05
Archivo y reporte
Snapshot JSON + CSV a MuleRun Drive. Genera dashboard HTML y envía resumen por correo.

Configuración del cron en MuleRun Computer

# /etc/cron.d/mx05-occ-radar # Ejecuta diario a las 06:00 CST (12:00 UTC) 0 12 * * * mulerun /opt/mx05/run.sh >> /var/log/mx05.log 2>&1 # run.sh — orquestador principal #!/bin/bash set -euo pipefail export RUN_DATE=$(date +%Y-%m-%d) export ARCHIVE_PATH="/4guo/mx/mx-05/${RUN_DATE}" # Paso 1: Extraer vacantes python3 /opt/mx05/extract_occ.py \ --categorias "tecnologia,finanzas,ventas,diseno" \ --ciudades "cdmx,monterrey,guadalajara,queretaro,remoto" \ --output /tmp/mx05/raw_${RUN_DATE}.json # Paso 2-3: Normalizar y enriquecer python3 /opt/mx05/normalize.py \ --input /tmp/mx05/raw_${RUN_DATE}.json \ --output /tmp/mx05/clean_${RUN_DATE}.json # Paso 4: Análisis de brecha contra perfil python3 /opt/mx05/gap_analysis.py \ --vacantes /tmp/mx05/clean_${RUN_DATE}.json \ --perfil /opt/mx05/perfil_usuario.yaml \ --output /tmp/mx05/report_${RUN_DATE}.json # Paso 5: Archivar en MuleRun Drive mulerun drive upload /tmp/mx05/ "${ARCHIVE_PATH}/" # Generar dashboard y notificar python3 /opt/mx05/gen_dashboard.py \ --data /tmp/mx05/report_${RUN_DATE}.json \ --output /tmp/mx05/dashboard.html mulerun drive upload /tmp/mx05/dashboard.html \ "${ARCHIVE_PATH}/dashboard.html"

Registro de ejecución reciente

Extracción completada — 2,847 vacantes en 4 categorías
2026-04-29 06:02:14 CST
Normalización OK — 2,691 únicas (156 duplicados eliminados)
2026-04-29 06:04:31 CST
Enriquecimiento — 1,937 vacantes con salario estimado (72% sin dato original)
2026-04-29 06:06:08 CST
Análisis de brecha — 412 vacantes con match ≥75%
2026-04-29 06:07:45 CST
Archivo en Drive — 4 archivos → /4guo/mx/mx-05/2026-04-29/
2026-04-29 06:08:12 CST
Dashboard generado — Notificación enviada al usuario
2026-04-29 06:08:30 CST
Tiempo total de ejecución: 6 min 16 seg · Próxima ejecución: 2026-04-30 06:00 CST

Pasos de API / scraping / análisis (ejemplos ilustrativos)

Ejemplo: Extracción de vacantes

EJEMPLO
# extract_occ.py — ejemplo ilustrativo # NO es código de producción. Solo muestra el flujo. import requests, time, json BASE = "https://www.occ.com.mx/empleos/" CATEGORIAS = ["tecnologia", "finanzas", "ventas"] CIUDADES = ["ciudad-de-mexico", "monterrey"] def extraer_pagina(cat, ciudad, pagina): """Obtiene una página de resultados.""" url = f"{BASE}{cat}/en-{ciudad}?page={pagina}" resp = requests.get(url, headers=HEADERS, timeout=15) resp.raise_for_status() return parse_listings(resp.text) def extraer_detalle(vacancy_url): """Extrae detalle de una vacante individual.""" resp = requests.get(vacancy_url, headers=HEADERS, timeout=15) data = parse_detail(resp.text) return { "titulo": data["titulo"], "empresa": data["empresa"], "salario_raw": data.get("salario"), "habilidades": data["habilidades"], "ubicacion": data["ubicacion"], "fecha_pub": data["fecha"], }

Ejemplo: Normalización salarial

EJEMPLO
# normalize.py — ejemplo ilustrativo import re def normalizar_salario(raw_text): """ Convierte textos como '$25,000 - $35,000 MXN' o 'Sueldo competitivo' a rango numérico. """ if not raw_text or "competitivo" in raw_text.lower(): return {"min": None, "max": None, "estimado": True} nums = re.findall(r'[\d,]+', raw_text) nums = [int(n.replace(",","")) for n in nums] return { "min": nums[0] if nums else None, "max": nums[1] if len(nums)>1 else nums[0], "estimado": False } def estimar_salario(titulo, ubicacion, habilidades): """ Modelo de estimación basado en historial. Usa medianas por (rol, ciudad) de los últimos 90 días. """ key = clasificar_rol(titulo) mediana = HISTORICO[key][ubicacion]["mediana"] ajuste = factor_habilidades(habilidades) return { "min": int(mediana * 0.85 * ajuste), "max": int(mediana * 1.15 * ajuste), "estimado": True }

Ejemplo: Análisis de brecha de perfil

EJEMPLO
# gap_analysis.py — ejemplo ilustrativo def calcular_match(perfil_usuario, requisitos_vacante): """ Calcula porcentaje de compatibilidad y lista brechas. perfil_usuario: dict con habilidades, experiencia, idiomas, certificaciones requisitos_vacante: dict extraído y normalizado de OCC """ score = 0 brechas = [] # Habilidades técnicas (peso: 40%) skills_match = len(perfil["skills"] & requisitos["skills"]) skills_total = len(requisitos["skills"]) score += 0.4 * (skills_match / max(skills_total, 1)) brechas += [s for s in requisitos["skills"] if s not in perfil["skills"]] # Experiencia (peso: 25%) exp_ratio = min(perfil["años_exp"] / requisitos["años_exp"], 1.0) score += 0.25 * exp_ratio # Idiomas (peso: 20%) idiomas_ok = all(i in perfil["idiomas"] for i in requisitos["idiomas"]) score += 0.2 if idiomas_ok else 0 # Certificaciones (peso: 15%) certs_match = len(perfil["certs"] & requisitos["certs"]) score += 0.15 * (certs_match / max(len(requisitos["certs"]), 1)) return {"match_pct": round(score * 100), "brechas": brechas}

Estructura de almacenamiento en Drive

Árbol de directorios

/4guo/ mx/ mx-05/ 2026-04-29/ raw_2026-04-29.json # Datos crudos extraídos clean_2026-04-29.json # Vacantes normalizadas report_2026-04-29.json # Análisis con match y brechas dashboard.html # Dashboard generado del día summary_2026-04-29.csv # CSV para importar a hojas de cálculo execution.log # Log de ejecución completo 2026-04-28/ ... # Snapshot del día anterior 2026-04-27/ ... _meta/ perfil_usuario.yaml # Perfil del candidato (sin datos sensibles) categorias.yaml # Configuración de categorías a rastrear ciudades.yaml # Ciudades objetivo

Política de retención y acceso

ParámetroValor
Retención de snapshots diarios90 días
Retención de resúmenes semanales1 año
Formato de archivo principalJSON + CSV
Compresión tras 30 díasgzip (.json.gz)
Acceso a carpetaSolo propietario
Carpeta scoped/4guo/mx/mx-05/
Sin datos personales en DriveVerificado
Tamaño promedio diario~4.2 MB
Checksum por archivoSHA-256

Manejo de reintentos, rate-limit y datos obsoletos

Reintentos (retry)

EscenarioEstrategia
HTTP 429 (rate limit)Backoff exponencial: 2s → 4s → 8s → 16s. Máx. 4 intentos.
HTTP 5xxReintento lineal cada 30s. Máx. 3 intentos.
Timeout de redReintento tras 10s. Máx. 2 intentos.
HTML inesperadoLog + skip de la vacante. Reintento en siguiente ciclo.
Fallo totalAlerta por correo. Se usa snapshot del día anterior como fallback.

Rate-limit

ControlConfiguración
Delay entre requests1.5s – 3.0s (aleatorio)
Máx. requests/minuto25
Sesiones concurrentes1 (secuencial)
User-Agent rotativoPool de 5 UAs realistas
Respeto a robots.txt

Datos obsoletos

VerificaciónAcción
Vacante > 30 díasMarcada como posible inactiva
Salario no actualizado 60dSe recalcula estimación con datos frescos
Empresa sin vacantes 90dSe elimina de la base activa
Delta < 5% vs. ayerLog de advertencia: posible scraping parcial
Vacante eliminada en origenSe marca como cerrada en el reporte

Notas de seguridad

Variables de entorno y secretos

  • Las credenciales de OCC (si se usan para API autenticada) se almacenan exclusivamente en variables de entorno del MuleRun Computer (OCC_API_KEY, OCC_API_SECRET).
  • Nunca se escriben secretos en archivos de Drive. Los archivos en /4guo/mx/mx-05/ no contienen tokens, contraseñas ni claves de API.
  • Las variables sensibles se inyectan en runtime por el orquestador de MuleRun Computer y no persisten en disco.

Carpeta scoped y aislamiento

  • El script solo tiene permisos de escritura en /4guo/mx/mx-05/. No puede acceder a otras carpetas de Drive.
  • El perfil del usuario (perfil_usuario.yaml) contiene solo habilidades y experiencia — sin nombre, correo, teléfono ni RFC.
  • Los datos de vacantes son información pública de OCC Mundial. No se almacenan datos personales de terceros.
  • Los logs de ejecución se purgan automáticamente tras 30 días.

Checklist de seguridad operativa

ControlEstadoDetalle
Secretos en env vars, no en códigoOKVerificado en último audit 2026-04-15
Sin PII en DriveOKValidación automática pre-upload
Carpeta scoped (solo /4guo/mx/mx-05/)OKPermisos verificados vía IAM
HTTPS en todas las conexionesOKTLS 1.3 obligatorio
Logs sin datos sensiblesOKRegex de sanitización en logger
Respeto a robots.txtOKParser integrado en extractor
Rate-limit respetuosoOK1.5-3s entre requests, máx. 25/min

Métricas de resultado y trail de auditoría

Métricas de impacto (últimos 30 días)

MétricaValorTendencia
Vacantes rastreadas (total acumulado)84,230+18% vs. mes ant.
Vacantes únicas con salario estimado60,64572% del total
Vacantes con match ≥75%12,438+22% vs. mes ant.
Postulaciones realizadas por el usuario47+15 vs. mes ant.
Entrevistas obtenidas1123% tasa de conversión
Ofertas recibidas327% de entrevistas
Tiempo promedio de búsqueda reducido-62%de 45 min/día a 17 min/día
Ejecuciones exitosas del cron29/3096.7% uptime

Trail de auditoría — últimas 7 ejecuciones

FechaVacantesDuraciónEstadoArchivo Drive
2026-04-292,8476m 16sOK/mx-05/2026-04-29/
2026-04-282,5355m 48sOK/mx-05/2026-04-28/
2026-04-272,6125m 55sOK/mx-05/2026-04-27/
2026-04-261,8934m 21sParcial/mx-05/2026-04-26/
2026-04-252,7016m 02sOK/mx-05/2026-04-25/
2026-04-242,6885m 51sOK/mx-05/2026-04-24/
2026-04-232,5745m 39sOK/mx-05/2026-04-23/
* 2026-04-26: ejecución parcial por mantenimiento de OCC (HTTP 503). Se usó fallback del día anterior para vacantes faltantes.

Tendencia de vacantes rastreadas (últimos 14 días)

0 1,000 2,000 3,000 Abr 16 Abr 19 Abr 22 Abr 25 Abr 28 Hoy 503 parcial

Top 10 habilidades más demandadas esta semana

Python
847
SQL
791
Excel
683
Inglés
638
AWS
485
Power BI
441
Scrum
387
Java
360
SAP
315
Figma
252