Verwenden von Python zum Analysieren der erforderlichen Anforderungen an Entwickler


Heute finden Sie im Web eine große Menge heterogener Informationen zu den beliebtesten Programmiersprachen, Bibliotheken, Frameworks, Betriebssystemen und anderen Entitäten - nennen wir sie Technologien. Die Anzahl dieser Technologien wächst ständig und es wird klar, dass sich jeder, der den Weg eines Entwicklers gehen möchte, darauf konzentrieren muss, einige der beliebtesten Stacks zu studieren, die mit einer Schlüsseltechnologie verbunden sind.


Dies wirft die erste Frage auf: Wie kann man die Nachfrage nach einer bestimmten Technologie bestimmen? Diese Frage kann zum Beispiel wie folgt beantwortet werden: Es besteht ein Bedarf an Technologie, wenn Arbeitgeber dies bei der Beschreibung einer offenen Stelle als Voraussetzung für einen Bewerber angeben. Mit anderen Worten, wenn bei der Anzeige von 100 offenen Stellen Technologie A 60 Mal und Technologie B - 20 Mal erwähnt wurde, können wir Technologie A als gefragter als B betrachten.


Die zweite Frage ist, was als Schlüsseltechnologien gelten.


Aufgrund des großen Interesses an Artikeln zur Analyse der Popularität von Programmiersprachen werden wir die Programmiersprache als Schlüsseltechnologie betrachten.


Somit kann das Problem wie folgt formuliert werden: Bei einer Vielzahl von Stellenangeboten ist es erforderlich, eine Teilmenge hervorzuheben, die der Schlüsseltechnologie zugeordnet ist, und in dieser Teilmenge die Häufigkeit der Erwähnung anderer Technologien zu berechnen.


Als Datenbank mit offenen Stellen werden wir das hh.ru- Portal aufgrund seiner großen Beliebtheit und der Verfügbarkeit der HeadHunter-API verwenden . Die Programmiersprache ist Python 3.4.


Um das Volumen des Artikels zu verringern, wird die technische Seite des Problems des Erhaltens und Verarbeitens von Daten nicht im Detail betrachtet, aber einige wichtige Punkte sollten berücksichtigt werden. Der Quellcode für das Projekt ist offen und auf GitHub verfügbar.



Eine Stellenanzeige bekommen


Um eine Liste der offenen Stellen im Zusammenhang mit Python-Programmierern zu erhalten, stellen Sie mithilfe der Anforderungsbibliothek die folgende Abrufanforderung :


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) 

Als Ergebnis erhalten wir ein Wörterbuch mit den folgenden Elementen:


  • Seite: Klasse 'int'
  • Cluster: Klasse 'NoneType'
  • per_page: Klasse 'int'
  • alternative_url: Klasse 'str'
  • gefunden: Klasse 'int'
  • Argumente: Klasse 'NoneType'
  • Elemente: Klasse 'Liste'
  • Seiten: Klasse 'int'

Wir interessieren uns für:


  • Schlüsselseiten, deren Wert die Anzahl der Seiten mit offenen Stellen enthält,
  • den Artikelschlüssel, der auf die Stellenliste auf der Seite verweist.

Für jedes Element in der Elementliste , bei dem es sich um ein Wörterbuch handelt, benötigen wir den URL- Schlüssel. Der Wert für diesen Schlüssel ist ein Link zu einer detaillierten Beschreibung der offenen Stelle. Durch sequentielles Ändern des Seitenparameters können Sie auf Anfrage alle offenen Stellen durchlaufen und eine Liste erstellen, die für die weitere Analyse von Links erforderlich ist. Um das Laden von Jobinformationen zu beschleunigen, werden mehrere parallele Threads aus der Threading- Bibliothek verwendet :


 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() 

Nachdem die Abhängigkeit der Download-Geschwindigkeit des Testsatzes von 274 offenen Stellen von der Anzahl der Download-Threads ermittelt wurde, wurde beschlossen, 10 Threads zu verwenden, da in diesem Fall eine größere Anzahl von Threads die Zeit des Skripts praktisch nicht verkürzt.



Erstellung eines Vokabulars von Fähigkeiten und Suche nach Fähigkeiten in der Stellenbeschreibung


Ursprünglich sollte manuell ein Wörterbuch mit Schlüsselkompetenzen erstellt werden. Nach der Analyse der Struktur der Stellenbeschreibung wurde jedoch klar, dass der Prozess auf viele Arten automatisiert werden kann. Dazu benötigen wir eine Liste mit Zugriff auf key_skills, die die Schlüsselkompetenzen dieser Stelle enthält. Leider enthalten nur wenige offene Stellen Informationen zu Schlüsselqualifikationen. Darüber hinaus können diese Informationen von der Hauptbeschreibung abweichen. Daher würde die Verarbeitung nur dieser Daten kein vollständiges Bild ergeben.


Alle einzigartigen Schlüsselqualifikationen für offene Stellen mit den Namen "Programmer" + ("Java", "JavaScript", "1C", "Python", "C", "C ++", "C #", "Objective-C", "Perl", "Ruby", "PHP") und verwendet - die ersten 150 am häufigsten.


 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) 

Die Suche nach Schlüsselwörtern in Stellenbeschreibungen wurde mit einem regulären Ausdruck des Formulars durchgeführt:


 pattern = r"(?i)[^--a-zA-Z0-9_|^]%s[^--a-zA-Z0-9_|$]" % kw[item] 

Da es sich bei einigen Technologien um eine Verallgemeinerung mehrerer privater Technologien handelt, wurde bei der Berechnung mit dem SQL- Schlüssel beispielsweise ein Wert des Formulars verwendet:


 "sql": "sql|mysql|postgresql|ms sql" 

Um verschiedene Namen zu berücksichtigen, die sich auf dieselbe Technologie beziehen, wurden Ausdrücke des Formulars verwendet:


 " ": ".+|.+|design patterns", " ": ".+?|english", " ": ".+?.+?|.+?.+?|neural" 

Die endgültige Keyword-Datei befindet sich im GitHub-Repository .


Bei der Auswahl der Schlüsseltechnologien wurde eine Liste der Top-20-Sprachen anhand der Anzahl der offenen Stellen (im Titel angegeben) verwendet . Gleichzeitig bleiben nur die Sprachen übrig, die zusammen mit dem Wort „Programmierer“ im Titel mehr als 20 freie Stellen in St. Petersburg ergeben.



Ergebnisse


Das Ergebnis der Verarbeitung eines so abstrakten Konzepts als „Programmierer“ spiegelt das Gesamtbild der offenen Stellen in der Branche wider. Erstens ist es klar, dass jeder zweite Arbeitgeber SQL- Kenntnisse und Englisch von einem Programmierer erhalten möchte . Jeder dritte Arbeitgeber möchte, dass ein Programmierer ein Git- Versionskontrollsystem besitzt. Aufgrund der Ausrichtung der Entwicklung im Web sind HTML und CSS die nachgefragten Technologien. Dies ist besonders wichtig für JavaScript und PHP . Etwas unerwartet, aber der Programmierer muss wahrscheinlich in einem Team arbeiten .


Zu den gängigen Technologien, die im einundzwanzigsten enthalten sind, gehören objektorientierte Programmierung , Datenbanken , Algorithmen und Entwurfsmuster .


Als Betriebssystem sollte Linux bevorzugt werden.


Wenn Sie bestimmte Sprachen berücksichtigen, sehen Sie, dass neben der ersten Zeile das beliebteste Framework oder die beliebteste Bibliothek steht. Für Java sind dies Spring und Hibernate , für C # - .net und asp.net wird der Python-Programmierer wahrscheinlich Django und JavaScript React benötigen.

Besonders und anspruchslos ist der Wohnkomplex 1C . Viele Arbeitgeber werden nur über ausreichende Kenntnisse dieser Plattform verfügen (ich habe keine Ahnung, wie viel oder wenig). Nützliche Fähigkeiten sind: Teamwork , Verständnis für Testprozesse und die Fähigkeit, mit Datenbanken zu arbeiten.


Aufgrund der Besonderheiten der Suchmaschine hh wurden auf Wunsch von "Programmer C" viele Ergebnisse mit 1C-Technologie veröffentlicht. Daher erwiesen sich die Ergebnisse in dieser Sprache als falsch.


Die in St. Petersburg erzielten Ergebnisse gebe ich unten an.









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


All Articles