Análise do trabalho do HeadHunter


Uma vez, tornou-se interessante para mim, mas e se você tentar analisar as vagas e redigir algumas delas? Descubra quem é mais pago, quem é mais procurado e muito mais.


Como fonte de dados, usei o conhecido HeadHunter. Os trabalhos deste mês de maio foram coletados e processados. Apenas por um mês, porque a API não permite que você obtenha mais.


Coleta de dados


A API do HeadHunter possui excelente documentação, localizada no repositório . As solicitações devem ser feitas no domínio https://api.hh.ru/ com o User-Agent instalado, de preferência no formato _/_ (__) (algumas vezes outras versões do User-Agent , mas se o servidor não gostar de algo, ele retornará um erro )


A lógica da coleção é muito simples, então eu a implementei no bash usando cURL e jq . No entanto, quero compartilhar algumas nuances.


Paginação


Para procurar vagas por vários parâmetros, existe um ponto final GET /vacancies .


 curl -A 'irenica (https://irenica.com/)' 'https://api.hh.ru/vacancies' 

Os resultados da pesquisa serão divididos em páginas pelas quais o parâmetro per_page é responsável pelo tamanho (20 por padrão e 100 no máximo). Você pode selecionar uma página específica especificando o parâmetro da page (a numeração começa em 0).


As informações do campo de serviço de pages retornadas com vagas indicarão o número total de páginas do resultado.


Com isso, você pode facilmente iterar em todas as páginas:


 declare -ii=0 while true; do declare url="https://api.hh.ru/vacancies?per_page=100&page=$i" declare page="$(curl -A 'irenica (https://irenica.com/)' "$url")" #  $page ((i++)) declare -i totalCount=$(echo "$page" | jq '.pages') if ((i >= totalCount)); then break fi done 

Dados completos do trabalho


No entanto, os resultados da pesquisa contêm apenas parte dos dados do trabalho. Para obter tudo, é necessário fazer uma solicitação separada para o terminal do formulário GET /vacancies/id_ .


Os dados parciais do trabalho estão localizados no campo de items dos resultados da pesquisa. Primeiro, coletaremos deles o ID da vaga:


 declare vacanciesIds="$(echo "$page" | jq -r '.items[].id')" 

Em seguida, solicitamos informações completas sobre as respectivas vagas individualmente:


 for vacancyId in $vacanciesIds; do declare url="https://api.hh.ru/vacancies/$vacancyId" declare vacancy="$(curl -A 'irenica (https://irenica.com/)' "$url")" #  $vacancy done 

Ignorar limite de pesquisa


A API do HeadHunter possui um recurso - não importa quantos sejam encontrados, será retornado um máximo de 2000. Nesse caso, o número real encontrado também será retornado no campo found dos resultados da pesquisa. Graças a isso, você pode saber com certeza se recebeu todos os dados solicitados ou se há perdas.


Para contornar essa limitação, vim com o seguinte. Ao pesquisar, você pode especificar o período em que as vagas de interesse foram publicadas (através dos date_to date_from e date_to , que aceitam uma data no formato ISO 8601). Você pode fazer uma pequena diferença e classificar todos os resultados em partes: afinal, quanto menor o intervalo de tempo, menos vagas você consegue publicar para ele.


Vale ressaltar que as vagas publicadas apenas no último mês são devolvidas. Portanto, não faz mais sentido definir o intervalo.


Para iterar ao longo de períodos de tempo, o último é melhor representado como tempo do Unix:


 declare -i startTime=$(date -d '-1 month' +%s) declare -i endTime=$(date -d now +%s) while ((startTime <= endTime)); do declare -i intervalEnd=$((startTime + 60*60)) declare startTimeIso="$(date -d @$startTime +%FT%T)" declare intervalEndIso="$(date -d @$intervalEnd +%FT%T)" # ... declare url="https://api.hh.ru/vacancies?per_page=100&page=$i&date_from=$startTimeIso&date_to=$intervalEndIso" # ... startTime=$intervalEnd done 

Processamento Salarial


Para coletar estatísticas, foi necessário agrupar as vagas de acordo com determinados critérios. No bash, isso já era problemático, então eu usei o Python.


A lógica da coleção não é nada de especial - o acúmulo de dados em uma matriz associativa, a classificação e a saída em CSV. No entanto, novamente algumas nuances.


Garfo de salário


Note-se que o salário é apresentado na forma de dois números - o mínimo e o máximo, e qualquer um deles pode estar ausente.


Como para a análise era necessário ter um número, decidi usar a borda inferior e, somente se estiver ausente, a superior.


 salary = None if vacancy['salary']: if vacancy['salary']['to']: salary = vacancy['salary']['to'] if vacancy['salary']['from']: salary = vacancy['salary']['from'] 

Taxas de Câmbio


Os salários nas vagas podem ser indicados em diferentes moedas e podem ter taxas diferentes. A API do HeadHunter possui um terminal GET /dictionaries contém todos os valores predefinidos necessários. As taxas de câmbio são apresentadas no campo de currency . Por conveniência, seria melhor colocar a lista em uma matriz associativa, onde a chave é o código da letra da moeda:


 currencies = {} dictionaries = requests.get('https://api.hh.ru/dictionaries').json() for currency in dictionaries['currency']: currencies[currency['code']] = currency['rate'] 

Agora, durante o processamento, será fácil converter todos os salários em uma moeda:


 salary /= currencies[vacancy['salary']['currency']] 

Contabilidade de imposto de renda pessoal


Em algumas vagas, o salário é indicado antes do pagamento do imposto de renda pessoal, em algumas - depois. O campo gross fala sobre uma opção específica: é true no primeiro caso e false no segundo.


Decidi transferir todos os salários para a opção após impostos:


 if vacancy['salary']['gross']: salary -= salary * 0.13 

Análise de Resultados


E agora é hora de mostrar os números.


Trabalho remoto


Provavelmente, muitos dos que leram este post gostariam de trabalhar em um site remoto. Mas como você pode ver, o trabalho em casa em nosso país ainda não é muito citado. O salário é muito menor, o número de vagas é significativamente menor. E, portanto, havia menos opções para o candidato.


E isso é bastante estranho, porque em muitas profissões e muitas empresas (de acordo com as especificidades das tarefas) a presença de uma pessoa no escritório não é necessária. Mas este é um argumento eterno.


NomeMédia salarialSalário mínimoSalário máximoNúmero
Pessoal em casa11253610977130.00019
Tecnologia da informação, Internet, Telecomunicações552251000300.0002828
Alta gerência476879474100.00023
Extração de matéria-prima46579200009089880
Instalação e serviço4543911874696009
Serviço público, organizações sem fins lucrativos449112000090.00019
Equipe de trabalho4421894996786037.
Produção423882372100.000236
Construção, imobiliário3989670110000329
Transportes, Logística376629490100.000223


Candidatos a Deficientes


No entanto, há um número ainda menor de vagas - para pessoas com deficiência. E isso é completamente ilógico - mesmo que os empregadores não desejem ser removidos, mas entre os que estão prontos para isso, por que tão poucos que pensam em pessoas com deficiência? Se você não se importa com o que a pessoa está em três fusos horários, que diferença faz para você, ela é capaz, por exemplo, de andar?


Muitos de vocês podem estar familiarizados com pessoas com deficiência. Eu também, e me perguntei como seria difícil para eles encontrar um emprego e com o que poderiam contar.


NomeMédia salarialSalário mínimoSalário máximoNúmero
Serviço público, organizações sem fins lucrativos69675870090.0008
Alta gerência48705300008242515
Tecnologia da informação, Internet, Telecomunicações453214350200.0001050
Ciência, educação45056315890.000376
Compras4359115.00080.0009
Construção, imobiliário4214822250000210.
Produção4096910.000130500189
Contabilidade, contabilidade gerencial, finanças corporativas363872610113100125
Advogados343082610160.000131
Segurança334142290.000178


Alunos


Todos começamos com algo, nomeadamente com uma procura de emprego, sem qualquer experiência. Decidi avaliar a situação com posições abertas para esses candidatos.


O número de vagas é encorajador para um emprego rápido. E eu não sei o quão realista é obter o salário máximo, mas você pode até viver de uma forma média.


NomeMédia salarialSalário mínimoSalário máximoNúmero
Aconselhamento6260115002218502504
Construção, imobiliário55855209499896455
Alta gerência5082611310400.000111
Extração de matéria-prima381928000100.000328
Segurança346173954100.0005844
Medicina, Farmácia34475450200.00011776
Transportes, Logística33600500150.0008000
Ciência, educação3142611001245101660
Vendas304441350.00052566
Instalação e serviço30360826480.000381


Top geral


E agora o mais interessante: quem é pago mais? Classificou todas as vagas encontradas sem filtros.


Obviamente, essa é a alta gerência. Quem duvidaria disso.


Um fato curioso: se você prestar atenção ao salário médio em todas as tabelas, poderá ver que não é muito diferente.


NomeMédia salarialSalário mínimoSalário máximoNúmero
Alta gerência787891502.000.0002408
Extração de matéria-prima616998000180.0002302
Aconselhamento597971500500.0003762
Tecnologia da informação, Internet, Telecomunicações527772668480425900
Construção, imobiliário485872094998933229
Produção42007126100027269
Equipe de trabalho4120325200.00043079
Negócio de carro38555208242549269
Instalação e serviço3841225180.0002390
Compras3784650.2610002658


Mulher de limpeza


E aqui está a maneira mais fácil: por que estudar por 5 anos, se você pode apenas lavar o escritório? Abaixo está o resultado da filtragem das vagas superiores para a consulta "limpador *".


E se você entrar em vários escritórios e chegar à noite por algumas horas para limpar? Então você pode viver bastante luxuosamente. Vamos considerar isso um truque de vida.


NomeMédia salarialSalário mínimoSalário máximoNúmero
Alta gerência6300040.000870008
Marketing, publicidade, relações públicas50.00050.00050.0006
Extração de matéria-prima4500045000450003
Gestão de RH, treinamentos3324679088700058.
Contabilidade, contabilidade gerencial, finanças corporativas320003000035.00010
Segurança315072000070.0006
Vendas29696473755.000159
Construção, imobiliário2902441380.00073
Transportes, Logística24987109904500026
Negócio de carro2446571244500061


Cidades principais


Finalmente, decidi verificar o número de vagas abertas por cidade. Os primeiros lugares não são surpreendentes, mas existem posições curiosas e até inesperadas.


NomeNúmero
Moscovo31137
São Petersburgo11745
Minsk7608
Almaty4386
Kiev3398
Ekaterinburg3182
Novosibirsk3097
Kazan3066
Ufa2980
Nizhny Novgorod2876


Repositório


Todo o código do artigo, com aprimoramentos e instruções, está disponível no repositório .

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


All Articles