Aujourd'hui, sur le Web, vous pouvez trouver une énorme quantité d'informations hétérogènes sur les langages de programmation, bibliothèques, frameworks, systèmes d'exploitation et autres entités les plus populaires - appelons-les technologies. Le nombre de ces technologies est en constante augmentation et il devient clair que tous ceux qui veulent suivre la voie d'un développeur doivent se concentrer sur l'étude de la pile la plus populaire associée à n'importe quelle technologie clé.
Cela soulève la première question - comment déterminer la demande d'une technologie particulière? On peut répondre à cette question, par exemple, comme suit: il y a une demande de technologie lorsque les employeurs la mentionnent comme une exigence pour un demandeur d'emploi lors de la description d'un emploi. En d'autres termes, si lors de la consultation de 100 offres d'emploi, la technologie A a été mentionnée 60 fois et la technologie B - 20 fois, la technologie A peut être considérée comme plus populaire que B.
La deuxième question est de savoir quelles sont les technologies clés?
Sur la base du grand intérêt pour les articles sur l'analyse de la popularité des langages de programmation, nous considérerons le langage de programmation comme la technologie clé.
Ainsi, le problème peut être formulé comme suit - dans une variété de postes vacants, il est nécessaire de mettre en évidence un sous-ensemble associé à la technologie clé, et dans ce sous-ensemble de calculer la fréquence de mention d'autres technologies.
En tant que base de données d'offres d'emploi, nous utiliserons le portail hh.ru , en raison de sa grande popularité et de la disponibilité de l' API HeadHunter . Le langage de programmation est Python 3.4.
Pour réduire le volume de l'article, l'aspect technique de la question de l'obtention et du traitement des données ne sera pas examiné en détail, mais il vaut la peine de s'arrêter à certains points clés. Le code source du projet est ouvert et disponible sur GitHub .
Obtenir une liste d'emplois
Pour obtenir une liste des postes vacants liés aux programmeurs Python, effectuez la demande d'obtention suivante à l'aide de la bibliothèque de demandes :
import requests import json l = "Python" params = {"text": " " + l, "search_field": "name", "area": 2, "period": 30, "page": 0} r = requests.get("https://api.hh.ru/vacancies", params=params) jr = json.loads(r.text)
En conséquence, nous obtenons un dictionnaire avec les éléments suivants:
- page: classe 'int'
- clusters: classe 'NoneType'
- per_page: classe 'int'
- alternative_url: classe 'str'
- trouvé: classe 'int'
- arguments: classe 'NoneType'
- éléments: classe 'liste'
- pages: classe 'int'
Nous sommes intéressés par:
- les pages clés, dont la valeur contient le nombre de pages avec des postes vacants,
- la clé des éléments, qui pointe vers la liste des postes vacants sur la page.
Pour chaque élément de la liste des éléments , qui est un dictionnaire, nous avons besoin de la clé URL . La valeur de cette clé est un lien vers une description détaillée de l'offre d'emploi. En modifiant séquentiellement le paramètre de page , vous pouvez parcourir toutes les offres d'emploi sur demande et créer une liste nécessaire pour une analyse plus approfondie des liens. Pour accélérer le processus de chargement des informations sur le travail, plusieurs threads parallèles de la bibliothèque de threads sont utilisés :
from math import ceil import requests from threading import Thread import json class DownloadThread(Thread): def __init__(self, urls, number, res): Thread.__init__(self) self.number = number self.urls = urls self.res = res def run(self): for url in self.urls: resp = requests.get(url) if resp.status_code == requests.codes.ok: self.res.append(json.loads(requests.get(url).text)) else: print("Status code: " + str(resp.status_code)) print(url) def start_dl_threads(urls, th_num, res): threads = [] n = ceil(len(urls) / th_num) for i in range(th_num): t = DownloadThread(urls[i * n: (i + 1) * n], i, res) threads.append(t) t.start() for t in threads: t.join()
Après avoir établi la dépendance de la vitesse de téléchargement de l'ensemble de test de 274 postes vacants sur le nombre de threads de téléchargement, il a été décidé d'utiliser 10 threads, car, dans ce cas, un plus grand nombre d'entre eux ne réduit pratiquement pas le temps du script.

Création d'un vocabulaire de compétences et recherche de compétences dans la description de poste
Initialement, il était censé créer manuellement un dictionnaire des compétences clés. Cependant, après avoir analysé la structure de la description de poste, il est devenu clair que le processus peut être automatisé de plusieurs façons. Pour ce faire, nous avons besoin d'une liste accessible aux compétences clés contenant les compétences clés de ce poste. Malheureusement, peu de postes vacants contiennent des informations sur les compétences clés. De plus, ces informations peuvent différer de la description principale. Par conséquent, le traitement uniquement de ces données ne donnerait pas une image complète.
Toutes les compétences clés uniques pour les postes vacants avec les noms "Programmer" + ("Java", "JavaScript", "1C", "Python", "C", "C ++", "C #", "Objective-C", "Perl", "Ruby", "PHP"), et utilisé - les 150 premiers plus courants.
os.makedirs("data", exist_ok=True) langs = ("Java", "JavaScript", "1", "Python", "C", "C++", "C#", "Objective-C", "Perl", "Ruby", "PHP") par = {"text": "", "search_field": "name", "area": 2, "period": 30} o = {"skills": 1, "urls": 0, "vacs": 0} for l in langs: par["text"] = " " + l with open("data\data_" + par["text"] + str(datetime.date.today()) + ".json", "w") as f: json.dump(get_info_from_hh(par, 10, o), f, indent=4, ensure_ascii=False) data = Counter() for fn in os.listdir("data"): if os.path.isfile("data/" + fn): with open("data/" + fn, "r") as rf: data += Counter(json.load(rf)["skills"]) for item in data.most_common(150): print(item) jsdict = {item[0]: item[0] for item in data.most_common(150)} with open("kw.json", "w") as wf: json.dump(jsdict, wf, indent=4, ensure_ascii=False, sort_keys=True)
La recherche de mots-clés dans les descriptions de poste a été effectuée à l'aide d'une expression régulière du formulaire:
pattern = r"(?i)[^--a-zA-Z0-9_|^]%s[^--a-zA-Z0-9_|$]" % kw[item]
Étant donné que certaines technologies sont une généralisation de plusieurs autres plus privées, lors du calcul par clé sql , par exemple, une valeur du formulaire a été utilisée:
"sql": "sql|mysql|postgresql|ms sql"
Aussi, pour prendre en compte différents noms liés à la même technologie, des expressions du formulaire ont été utilisées:
" ": ".+|.+|design patterns", " ": ".+?|english", " ": ".+?.+?|.+?.+?|neural"
Le fichier de mots clés final peut être trouvé dans le référentiel GitHub .
Lors du choix des technologies clés, une liste des 20 principales langues a été utilisée par le nombre de postes vacants (mentionnés dans le titre) . Dans le même temps, il ne reste que les langues qui, avec le mot «programmeur» dans le titre, donnent plus de 20 postes vacants à Saint-Pétersbourg.
Résultats
Le résultat du traitement d'un concept aussi abstrait comme «programmeur» reflète bien l'image globale des postes vacants dans l'industrie. Tout d'abord, il est clair qu'un employeur sur deux souhaite obtenir des connaissances en sql et en anglais auprès d'un programmeur. Un employeur sur trois souhaite qu'un programmeur possède un système de contrôle de version git . En raison de l'orientation du développement sur le web, html et css sont les technologies demandées. Ceci est particulièrement important pour JavaScript et PHP . Un peu de façon inattendue, mais le programmeur devra probablement travailler en équipe .
Parmi les technologies communes incluses dans la vingt et unième, il y a la programmation orientée objet , les bases de données , les algorithmes et les modèles de conception .
En tant que système d'exploitation, Linux devrait être préféré.
Lorsque vous envisagez des langues spécifiques, vous pouvez voir qu'à côté de la première ligne se trouve le framework ou la bibliothèque le plus populaire. Pour Java, ce sont Spring et Hibernate , pour C # - .net et asp.net , le programmeur Python aura probablement besoin de Django , et JavaScript aura besoin de React .
Spécial et le moins exigeant est le complexe domestique 1C . De nombreux employeurs n'auront qu'une connaissance suffisante de cette plateforme (je ne sais pas combien ou peu). Les compétences utiles seront: le travail d'équipe , la compréhension des processus de test et la capacité de travailler avec des bases de données .
En raison des particularités du moteur de recherche hh, à la demande du «programmeur C», de nombreux résultats avec la technologie 1C ont été publiés. Par conséquent, les résultats dans cette langue se sont révélés incorrects.
Les résultats obtenus à Saint-Pétersbourg, je donne ci-dessous.







