рдореБрдЦреНрдп рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреМрд╢рд▓

рд╣рдорд╛рд░реЗ рдЧрддрд┐рд╢реАрд▓ рд╕рдордп рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдПрдХ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдпрдо рд░рдЦрдиреЗ рдФрд░ рдирдП рдХреМрд╢рд▓ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВ рдкрд╛рдпрдерди рдореЗрдВ рд▓рдЧрднрдЧ рджреЛ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЕрдм рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рдирдП рдХреМрд╢рд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреМрд╢рд▓ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдереА рдХрд┐ рдХреМрд╢рд▓ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗ: рд╡рд┐рдХрд╛рд╕, рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рдЖрджрд┐ рдХрд╛ рдмреИрдХрдПрдВрдб рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдкрд╣рд▓реА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗред

рдЖрдВрдХрдбрд╝рд╛ рд╕рдВрдЧреНрд░рд╣рдг


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдерд╛ред : рдореИрдВ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ Habr рдХреИрд░рд┐рдпрд░ , Yandex рдХрд╛рд░реНрдп , HeadHunter рдФрд░ рдЕрдиреНрдпред рд╣реЗрдбрд╣рдВрдЯрд░ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рдореБрдЦ рдХреМрд╢рд▓ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдФрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдУрдкрди рдПрдкреАрдЖрдИ рд╣реИ ред

рд╣реЗрдбрд╣рдВрдЯрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХреАрд╡рд░реНрдб (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдЕрдЬрдЧрд░") рдХреЗ рд▓рд┐рдП рдиреМрдХрд░реА рдЖрдИрдбреА рдХреА рд╕реВрдЪреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЯреИрдЧ рдХреА рд╕реВрдЪреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ред

рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреГрд╖реНрда рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддрд┐ рдкреГрд╖реНрда рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 100 рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдкреГрд╖реНрда рдХреЗ рдЙрддреНрддрд░ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реНрдг рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗред

рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд░реЛрдз рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ" рдлрд╝реАрд▓реНрдб рдореЗрдВ, рдПрдкреАрдЖрдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд░реНрдЪреБрдЕрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддрд╛рдХрд┐ рдПрдЪрдПрдЪ рд╕рдордЭреЗ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣реА рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдереЛрдбрд╝реА рджреЗрд░реА рдХреА рддрд╛рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

ses = requests.Session()
ses.headers = {'HH-User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0"}

phrase_to_search = 'python'
url = f'https://api.hh.ru/vacancies?text={phrase_to_search}&per_page=100'
res = ses.get(url)

# getting a list of all pesponses
res_all = []
for p in range(res.json()['pages']):
    print(f'scraping page {p}')
    url_p = url + f'&page={p}'
    res = ses.get(url_p)
    res_all.append(res.json())
    time.sleep(0.2)

рдирддреАрдЬрддрди, рдореБрдЭреЗ рдЙрддреНрддрд░ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓реА, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрджрдХреЛрд╢ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдПрдХ рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд░реВрдк рдерд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, hh.ru рдПрдкреАрдЖрдИ рдЕрдзрд┐рдХрддрдо рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЛ рд╣рдЬрд╝рд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреА рдкреНрд░рддрд┐ рдкреГрд╖реНрда 100 рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдкреГрд╖реНрдареЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 20 рд╣реЛ рд╕рдХрддреА рд╣реИред рдкрд╛рдпрдерди рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП, 20 рд░рд┐рдХреНрддрд┐ рдкреГрд╖реНрда рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдФрд░ рддреЛ рдФрд░ред

рдЯреИрдЧ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд┐рдпрд╛:
  • рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ Iterated,
  • рдкреЗрдЬ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП Iterated рдФрд░ рдиреМрдХрд░реА рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХреА,
  • рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдХреНрддрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд┐рд╡рд░рдг,
  • рдпрджрд┐ рд░рд┐рдХреНрддрд┐ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЯреИрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЯреИрдЧ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реВрдЪреА рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

# parcing vacancies ids, getting vacancy page and scraping tags from each vacancy
tags_list = []
for page_res_json in res_all:
    for item in page_res_json['items']:
        vac_id = item['id']
        vac_res = ses.get(f'https://api.hh.ru/vacancies/{vac_id}')
        if len(vac_res.json()["key_skills"]) > 0:  # at least one skill present
            print(vac_id)
            tags = [v for v_dict in vac_res.json()["key_skills"] for _, v in v_dict.items()]
            print(' '.join(tags))
            tags_list.append(tags)
            print()
        time.sleep(0.1)

рдЯреИрдЧ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛

res = {'phrase': phrase_to_search, 'items_number': len(tags_list), 'items': tags_list}
with open(f'./data/raw-tags_{phrase_to_search}.json', 'w') as fp:  # Serializing
    json.dump(res, fp)

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ 2000 рд░рд┐рдХреНрдд рдкрджреЛрдВ рдореЗрдВ рд╕реЗ, рдХреЗрд╡рд▓ 1579 рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЯреИрдЧ рдереЗред

рдбреЗрдЯрд╛ рд╕реНрд╡рд░реВрдкрдг


рдЕрдм рдЖрдкрдХреЛ рдЯреИрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
  • рд╕рднреА рдЯреИрдЧ рдХреЛ рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓рд╛рдПрдБ, рдЗрд╕рд▓рд┐рдП "рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ", "рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ" рдФрд░ "рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ" рдХрд╛ рдорддрд▓рдм рдПрдХ рд╣реА рд╣реИ
  • рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреА рдШрдЯрдирд╛ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдб рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ,
  • рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХреА рд╕рдВрдпреБрдХреНрдд рдмреИрдардХ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред

рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдХрдо рдХрд░рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреА рдШрдЯрдирд╛ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛, рдиреЛрдб рдХреЗ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

tags_list['items'] = [[i.lower() for i in line] for line in tags_list['items']]

# counting words occurrences
flattened_list = [i for line in tags_list for i in line]
nodes_dict_all = {i: flattened_list.count(i) for i in set(flattened_list)}
nodes_dict = {k:v for k, v in nodes_dict_all.items() if v > del_nodes_count}

рдЬреЛрдбрд╝реАрджрд╛рд░ рдШрдЯрдирд╛ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЯрдкрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдбрд╝реЗ рдЯреИрдЧ рдереАрдВ, рдФрд░ рдорд╛рди рд╢реВрдиреНрдп рдереЗред рдлрд┐рд░ рдпрд╣ рдЯреИрдЧ рдХреА рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд╕рд╛рдордирд╛ рдХреА рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рдмрдврд╝рд╛ рджрд┐рдпрд╛ред рдлрд┐рд░ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд┐рдирдХреЗ рдореВрд▓реНрдп рд╢реВрдиреНрдп рдереЗред

# tags connection dict initialization
formatted_tags = {(tag1, tag2): 0 for tag1, tag2 in itertools.permutations(set(nodes_dict.keys()), 2)}

# count tags connection
for line in tags_list:
    for tag1, tag2 in itertools.permutations(line, 2):
        if (tag1, tag2) in formatted_tags.keys():
            formatted_tags[(tag1, tag2)] += 1

# filtering pairs with zero count
for k, v in formatted_tags.copy().items():
    if v == 0:
        del formatted_tags[k]

рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдореИрдВрдиреЗ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛

{
'phrase': phrase searched,
'items_number': number of vacancies parced, 
'items': {
 	"nodes": [
			{
			"id": tag name, 
		 	"group": group id, 
		 	"popularity": tag count
			},
		тАж 
		] 
	"links": [
			{
			"source": pair[0], 
			"target": pair[1], 
			"value": pair count
			},
		тАж
		]
	}
}

nodes = []
links = []
for pair, count in formatted_tags.items():
    links.append({"source": pair[0], "target": pair[1], "value": count})

max_count = max(list(nodes_dict.values()))
count_step = max_count // 7
for node, count in nodes_dict.items():
    nodes.append({"id": node, "group": count // count_step, "popularity": count})

data_to_dump = in_json.copy()
data_to_dump['items'] = {"nodes": nodes, "links": links}

рдкрд╛рдпрдерди рджреГрд╢реНрдп


рдЧреНрд░рд╛рдл рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдиреЗрдЯрд╡рд░реНрдХрдПрдХреНрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдиреЛрдбреНрд╕ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реБрдЖред



рдпрд╣ рджреГрд╢реНрдп рдПрдХ рдХреМрд╢рд▓ рдЧреНрд░рд╛рдл рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреЗрдЪреАрджрд╛ рдзрд╛рдЧреЗ рдХреА рдПрдХ рдЧреЗрдВрдж рдХреА рддрд░рд╣ рд╣реИред рдХрдиреЗрдХреНрд╢рди рдЙрд▓рдЭрди рдореЗрдВ рд╣реИрдВ рдФрд░ рдЧреНрд░рд╛рдл рдХреЛ рдЗрддрдиреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рднреЗрджрддреЗ рд╣реИрдВ рдХрд┐ рдиреЛрдбреНрд╕ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдиреЛрдб рд╣реИрдВ, рдХреБрдЫ рдЗрддрдиреЗ рдЫреЛрдЯреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдХреЛрдИ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдорд╣рддреНрд╡ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ 5 рд╕реЗ рдХрдо рдЖрдХрд╛рд░ рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдиреЛрдбреНрд╕ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛, рдФрд░ рдЧреНрд░реЗ рд▓рд┐рдВрдХ рднреА рдмрдирд╛рдПред рдЗрд╕ рддрд╕реНрд╡реАрд░ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдПрдХ рднреА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЛ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрд╡рд╣рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкрд╛рдпрдерди рдиреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред



рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдиреЛрдбреНрд╕ рдЕрд▓рдЧ рд╣реЛ рдЧрдП рд╣реИрдВ, рдФрд░ рд▓рд┐рдВрдХ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд░реЛрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВред рдмреБрдирд┐рдпрд╛рджреА рдХреМрд╢рд▓ рдХреЛ рджреЗрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рд╡реЗ рдЧреНрд░рд╛рдл рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдмрдбрд╝реА рдЧреЗрдВрджреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдЫреЛрдЯреЗ рдиреЛрдбреНрд╕ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдЧреНрд░рд╛рдл рдореЗрдВ рдЕрднреА рднреА рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рд╣реЛрдирд╛ рд╣реИред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреГрд╢реНрдп


рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕ рдХреЛрдб рдХреЛ рдЪреБрдирдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ рдпрджрд┐ рдЙрд╕ рд╕рдордп рдореБрдЭреЗ рднрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред рд╡рд╣ рдХрд╛рдо рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдерд╛ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЙрдбреНрдпреВрд▓ рдбреА 3 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕реБрдВрджрд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ ред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛ред


рдпрд╣рд╛рдВ рдЧрддрд┐рд╢реАрд▓ рджреГрд╢реНрдп рдЙрдкрд▓рдмреНрдз рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рдл рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЗрдВрдЯрд░рд╡реНрдпреВ рд╣реБрдЖ, рдФрд░ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рддреБрд░рдВрдд рдХрдИ рдмрдбрд╝реЗ рдиреЛрдбреНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдВрдЧ рдореЗрдВ рд╣реИрдВ: рд▓рд┐рдирдХреНрд╕, рдПрд╕рдХреНрдпреВрдПрд▓, рдЧрд┐рдЯ, рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрд▓ рдФрд░ рдбреАрдЬреЗрдВрдЧреЛред рдордзреНрдпрдо рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдХреМрд╢рд▓ рдФрд░ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рдХреМрд╢рд▓ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрд╢рд▓ рдЕрднреА рднреА рдкреЗрд╢реЗ рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЗрдВрджреНрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ:

  • рдиреАрдЪреЗ рдмрд╛рдПрдБ - рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг,
  • рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИрдВ,
  • рдиреАрдЪреЗ рджрд╛рдИрдВ рдУрд░ - рд╕рд╛рдордиреЗ рдХрд╛ рдЕрдВрдд рд╡рд┐рдХрд╛рд╕,
  • рджрд╛рдИрдВ рдУрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реИ,
  • рд╢реАрд░реНрд╖ рджрд╛рдИрдВ рдУрд░ - рд╡реЗрдм рд╡рд┐рдХрд╛рд╕,
  • рд╢реАрд░реНрд╖ рдмрд╛рдПрдБ - рдорд╢реАрди рд╕реАрдЦрдирд╛ред

рдЧреБрдЪреНрдЫреЛрдВ рдХрд╛ рдпрд╣ рд╡рд┐рд╡рд░рдг рдореЗрд░реЗ рдЬреНрдЮрд╛рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╣реА, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
  • рдЖрдкрдХреЛ рдорд╛рд╕реНрдЯрд░ рдХреМрд╢рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмрдбрд╝реЗ рдиреЛрдбреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рд╡реЗ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ,
  • рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд┐рддреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдХреМрд╢рд▓ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЖрдк рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рднрд╛рдЧ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ: GitHub рдкреНрд░реЛрдЬреЗрдХреНрдЯ , рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд╛рд▓рд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд▓реИрдкрдЯреЙрдк

рдирдП рдХреНрд╖рд┐рддрд┐рдЬ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓рддрд╛!

All Articles