
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")"
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")"
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)"
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.
Nom | Salaire moyen | Salaire minimum | Salaire maximum | Numéro |
---|
Personnel à domicile | 112536 | 10977 | 130 000 | 19 |
Technologie de l'information, Internet, Télécom | 55225 | 1000 | 300 000 | 2828 |
Top management | 47687 | 9474 | 100 000 | 23 |
Extraction de matières premières | 46579 | 20000 | 90898 | 80 |
Installation et service | 45439 | 11874 | 69600 | 9 |
Fonction publique, organismes sans but lucratif | 44911 | 20000 | 90 000 | 19 |
Personnel de travail | 44218 | 9499 | 67860 | 37 |
La production | 42388 | 2372 | 100 000 | 236 |
Construction, immobilier | 39896 | 70 | 110000 | 329 |
Transport, Logistique | 37662 | 9490 | 100 000 | 223 |

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.
Nom | Salaire moyen | Salaire minimum | Salaire maximum | Numéro |
---|
Fonction publique, organismes sans but lucratif | 69675 | 8700 | 90 000 | 8 |
Top management | 48705 | 30000 | 82425 | 15 |
Technologie de l'information, Internet, Télécom | 45321 | 4350 | 200 000 | 1050 |
Science, éducation | 45056 | 3158 | 90 000 | 376 |
Approvisionnement | 43591 | 15 000 | 80 000 | 9 |
Construction, immobilier | 42148 | 22 | 250000 | 210 |
La production | 40969 | 10 000 | 130500 | 189 |
Comptabilité, comptabilité de gestion, finance d'entreprise | 36387 | 2610 | 113100 | 125 |
Avocats | 34308 | 2610 | 160 000 | 131 |
La sécurité | 33414 | 22 | 90 000 | 178 |

É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.
Nom | Salaire moyen | Salaire minimum | Salaire maximum | Numéro |
---|
Counselling | 62601 | 1500 | 221850 | 2504 |
Construction, immobilier | 55855 | 20 | 949989 | 6455 |
Top management | 50826 | 11310 | 400 000 | 111 |
Extraction de matières premières | 38192 | 8000 | 100 000 | 328 |
La sécurité | 34617 | 3954 | 100 000 | 5844 |
Médecine, Pharmacie | 34475 | 450 | 200 000 | 11776 |
Transport, Logistique | 33600 | 500 | 150 000 | 8000 |
Science, éducation | 31426 | 1100 | 124510 | 1660 |
Ventes | 30444 | 1 | 350 000 | 52566 |
Installation et service | 30360 | 8264 | 80 000 | 381 |

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.
Nom | Salaire moyen | Salaire minimum | Salaire maximum | Numéro |
---|
Top management | 78789 | 150 | 2 000 000 | 2408 |
Extraction de matières premières | 61699 | 8000 | 180 000 | 2302 |
Counselling | 59797 | 1500 | 500 000 | 3762 |
Technologie de l'information, Internet, Télécom | 52777 | 26 | 684804 | 25900 |
Construction, immobilier | 48587 | 20 | 949989 | 33229 |
La production | 42007 | 1 | 261000 | 27269 |
Personnel de travail | 41203 | 25 | 200 000 | 43079 |
Entreprise automobile | 38555 | 20 | 824254 | 9269 |
Installation et service | 38412 | 25 | 180 000 | 2390 |
Approvisionnement | 37846 | 50 | 261000 | 2658 |

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.
Nom | Salaire moyen | Salaire minimum | Salaire maximum | Numéro |
---|
Top management | 63000 | 40 000 | 87000 | 8 |
Marketing, publicité, relations publiques | 50 000 | 50 000 | 50 000 | 6 |
Extraction de matières premières | 45000 | 45000 | 45000 | 3 |
Gestion RH, formations | 33246 | 7908 | 87000 | 58 |
Comptabilité, comptabilité de gestion, finance d'entreprise | 32000 | 30000 | 35 000 | 10 |
La sécurité | 31507 | 20000 | 70 000 | 6 |
Ventes | 29696 | 4737 | 55 000 | 159 |
Construction, immobilier | 29024 | 413 | 80 000 | 73 |
Transport, Logistique | 24987 | 10990 | 45000 | 26 |
Entreprise automobile | 24465 | 7124 | 45000 | 61 |

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.
Nom | Numéro |
---|
Moscou | 31137 |
Saint-Pétersbourg | 11745 |
Minsk | 7608 |
Almaty | 4386 |
Kiev | 3398 |
Ekaterinbourg | 3182 |
Novossibirsk | 3097 |
Kazan | 3066 |
Ufa | 2980 |
Nizhny Novgorod | 2876 |

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