
Möchten Sie wissen, wie die Situation auf dem Arbeitsmarkt ist, insbesondere im Bereich der Datenwissenschaft?
Wenn Sie Python und Pandas kennen, scheint das Parsen von Headhuntern eines der zuverlässigsten und einfachsten zu sein.
Code funktioniert unter Python3.6 und Pandas 0.24.2
Ipython kann hier heruntergeladen werden .
So überprüfen Sie die Version der Pandas-Konsole (Linux / MacOS):
ipython
Und dann in der Kommandozeile
#ipython import pandas as pd pd.__version__
# () pip install pandas==0.24.2
Schon alles konfiguriert? Lass uns gehen!
Parsim in Python
Mit HH können Sie Arbeit in Russland finden. Diese Rekrutierungsressource verfügt über die größte Datenbank mit offenen Stellen. HH teilt eine bequeme API.
Googelte ein wenig und es stellte sich heraus, einen Parser zu schreiben.
# https://gist.github.com/fuwiak/9c695b51c33b2e052c5a721383705a9c # (BASH) python3 hh_parser.py import requests import pandas as pd number_of_pages = 100 #number_of_ads = number_of_pages * per_page job_title = ["'Data Analyst' and 'data scientist'"] for job in job_title: data=[] for i in range(number_of_pages): url = 'https://api.hh.ru/vacancies' par = {'text': job, 'area':'113','per_page':'10', 'page':i} r = requests.get(url, params=par) e=r.json() data.append(e) vacancy_details = data[0]['items'][0].keys() df = pd.DataFrame(columns= list(vacancy_details)) ind = 0 for i in range(len(data)): for j in range(len(data[i]['items'])): df.loc[ind] = data[i]['items'][j] ind+=1 csv_name = job+".csv" df.to_csv(csv_name)
Als Ergebnis haben wir eine CSV-Datei mit dem in job_title angegebenen Namen erhalten.
In der angegebenen Datei wird eine Datei mit offenen Stellen mit der Phrase heruntergeladen
"Data Analyst" und "Data Scientist". Wenn Sie die Zeile separat ändern möchten in
job_title=['Data Analyst', 'Data Scientist']
Dann erhalten Sie 2 Dateien mit diesen Namen.
Interessanterweise gibt es neben "und" noch andere Operatoren. Mit ihrer Hilfe können Sie nach genauen Übereinstimmungen suchen. Weitere Details hier.
https://hh.ru/article/309400
Wie spät ist es? Es ist Pandas Zeit!
Auf diese Weise gesammelte Anzeigen werden gemäß den darin enthaltenen Informationen oder einer Beschreibung ihrer Metadaten in Gruppen unterteilt. Zum Beispiel: Stadt; Position Pay Plug; Berufsgruppe. In diesem Fall kann eine einzelne Anzeige mehreren Kategorien angehören.
Ich kümmere mich mit jupyter-notebook um die Daten, die sich auf die Position des "Datenwissenschaftlers" beziehen. https://jupyter.org/

Was tun, um den Namen der Spalte "Unbenannt" zu ändern?

Die wichtigste Frage - ZP
import ast # run code from string for example ast.literal_eval("1+1") salaries = df.salary.dropna() # remove all NA's from dataframe currencies = [ast.literal_eval(salaries.iloc[i])['currency'] for i in range(len(salaries))] curr = set(currencies) #{'EUR', 'RUR', 'USD'} #divide dataframe salararies by currency rur = [ast.literal_eval(salaries.iloc[i]) for i in range(len(salaries)) if ast.literal_eval(salaries.iloc[i])['currency']=='RUR'] eur = [ast.literal_eval(salaries.iloc[i]) for i in range(len(salaries)) if ast.literal_eval(salaries.iloc[i])['currency']=='EUR'] usd = [ast.literal_eval(salaries.iloc[i]) for i in range(len(salaries)) if ast.literal_eval(salaries.iloc[i])['currency']=='USD']
Es stellte sich heraus, dass die Gehälter in Währungen aufgeteilt wurden. Sie können selbst versuchen, eine Analyse beispielsweise nur für den Euro durchzuführen. Ich werde mich jetzt nur mit Rubelgehältern befassen
fr = [x['from'] for x in rur] # lower range of salary fr = list(filter(lambda x: x is not None, fr)) # remove NA's from lower range [0, 100, 200,...] to = [x['to'] for x in rur] #upper range of salary to = list(filter(lambda x: x is not None, to)) #remove NA's from upper range [100, 200, 300,...] import numpy as np salary_range = list(zip(fr, to)) # concatenate upper and lower range [(0,100), (100, 200), (200, 300)...] av = map(np.mean, salary_range) # convert [(0,100), (100, 200), (200, 300)...] to [50, 150, 250,...] av = round(np.mean(list(av)),1) # average value from [50, 150, 250,...] print("average salary as Data Scientist ", av, "rubles")
Schließlich lernten wir erwartungsgemäß etwa 150.000 Rubel.
Für das Durchschnittsgehalt hatte ich folgende Bedingungen:
- hat offene Stellen nicht berücksichtigt, für die es kein bestimmtes Gehalt gibt (df.salary.dropna)
- nahm nur Gehälter in Rubel
- Wenn es einen Stopfen gab, wurde ein Durchschnittswert angenommen (z. B. ein Stopfen von 10.000 bis 20.000 Rubel → 15.000 Rubel).
Ich werde Trollen, schwachen Menschen und Amateuren Folgendes sagen, um nach einer geheimen Bedeutung zu suchen: Ich bin kein Angestellter von hh.ru; Dieser Artikel ist keine Werbung; Ich habe keinen Cent für sie bekommen. Viel Glück an alle.
Bonus
Wie ist der Juni im Bereich Data Science gefragt?

from collections import Counter vacancy_names = df.name # change here to change source of data/words etc cloud = Counter(vacancy_names) from wordcloud import WordCloud, STOPWORDS stopwords = set(STOPWORDS) cloud = '' for x in list(vacancy_names): cloud+=x+' ' wordcloud = WordCloud(width = 800, height = 800, stopwords = stopwords, min_font_size = 8,background_color='white' ).generate(cloud) import matplotlib.pylab as plt plt.figure(figsize = (16, 16)) plt.imshow(wordcloud) plt.savefig('vacancy_cloud.png')
[REPO] ( https://github.com/fuwiak/HH )
EDIT:
Zoldaten User Version
Parser hh
Der Code ist bis auf einige Krücken nicht urheberrechtlich geschützt.
# !/usr/bin/python3 # -*- coding: utf-8 -*- import sys import xlsxwriter # pip install XlsxWriter import requests # pip install requests from bs4 import BeautifulSoup as bs # pip install beautifulsoup4 headers = {'accept': '*/*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} vacancy = input(' : ') base_url = f'https://hh.ru/search/vacancy?area=1&search_period=30&text={vacancy}&page=' # area=1 - , search_period=3 - 30 pages = int(input(' - : ')) #+ jobs =[] def hh_parse(base_url, headers): zero = 0 while pages > zero: zero = str(zero) session = requests.Session() request = session.get(base_url + zero, headers = headers) if request.status_code == 200: soup = bs(request.content, 'html.parser') divs = soup.find_all('div', attrs = {'data-qa': 'vacancy-serp__vacancy'}) for div in divs: title = div.find('a', attrs = {'data-qa': 'vacancy-serp__vacancy-title'}).text compensation = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy-compensation'}) if compensation == None: # compensation = 'None' else: compensation = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy-compensation'}).text href = div.find('a', attrs = {'data-qa': 'vacancy-serp__vacancy-title'})['href'] try: company = div.find('a', attrs = {'data-qa': 'vacancy-serp__vacancy-employer'}).text except: company = 'None' text1 = div.find('div', attrs = {'data-qa': 'vacancy-serp__vacancy_snippet_responsibility'}).text text2 = div.find('div', attrs = {'data-qa': 'vacancy-serp__vacancy_snippet_requirement'}).text content = text1 + ' ' + text2 all_txt = [title, compensation, company, content, href] jobs.append(all_txt) zero = int(zero) zero += 1 else: print('error') # Excel workbook = xlsxwriter.Workbook('Vacancy.xlsx') worksheet = workbook.add_worksheet() # bold = workbook.add_format({'bold': 1}) bold.set_align('center') center_H_V = workbook.add_format() center_H_V.set_align('center') center_H_V.set_align('vcenter') center_V = workbook.add_format() center_V.set_align('vcenter') cell_wrap = workbook.add_format() cell_wrap.set_text_wrap() # worksheet.set_column(0, 0, 35) # A https://xlsxwriter.readthedocs.io/worksheet.html#set_column worksheet.set_column(1, 1, 20) # B worksheet.set_column(2, 2, 40) # C worksheet.set_column(3, 3, 135) # D worksheet.set_column(4, 4, 45) # E worksheet.write('A1', '', bold) worksheet.write('B1', '', bold) worksheet.write('C1', '', bold) worksheet.write('D1', '', bold) worksheet.write('E1', '', bold) row = 1 col = 0 for i in jobs: worksheet.write_string (row, col, i[0], center_V) worksheet.write_string (row, col + 1, i[1], center_H_V) worksheet.write_string (row, col + 2, i[2], center_H_V) worksheet.write_string (row, col + 3, i[3], cell_wrap) # worksheet.write_url (row, col + 4, i[4], center_H_V) worksheet.write_url (row, col + 4, i[4]) row += 1 print('OK') workbook.close() hh_parse(base_url, headers)