Analyse d'emploi de HeadHunter


Une fois, cela est devenu intéressant pour moi, mais que se passe-t-il si vous essayez d'analyser les postes vacants et d'en faire des sommets. Découvrez qui est le plus payé, qui est le plus en demande et bien plus encore.


En tant que source de données, j'ai utilisé le célèbre HeadHunter. Les emplois pour ce mois de mai ont été collectés et traités. Seulement pendant un mois, car l'API ne vous permet pas d'en obtenir plus.


Collecte de données


L'API HeadHunter possède une excellente documentation, qui se trouve dans le référentiel . Les demandes doivent être adressées au domaine https://api.hh.ru/ avec l' User-Agent installé, de préférence sous la forme _/_ (__) (parfois d'autres versions de l' User-Agent , mais si le serveur n'aime pas quelque chose, il renverra une erreur )


La logique de collecte est très simple, donc je l'ai implémentée sur bash en utilisant cURL et jq . Cependant, je veux partager quelques nuances.


Pagination


Pour rechercher des postes vacants selon divers paramètres, il existe un point d'extrémité GET /vacancies .


 curl -A 'irenica (https://irenica.com/)' 'https://api.hh.ru/vacancies' 

Les résultats de la recherche seront divisés en pages dont le paramètre per_page est responsable de la taille (20 par défaut et 100 maximum). Vous pouvez sélectionner une page spécifique en spécifiant le paramètre de page (la numérotation commence à 0).


Le champ des pages d'informations de service retournées avec les postes vacants indiquera le nombre total de pages du résultat.


Avec cela, vous pouvez facilement parcourir toutes les pages:


 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 

Données complètes sur le travail


Cependant, les résultats de la recherche ne contiennent qu'une partie des données du travail. Pour tout obtenir, vous devez faire une demande distincte pour le point de terminaison du formulaire GET /vacancies/id_ .


Les données partielles du travail se trouvent dans le champ des items des résultats de la recherche. Tout d'abord, nous collecterons auprès d'eux l'ID de l'offre:


 declare vacanciesIds="$(echo "$page" | jq -r '.items[].id')" 

Nous demandons ensuite individuellement des informations complètes sur les postes vacants respectifs:


 for vacancyId in $vacanciesIds; do declare url="https://api.hh.ru/vacancies/$vacancyId" declare vacancy="$(curl -A 'irenica (https://irenica.com/)' "$url")" #  $vacancy done 

Contournement de la limite de recherche


L'API HeadHunter a une fonctionnalité - peu importe le nombre trouvé, un maximum de 2000 sera retourné. Dans ce cas, le nombre réel trouvé sera également retourné dans le champ found des résultats de la recherche. Grâce à cela, vous pouvez savoir avec certitude si vous avez reçu toutes les données demandées ou s'il y a des pertes.


Pour contourner cette limitation, j'ai proposé ce qui suit. Lors de la recherche, vous pouvez spécifier la durée de publication des offres d'emploi intéressantes (via les date_to date_from et date_to , qui acceptent une date au format ISO 8601). Vous pouvez prendre un petit écart et trier tous les résultats dans de telles pièces: après tout, plus l'intervalle de temps est court, moins vous parvenez à publier les postes vacants.


Il convient de noter que les offres publiées uniquement au cours du dernier mois sont renvoyées. Par conséquent, il n'est plus logique de définir la plage.


Pour itérer sur des périodes de temps, ce dernier est mieux représenté en temps 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 

Traitement des salaires


Pour collecter des statistiques, il a fallu regrouper les postes vacants selon certains critères. Sur bash, c'était déjà problématique, j'ai donc utilisé Python.


La logique de collecte n'a rien de spécial - l'accumulation de données dans un tableau associatif, le tri et la sortie en CSV. Cependant, encore une fois quelques nuances.


Fourchette de salaire


Il convient de noter que le salaire est présenté sous la forme de deux chiffres - le minimum et le maximum, et l'un d'eux peut être absent.


Comme pour l'analyse il fallait avoir un seul numéro, j'ai décidé d'utiliser la bordure inférieure, et seulement si elle est absente, la supérieure.


 salary = None if vacancy['salary']: if vacancy['salary']['to']: salary = vacancy['salary']['to'] if vacancy['salary']['from']: salary = vacancy['salary']['from'] 

Taux de change


Les salaires des postes vacants peuvent être indiqués dans différentes devises et peuvent avoir des taux différents. L'API HeadHunter possède un point d'extrémité GET /dictionaries contenant toutes les valeurs prédéfinies nécessaires. Les taux de change sont présentés dans le champ currency . Pour plus de commodité, il serait préférable de mettre leur liste dans un tableau associatif, où la clé est le code lettre de la devise:


 currencies = {} dictionaries = requests.get('https://api.hh.ru/dictionaries').json() for currency in dictionaries['currency']: currencies[currency['code']] = currency['rate'] 

Désormais, lors du traitement, il sera facile de convertir tous les salaires en une seule devise:


 salary /= currencies[vacancy['salary']['currency']] 

Comptabilité fiscale des particuliers


Dans certains postes vacants, le salaire est indiqué avant le paiement de l'impôt sur le revenu des particuliers, dans certains - après. Le champ gross parle d'une option spécifique: elle est true dans le premier cas et false dans le second.


J'ai décidé de transférer tous les salaires à l'option après impôt:


 if vacancy['salary']['gross']: salary -= salary * 0.13 

Analyse des résultats


Et maintenant, il est temps de montrer les chiffres.


Travail à distance


Probablement, beaucoup de ceux qui ont lu ce post aimeraient travailler sur un site distant. Mais comme vous pouvez le voir, le travail à domicile dans notre pays n'est pas encore très cité. Le salaire est beaucoup plus bas, le nombre de postes vacants est nettement inférieur. Et il y avait donc moins de choix pour le demandeur.


Et c'est assez étrange, car dans de nombreux métiers et dans de nombreuses entreprises (selon les spécificités des tâches) la présence d'une personne au bureau n'est pas du tout nécessaire. Mais c'est un argument éternel.


NomSalaire moyenSalaire minimumSalaire maximumNuméro
Personnel à domicile11253610977130 00019
Technologie de l'information, Internet, Télécom552251000300 0002828
Top management476879474100 00023
Extraction de matières premières46579200009089880
Installation et service4543911874696009
Fonction publique, organismes sans but lucratif449112000090 00019
Personnel de travail4421894996786037
La production423882372100 000236
Construction, immobilier3989670110000329
Transport, Logistique376629490100 000223


Demandeurs d'invalidité


Cependant, le nombre de postes vacants est encore plus restreint - pour les personnes handicapées. Et cela est totalement illogique - même si les employeurs ne veulent pas être supprimés, mais parmi ceux qui sont prêts pour cela, pourquoi si peu de gens pensent aux personnes handicapées? Si vous ne vous souciez pas de ce que la personne est dans trois fuseaux horaires, quelle différence cela fait-il pour vous, est-il capable, par exemple, de marcher?


Beaucoup d'entre vous connaissent peut-être les personnes handicapées. Moi aussi, et je me suis demandé à quel point il leur était difficile de trouver un emploi et sur quoi ils pouvaient compter.


NomSalaire moyenSalaire minimumSalaire maximumNuméro
Fonction publique, organismes sans but lucratif69675870090 0008
Top management48705300008242515
Technologie de l'information, Internet, Télécom453214350200 0001050
Science, éducation45056315890 000376
Approvisionnement4359115 00080 0009
Construction, immobilier4214822250000210
La production4096910 000130500189
Comptabilité, comptabilité de gestion, finance d'entreprise363872610113100125
Avocats343082610160 000131
La sécurité334142290 000178


Étudiants


Nous commençons tous par quelque chose, à savoir par une recherche d'emploi, sans aucune expérience. J'ai décidé d'évaluer la situation avec des postes ouverts à ces candidats.


Le nombre de postes vacants est encourageant pour un emploi rapide. Et je ne sais pas à quel point il est réaliste d’obtenir le salaire maximum, mais vous pouvez même vivre avec des chiffres moyens.


NomSalaire moyenSalaire minimumSalaire maximumNuméro
Counselling6260115002218502504
Construction, immobilier55855209499896455
Top management5082611310400 000111
Extraction de matières premières381928000100 000328
La sécurité346173954100 0005844
Médecine, Pharmacie34475450200 00011776
Transport, Logistique33600500150 0008000
Science, éducation3142611001245101660
Ventes304441350 00052566
Installation et service30360826480 000381


Top global


Et maintenant le plus intéressant: qui est le plus payé? Trié toutes les offres d'emploi trouvées sans aucun filtre.


Bien sûr, c'est la haute direction. Qui en douterait.


Un fait curieux: si vous faites attention au salaire moyen dans toutes les tables, vous pouvez voir qu'il n'est pas tellement différent.


NomSalaire moyenSalaire minimumSalaire maximumNuméro
Top management787891502 000 0002408
Extraction de matières premières616998000180 0002302
Counselling597971500500 0003762
Technologie de l'information, Internet, Télécom527772668480425900
Construction, immobilier485872094998933229
La production42007126100027269
Personnel de travail4120325200 00043079
Entreprise automobile38555208242549269
Installation et service3841225180 0002390
Approvisionnement37846502610002658


Femme de ménage


Et voici le moyen le plus simple: pourquoi étudier pendant 5 ans, si vous pouvez simplement laver le bureau? Vous trouverez ci-dessous le résultat du filtrage des principaux postes vacants pour le «nettoyage *».


Et si vous entrez dans plusieurs bureaux et venez le soir pour quelques heures pour le nettoyage? Vous pouvez donc vivre assez luxueusement. Nous considérerons cela comme un hack de vie.


NomSalaire moyenSalaire minimumSalaire maximumNuméro
Top management6300040 000870008
Marketing, publicité, relations publiques50 00050 00050 0006
Extraction de matières premières4500045000450003
Gestion RH, formations3324679088700058
Comptabilité, comptabilité de gestion, finance d'entreprise320003000035 00010
La sécurité315072000070 0006
Ventes29696473755 000159
Construction, immobilier2902441380 00073
Transport, Logistique24987109904500026
Entreprise automobile2446571244500061


Meilleures villes


Enfin, j'ai décidé de vérifier le nombre de postes vacants par ville. Les premières places ne sont pas surprenantes, mais il y a ensuite des positions curieuses et même inattendues.


NomNuméro
Moscou31137
Saint-Pétersbourg11745
Minsk7608
Almaty4386
Kiev3398
Ekaterinbourg3182
Novossibirsk3097
Kazan3066
Ufa2980
Nizhny Novgorod2876


Dépôt


Tout le code de l'article, avec des améliorations et des instructions, est disponible dans le référentiel .

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


All Articles