Análisis de trabajo de HeadHunter


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")" #  $page ((i++)) declare -i totalCount=$(echo "$page" | jq '.pages') if ((i >= totalCount)); then break fi done 

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")" #  $vacancy done 

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)" # ... declare url="https://api.hh.ru/vacancies?per_page=100&page=$i&date_from=$startTimeIso&date_to=$intervalEndIso" # ... startTime=$intervalEnd done 

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.


NombreSalario promedioSalario mínimoSalario máximoNumero
Personal a domicilio11253610977130,00019
Tecnología de la información, Internet, telecomunicaciones552251000300,0002828
Alta gerencia476879474100,00023
Extracción de materia prima46579200009089880
Instalación y servicio4543911874696009 9
Servicio público, organizaciones sin fines de lucro449112000090,00019
Personal de trabajo4421894996786037
Producción423882372100,000236
Construcción inmobiliaria3989670110000329
Transporte, Logistica376629490100,000223


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.


NombreSalario promedioSalario mínimoSalario máximoNumero
Servicio público, organizaciones sin fines de lucro69675870090,0008
Alta gerencia48705300008242515
Tecnología de la información, Internet, telecomunicaciones453214350200,0001050
Ciencia, educacion45056315890,000376
Adquisiciones4359115,00080,0009 9
Construcción inmobiliaria4214822250000210
Producción4096910,000130500189
Contabilidad, contabilidad de gestión, finanzas empresariales363872610113100125
Abogados343082610160,000131
Seguridad334142290,000178


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.


NombreSalario promedioSalario mínimoSalario máximoNumero
Consejeria6260115002218502504
Construcción inmobiliaria55855209499896455
Alta gerencia5082611310400,000111
Extracción de materia prima381928000100,000328
Seguridad346173954100,0005844
Medicina, farmacia34475450200,00011776
Transporte, Logistica33600500150,0008000
Ciencia, educacion3142611001245101660
Ventas304441350,00052566
Instalación y servicio30360826480,000381


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.


NombreSalario promedioSalario mínimoSalario máximoNumero
Alta gerencia787891502,000,0002408
Extracción de materia prima616998000180,0002302
Consejeria597971500500,0003762
Tecnología de la información, Internet, telecomunicaciones527772668480425900
Construcción inmobiliaria485872094998933229
Producción42007126100027269
Personal de trabajo4120325200,00043079
Negocio del automóvil38555208242549269
Instalación y servicio3841225180,0002390
Adquisiciones37846502610002658


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.


NombreSalario promedioSalario mínimoSalario máximoNumero
Alta gerencia6300040,000870008
Marketing, publicidad, relaciones públicas50,00050,00050,0006 6
Extracción de materia prima4500045000450003
Gestión de recursos humanos, entrenamientos3324679088700058
Contabilidad, contabilidad de gestión, finanzas empresariales320003000035,00010
Seguridad315072000070,0006 6
Ventas29696473755,000159
Construcción inmobiliaria2902441380,00073
Transporte, Logistica24987109904500026
Negocio del automóvil2446571244500061


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.


NombreNumero
Moscú31137
San petersburgo11745
Minsk7608
Almaty4386
Kiev3398
Ekaterinburg3182
Novosibirsk3097
Kazán3066
Ufa2980
Nizhny Novgorod2876


Repositorio


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

Source: https://habr.com/ru/post/es418281/


All Articles