Usando o Python para analisar habilidades relacionadas relacionadas entre desenvolvedores


Hoje na Web, você pode encontrar uma enorme quantidade de informações heterogêneas sobre as linguagens de programação, bibliotecas, estruturas, sistemas operacionais e outras entidades mais populares - vamos chamá-las de tecnologias. O número dessas tecnologias está em constante crescimento e fica claro que todos que desejam seguir o caminho de um desenvolvedor precisam se concentrar em estudar algumas das pilhas mais populares associadas a qualquer tecnologia importante.


Isso levanta a primeira pergunta - como determinar a demanda por uma tecnologia específica? Esta pergunta pode ser respondida, por exemplo, da seguinte forma: há uma demanda por tecnologia quando os empregadores a mencionam como requisito para um candidato ao descrever uma tarefa. Em outras palavras, se ao visualizar 100 vagas, a tecnologia A foi mencionada 60 vezes e a tecnologia B - 20 vezes, a tecnologia A pode ser considerada mais popular que B.


A segunda pergunta é o que são consideradas as principais tecnologias?


Com base no grande interesse em artigos sobre a análise da popularidade das linguagens de programação, consideraremos a linguagem de programação como a principal tecnologia.


Assim, o problema pode ser formulado da seguinte maneira - em várias vagas, é necessário destacar um subconjunto associado à tecnologia-chave e, nesse subconjunto, calcular a frequência de menção de outras tecnologias.


Como banco de dados de vagas, usaremos o portal hh.ru , devido à sua grande popularidade e à disponibilidade da API do HeadHunter . A linguagem de programação é Python 3.4.


Para reduzir o volume do artigo, o lado técnico da questão da obtenção e processamento de dados não será considerado em detalhes, mas vale a pena parar em alguns pontos-chave. O código fonte do projeto está aberto e disponível no GitHub .



Obter uma lista de empregos


Para obter uma lista de vagas relacionadas aos programadores Python, faça o seguinte pedido de obtenção usando a biblioteca de pedidos :


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) 

Como resultado, obtemos um dicionário com os seguintes elementos:


  • página: classe 'int'
  • clusters: classe 'NoneType'
  • per_page: classe 'int'
  • alternate_url: classe 'str'
  • encontrado: classe 'int'
  • argumentos: classe 'NoneType'
  • items: class 'list'
  • páginas: classe 'int'

Estamos interessados ​​em:


  • páginas-chave, cujo valor contém o número de páginas com vagas,
  • a chave de itens, que aponta para a lista de vagas na página.

De cada item da lista de itens , que é um dicionário, precisamos da chave de URL . O valor dessa chave é um link para uma descrição detalhada da vaga. Alterando sequencialmente o parâmetro da página , é possível iterar todas as vagas, mediante solicitação, e criar uma lista necessária para análises adicionais de links. Para acelerar o processo de carregamento de informações da tarefa, são utilizados vários encadeamentos paralelos da biblioteca de encadeamento:


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

Depois de criar a dependência da velocidade de download do conjunto de testes de 274 vagas em relação ao número de threads de download, decidiu-se usar 10 threads, pois, nesse caso, um número maior deles praticamente não reduz o tempo de execução do script.



Criação de um vocabulário de habilidades e busca de habilidades na descrição do trabalho


Inicialmente, deveria criar um dicionário de habilidades-chave manualmente. No entanto, depois de analisar a estrutura da descrição do trabalho, ficou claro que o processo pode ser automatizado de várias maneiras. Para fazer isso, precisamos de uma lista acessível por key_skills, contendo as principais habilidades dessa vaga. Infelizmente, poucas vagas contêm informações sobre as principais habilidades. Além disso, essas informações podem diferir da descrição principal. Portanto, processar apenas esses dados não forneceria uma imagem completa.


Todas as habilidades-chave exclusivas para vagas com os nomes "Programador" + ("Java", "JavaScript", "1C", "Python", "C", "C ++", "C #", "Objective-C", "Perl", "Ruby", "PHP") e usados ​​- os primeiros 150 mais comuns.


 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) 

A pesquisa de palavras-chave nas descrições de cargo foi realizada usando uma expressão regular do formulário:


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

Como algumas tecnologias são uma generalização de várias outras privadas, ao calcular pela chave sql , por exemplo, um valor do formulário foi usado:


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

Além disso, para levar em consideração vários nomes relacionados à mesma tecnologia, foram utilizadas expressões do formulário:


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

O arquivo final de palavras-chave pode ser encontrado no repositório GitHub .


Ao escolher as principais tecnologias, uma lista dos 20 principais idiomas foi usada pelo número de vagas (mencionadas no título) . Ao mesmo tempo, restam apenas esses idiomas que, juntamente com a palavra "Programador" no título, dão mais de 20 vagas em São Petersburgo.



Resultados


O resultado do processamento de um conceito abstrato como “programador” reflete bem o quadro geral de vagas no setor. Em primeiro lugar, é claro que todo segundo empregador deseja obter conhecimento de sql e inglês de um programador. Todo terceiro empregador deseja que um programador possua um sistema de controle de versão git . Devido à orientação do desenvolvimento na web, html e css são as tecnologias exigidas. Isso é especialmente importante para JavaScript e PHP . Um tanto inesperadamente, mas o programador provavelmente terá que trabalhar em equipe .


Entre as tecnologias comuns incluídas no vigésimo primeiro, há programação orientada a objetos , bancos de dados , algoritmos e padrões de design .


Como sistema operacional, o Linux deve ser preferido.


Ao considerar idiomas específicos, você pode ver que ao lado da primeira linha está a estrutura ou biblioteca mais popular. Para Java, estes são Spring e Hibernate , para C # - .net e asp.net , o programador Python provavelmente precisará do Django e o JavaScript precisará do React .

Especial e o menos exigente é o complexo doméstico 1C . Muitos empregadores terão apenas conhecimento suficiente dessa plataforma (não tenho idéia de quanto ou de pouco). As habilidades úteis serão: trabalho em equipe , compreensão dos processos de teste e capacidade de trabalhar com bancos de dados .


Devido às peculiaridades do mecanismo de busca hh, a pedido do “Programador C” foram emitidos muitos resultados com a tecnologia 1C. Portanto, os resultados nesse idioma acabaram incorretos.


Os resultados obtidos em São Petersburgo, abaixo.









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


All Articles