Verwenden von Python zum Analysieren der damit verbundenen erforderlichen Fähigkeiten bei Entwicklern


Heutzutage 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 stetig und es wird klar, dass sich jeder, der den Weg eines Entwicklers beschreiten möchte, darauf konzentrieren muss, einige der beliebtesten Stapel 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 beispielsweise wie folgt beantwortet werden: Es besteht ein Technologiebedarf, wenn Arbeitgeber dies als Anforderung an den Bewerber bei der Beschreibung der Vakanz angeben. wenn die Betrachtungsposition 100 Technik Mit anderen Worten : Eine Referenz 60 mal gemacht wurde, und Technologie B - 20 - mal, kann die Technologie als angesehen wird A marktfähigere als B .


Die zweite Frage lautet: Was sind Schlüsseltechnologien?


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: In einer Vielzahl von Stellen ist es erforderlich, eine Teilmenge der Schlüsseltechnologie herauszugreifen und in dieser Teilmenge die Häufigkeit der Erwähnung anderer Technologien zu berechnen.


Als Datenbank mit Stellenangeboten wird das Portal hh.ru aufgrund seiner großen Beliebtheit und der Verfügbarkeit der HeadHunter-API verwendet . Die Programmiersprache ist Python 3.4.


Um das Volumen des Artikels zu reduzieren, wird die technische Seite des Problems der Datenerfassung und -verarbeitung nicht im Detail betrachtet. Es lohnt sich jedoch, auf einige wichtige Punkte einzugehen. Der Quellcode für das Projekt ist offen und auf GitHub verfügbar .



Eine Liste der offenen Stellen abrufen


Um eine Liste der Stellenangebote zu erhalten, die sich auf Python-Programmierer beziehen, stellen Sie die folgende Anforderung mithilfe der Anforderungsbibliothek :


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 folgenden Elementen:


  • page: class 'int'
  • Cluster: Klasse 'NoneType'
  • per_page: Klasse 'int'
  • alternate_url: Klasse 'str'
  • Gefunden: Klasse 'int'
  • Argumente: Klasse 'NoneType'
  • items: class 'list'
  • pages: class 'int'

Wir interessieren uns für:


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

Für jeden Eintrag in der Artikelliste , bei der 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 Vakanz. Sequenziell Änderung der Einstellung Seite , können Sie durch alle Jobs für und eine Liste der erforderlichen Referenzen für weitere Analysen erstellen. Um das Laden von Auftragsinformationen 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 worden war, wurde beschlossen, 10 Threads zu verwenden, da in diesem Fall eine größere Anzahl von Threads die Laufzeit des Skripts praktisch nicht verringert.



Erstellung eines Kompetenzvokabulars und Suche nach Kompetenzen in der Stellenbeschreibung


Ursprünglich sollte ein Wörterbuch mit Schlüsselkompetenzen manuell erstellt werden. Nach einer Analyse der Struktur der Stellenbeschreibung wurde jedoch klar, dass der Prozess auf viele Arten automatisiert werden kann. Dazu benötigen wir eine key_skills-barrierefreie Liste mit den Schlüsselqualifikationen dieser Stelle. Leider enthalten nur wenige Stellen Informationen zu Schlüsselqualifikationen. Außerdem 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 Stichwö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 beispielsweise bei der Berechnung mit dem SQL- Schlüssel 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 nach der Anzahl der offenen Stellen verwendet (siehe Titel) . Gleichzeitig bleiben nur die Sprachen übrig, die zusammen mit dem Wort „Programmierer“ im Titel mehr als 20 freie Stellen in St. Petersburg bieten.



Ergebnisse


Das Ergebnis der Verarbeitung eines solchen abstrakten Konzepts als „Programmierer“ spiegelt das Gesamtbild der freien Stellen in der Industrie gut wider. Erstens ist 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 nachgefragte Technologien . Dies ist besonders wichtig für JavaScript und PHP . Etwas unerwartet, aber der Programmierer muss wahrscheinlich in einem Team arbeiten .


Unter den im einundzwanzigsten enthaltenen allgemeinen Technologien befinden sich objektorientierte Programmierung , Datenbanken , Algorithmen und Entwurfsmuster .


Als Betriebssystem sollte Linux bevorzugt werden .


Wenn Sie bestimmte Sprachen berücksichtigen, sehen Sie, dass sich neben der ersten Zeile das beliebteste Framework oder die beliebteste Bibliothek befindet. 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 genügend Kenntnisse über diese Plattform haben (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 ausgegeben. Daher stellte sich heraus, dass die Ergebnisse in dieser Sprache falsch waren.


Die in St. Petersburg erzielten Ergebnisse gebe ich nachfolgend wieder.










Jetzt auch beliebt: