
क्या आप जानना चाहते हैं कि श्रम बाजार में क्या स्थिति है, खासकर डेटा साइंस के क्षेत्र में?
यदि आप पायथन और पंडों को जानते हैं, तो हेडहंटर पार्सिंग सबसे विश्वसनीय और आसान तरीकों से एक जैसा लगता है।
कोड Python3.6 और पंडों 0.24.2 पर काम करता है
Ipython को यहाँ डाउनलोड किया जा सकता है ।
पंडों (लिनक्स / मैकओएस) कंसोल के संस्करण की जांच करने के लिए:
ipython
और फिर कमांड लाइन पर
#ipython import pandas as pd pd.__version__
# () pip install pandas==0.24.2
पहले से ही सब कुछ कॉन्फ़िगर किया गया है? चलो चलते हैं!
अजगर में पारसीम
एचएच आपको रूस में काम खोजने की अनुमति देता है। इस भर्ती संसाधन में रिक्तियों का सबसे बड़ा डेटाबेस है। HH एक सुविधाजनक एपी साझा करता है।
थोड़ी गुगली की और एक पार्सर लिख दिया।
# 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)
परिणामस्वरूप, हमें job_title में निर्दिष्ट नाम के साथ एक csv फ़ाइल मिली।
वाक्यांश के साथ रिक्तियों के साथ निर्दिष्ट एक फ़ाइल में डाउनलोड किया जाएगा
"डेटा विश्लेषक" और "डेटा वैज्ञानिक।" यदि आप अलग से लाइन को बदलना चाहते हैं
job_title=['Data Analyst', 'Data Scientist']
फिर आपको इन नामों के साथ 2 फाइलें मिलती हैं।
दिलचस्प है, "और" के अलावा अन्य ऑपरेटर भी हैं। उनकी मदद से, आप सटीक मैचों की खोज कर सकते हैं। अधिक जानकारी यहाँ।
https://hh.ru/article/309400
समय क्या हुआ है? इसके पंडों का समय!
इस तरह से एकत्रित किए गए विज्ञापनों को समूहों में विभाजित किया जाएगा, जिसमें निहित जानकारी या उनके मेटाडेटा का विवरण होगा। उदाहरण के लिए: शहर; स्थिति; वेतन प्लग; नौकरी की श्रेणी। इस मामले में, एक एकल विज्ञापन कई श्रेणियों से संबंधित हो सकता है।
मैं जुपिटर-नोटबुक का उपयोग करके "डेटा वैज्ञानिक" स्थिति से संबंधित डेटा का ध्यान रखूंगा। https://jupyter.org/

कॉलम "नाम" को बदलने के लिए क्या करें?

सबसे महत्वपूर्ण सवाल - 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']
यह वेतन को मुद्राओं में विभाजित करने के लिए निकला, आप स्वयं केवल यूरो के लिए उदाहरण के लिए एक विश्लेषण करने की कोशिश कर सकते हैं। मैं अब केवल रूबल वेतन से निपटूंगा
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")
अंत में, हमने लगभग 150 हजार रूबल सीखे, जैसा कि अपेक्षित था ।
औसत वेतन के लिए, मेरी निम्नलिखित शर्तें थीं:
- रिक्त पदों पर विचार नहीं किया है जिसमें कोई निर्दिष्ट वेतन नहीं है (df.salary.dropna)
- रूबल में केवल वेतन लिया
- यदि कोई प्लग था, तो औसत मूल्य लिया (उदाहरण के लिए, 10,000 रगड़ से 20,000 रगड़ → 15,000 रगड़ से एक प्लग)।
मैं निम्नलिखित को ट्रोल, कमजोर दिमाग वाले लोगों और शौकीनों के लिए एक गुप्त अर्थ की तलाश के लिए कहूंगा: मैं hh.ru का कर्मचारी नहीं हूं; यह लेख एक विज्ञापन नहीं है; मुझे उसके लिए एक पैसा नहीं मिला। सभी को शुभकामनाएँ।
बोनस
डेटा साइंस क्षेत्र में मांग में जून कैसे है?

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 )
संपादित करें:
Zoldaten उपयोगकर्ता संस्करण
परसर हह
कुछ बैसाखियों को छोड़कर कोड कॉपीराइट नहीं है।
# !/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)