
Una vez se volvió interesante para mí, pero ¿qué pasa si tratas de analizar las vacantes y trazar algunas tapas en ellas? Descubra quién paga más, quién tiene más demanda y mucho más.
Como fuente de datos, utilicé el conocido HeadHunter. Los trabajos para este mes de mayo fueron recopilados y procesados. Solo por un mes, porque la API no le permite obtener más.
Recogida de datos
HeadHunter API tiene una excelente documentación, que se encuentra en el repositorio . Las solicitudes se deben realizar al dominio https://api.hh.ru/ con el User-Agent
instalado, preferiblemente con el formato _/_ (__)
(otras versiones del User-Agent
veces funcionan, pero si al servidor no le gusta algo, devolverá un error )
La lógica de la colección es muy simple, así que la implementé en bash usando cURL y jq . Sin embargo, quiero compartir algunos matices.
Paginación
Para buscar vacantes por varios parámetros, hay un punto final GET /vacancies
.
curl -A 'irenica (https://irenica.com/)' 'https://api.hh.ru/vacancies'
Los resultados de la búsqueda se dividirán en páginas para las cuales el parámetro per_page
es responsable del tamaño (20 por defecto y 100 como máximo). Puede seleccionar una página específica especificando el parámetro de la page
(la numeración comienza desde 0).
El campo de pages
de información de servicio devuelto con vacantes indicará el número total de páginas del resultado.
Con esto, puede iterar fácilmente en todas las páginas:
declare -ii=0 while true; do declare url="https://api.hh.ru/vacancies?per_page=100&page=$i" declare page="$(curl -A 'irenica (https://irenica.com/)' "$url")"
Datos completos del trabajo
Sin embargo, los resultados de búsqueda contienen solo una parte de los datos del trabajo. Para obtener todo, debe realizar una solicitud por separado para el punto final del formulario GET /vacancies/id_
.
Los datos parciales del trabajo se encuentran en el campo de items
de los resultados de búsqueda. Primero, recogeremos de ellos el ID de vacante:
declare vacanciesIds="$(echo "$page" | jq -r '.items[].id')"
Luego solicitamos información completa sobre las vacantes respectivas individualmente:
for vacancyId in $vacanciesIds; do declare url="https://api.hh.ru/vacancies/$vacancyId" declare vacancy="$(curl -A 'irenica (https://irenica.com/)' "$url")"
Bypass de límite de búsqueda
HeadHunter API tiene una característica: no importa cuántos se encuentren, se devolverá un máximo de 2000. En este caso, el número real encontrado también se devolverá en el campo found
de los resultados de búsqueda. Gracias a esto, puede saber con certeza si recibió todos los datos solicitados o si hay pérdidas.
Para evitar esta limitación, se me ocurrió lo siguiente. Al buscar, puede especificar el período de tiempo en que se publicaron las vacantes de interés (a través de los date_to
date_from
y date_to
, que aceptan una fecha en formato ISO 8601). Puede tomar una pequeña brecha y ordenar todos los resultados en tales piezas: después de todo, cuanto más corto sea el intervalo de tiempo, menos vacantes logrará publicar para él.
Vale la pena prestar atención a que las vacantes publicadas solo en el último mes sean devueltas. Por lo tanto, ya no tiene sentido establecer el rango.
Para iterar sobre períodos de tiempo, este último se representa mejor como tiempo Unix:
declare -i startTime=$(date -d '-1 month' +%s) declare -i endTime=$(date -d now +%s) while ((startTime <= endTime)); do declare -i intervalEnd=$((startTime + 60*60)) declare startTimeIso="$(date -d @$startTime +%FT%T)" declare intervalEndIso="$(date -d @$intervalEnd +%FT%T)"
Procesamiento de Salarios
Para recopilar estadísticas, era necesario agrupar las vacantes de acuerdo con ciertos criterios. En bash, esto ya era problemático, así que usé Python.
La lógica de recopilación no es nada especial: la acumulación de datos en una matriz asociativa, clasificación y salida en CSV. Sin embargo, de nuevo algunos matices.
Tenedor de salario
Cabe señalar que el salario se presenta en forma de dos números: el mínimo y el máximo, y cualquiera de ellos puede estar ausente.
Como para el análisis era necesario tener un número, decidí usar el borde inferior, y solo si está ausente, el superior.
salary = None if vacancy['salary']: if vacancy['salary']['to']: salary = vacancy['salary']['to'] if vacancy['salary']['from']: salary = vacancy['salary']['from']
Tasas de divisas
Los salarios en vacantes se pueden indicar en diferentes monedas, y pueden tener diferentes tasas. La API HeadHunter tiene un punto final GET /dictionaries
contiene todos los valores predefinidos necesarios. Los tipos de cambio se presentan en el campo de currency
. Por conveniencia, sería mejor poner su lista en una matriz asociativa, donde la clave es el código de letra de la moneda:
currencies = {} dictionaries = requests.get('https://api.hh.ru/dictionaries').json() for currency in dictionaries['currency']: currencies[currency['code']] = currency['rate']
Ahora, durante el procesamiento, será fácil convertir todos los salarios en una moneda:
salary /= currencies[vacancy['salary']['currency']]
Contabilidad del impuesto sobre la renta personal
En algunas vacantes, el salario se indica antes del pago del impuesto sobre la renta personal, en algunos después. El campo gross
habla de una opción específica: es true
en el primer caso y false
en el segundo.
Decidí transferir todos los salarios a la opción después de impuestos:
if vacancy['salary']['gross']: salary -= salary * 0.13
Análisis de resultados
Y ahora es el momento de mostrar los números.
Trabajo a distancia
Probablemente, a muchos de los que leen esta publicación les gustaría trabajar en un sitio remoto. Pero como puede ver, el trabajo desde casa en nuestro país aún no está muy citado. El salario es mucho más bajo, el número de vacantes es significativamente menor. Y así, había menos opciones para el solicitante.
Y esto es bastante extraño, porque en muchas profesiones y muchas empresas (de acuerdo con los detalles de las tareas) la presencia de una persona en la oficina no es necesaria en absoluto. Pero este es un argumento eterno.
Nombre | Salario promedio | Salario mínimo | Salario máximo | Numero |
---|
Personal a domicilio | 112536 | 10977 | 130,000 | 19 |
Tecnología de la información, Internet, telecomunicaciones | 55225 | 1000 | 300,000 | 2828 |
Alta gerencia | 47687 | 9474 | 100,000 | 23 |
Extracción de materia prima | 46579 | 20000 | 90898 | 80 |
Instalación y servicio | 45439 | 11874 | 69600 | 9 9 |
Servicio público, organizaciones sin fines de lucro | 44911 | 20000 | 90,000 | 19 |
Personal de trabajo | 44218 | 9499 | 67860 | 37 |
Producción | 42388 | 2372 | 100,000 | 236 |
Construcción inmobiliaria | 39896 | 70 | 110000 | 329 |
Transporte, Logistica | 37662 | 9490 | 100,000 | 223 |

Solicitantes de discapacidad
Sin embargo, hay un número aún menor de vacantes, para personas con discapacidades. Y esto es completamente ilógico, a pesar de que los empleadores no quieren ser removidos, pero entre aquellos que están listos para esto, ¿por qué tan pocos que piensan en las personas con discapacidad? Si no le importa cuál es la persona en tres zonas horarias, ¿qué diferencia tiene para usted? ¿Puede caminar, por ejemplo?
Muchos de ustedes pueden estar familiarizados con personas con discapacidades. Yo también, y me preguntaba lo difícil que era para ellos encontrar un trabajo y con qué podían contar.
Nombre | Salario promedio | Salario mínimo | Salario máximo | Numero |
---|
Servicio público, organizaciones sin fines de lucro | 69675 | 8700 | 90,000 | 8 |
Alta gerencia | 48705 | 30000 | 82425 | 15 |
Tecnología de la información, Internet, telecomunicaciones | 45321 | 4350 | 200,000 | 1050 |
Ciencia, educacion | 45056 | 3158 | 90,000 | 376 |
Adquisiciones | 43591 | 15,000 | 80,000 | 9 9 |
Construcción inmobiliaria | 42148 | 22 | 250000 | 210 |
Producción | 40969 | 10,000 | 130500 | 189 |
Contabilidad, contabilidad de gestión, finanzas empresariales | 36387 | 2610 | 113100 | 125 |
Abogados | 34308 | 2610 | 160,000 | 131 |
Seguridad | 33414 | 22 | 90,000 | 178 |

Estudiantes
Todos comenzamos con algo, es decir, con una búsqueda de empleo, sin ninguna experiencia. Decidí evaluar la situación con posiciones abiertas para tales candidatos.
El número de vacantes es alentador para un empleo rápido. Y no sé qué tan realista es obtener el salario máximo, pero incluso puedes vivir con cifras promedio de alguna manera.
Nombre | Salario promedio | Salario mínimo | Salario máximo | Numero |
---|
Consejeria | 62601 | 1500 | 221850 | 2504 |
Construcción inmobiliaria | 55855 | 20 | 949989 | 6455 |
Alta gerencia | 50826 | 11310 | 400,000 | 111 |
Extracción de materia prima | 38192 | 8000 | 100,000 | 328 |
Seguridad | 34617 | 3954 | 100,000 | 5844 |
Medicina, farmacia | 34475 | 450 | 200,000 | 11776 |
Transporte, Logistica | 33600 | 500 | 150,000 | 8000 |
Ciencia, educacion | 31426 | 1100 | 124510 | 1660 |
Ventas | 30444 | 1 | 350,000 | 52566 |
Instalación y servicio | 30360 | 8264 | 80,000 | 381 |

Top general
Y ahora lo más interesante: ¿a quién se le paga más? Ordena todas las vacantes encontradas sin ningún filtro.
Por supuesto, esta es la alta gerencia. ¿Quién lo dudaría?
Un dato curioso: si prestas atención al salario promedio en todas las tablas, puedes ver que no es muy diferente.
Nombre | Salario promedio | Salario mínimo | Salario máximo | Numero |
---|
Alta gerencia | 78789 | 150 | 2,000,000 | 2408 |
Extracción de materia prima | 61699 | 8000 | 180,000 | 2302 |
Consejeria | 59797 | 1500 | 500,000 | 3762 |
Tecnología de la información, Internet, telecomunicaciones | 52777 | 26 | 684804 | 25900 |
Construcción inmobiliaria | 48587 | 20 | 949989 | 33229 |
Producción | 42007 | 1 | 261000 | 27269 |
Personal de trabajo | 41203 | 25 | 200,000 | 43079 |
Negocio del automóvil | 38555 | 20 | 824254 | 9269 |
Instalación y servicio | 38412 | 25 | 180,000 | 2390 |
Adquisiciones | 37846 | 50 | 261000 | 2658 |

Mujer de limpieza
Y esta es la forma más fácil: ¿por qué estudiar durante 5 años, si solo puedes lavar la oficina? A continuación se muestra el resultado de filtrar las vacantes principales para la consulta "limpiador *".
¿Qué pasa si entra en varias oficinas y viene por la noche durante un par de horas para limpiar? Para que puedas vivir muy lujosamente. Consideraremos esto como un truco de la vida.
Nombre | Salario promedio | Salario mínimo | Salario máximo | Numero |
---|
Alta gerencia | 63000 | 40,000 | 87000 | 8 |
Marketing, publicidad, relaciones públicas | 50,000 | 50,000 | 50,000 | 6 6 |
Extracción de materia prima | 45000 | 45000 | 45000 | 3 |
Gestión de recursos humanos, entrenamientos | 33246 | 7908 | 87000 | 58 |
Contabilidad, contabilidad de gestión, finanzas empresariales | 32000 | 30000 | 35,000 | 10 |
Seguridad | 31507 | 20000 | 70,000 | 6 6 |
Ventas | 29696 | 4737 | 55,000 | 159 |
Construcción inmobiliaria | 29024 | 413 | 80,000 | 73 |
Transporte, Logistica | 24987 | 10990 | 45000 | 26 |
Negocio del automóvil | 24465 | 7124 | 45000 | 61 |

Mejores ciudades
Finalmente, decidí verificar el número de vacantes abiertas por ciudad. Los primeros lugares no son sorprendentes, pero luego hay posiciones curiosas e incluso inesperadas.
Nombre | Numero |
---|
Moscú | 31137 |
San petersburgo | 11745 |
Minsk | 7608 |
Almaty | 4386 |
Kiev | 3398 |
Ekaterinburg | 3182 |
Novosibirsk | 3097 |
Kazán | 3066 |
Ufa | 2980 |
Nizhny Novgorod | 2876 |

Repositorio
Todo el código del artículo, con mejoras e instrucciones, está disponible en el repositorio .