Analisamos o currículo de advogados em hh.ru sem api

Hh.ru é um bom site que não precisa de envio adicional. Procurar vagas nele é conveniente e prosaico. No entanto, às vezes é mais interessante ver do empregador:

  • Como é um currículo em uma solicitação direcionada?
  • como você pode ver seu currículo na emissão
  • Como um currículo "afunda" com o tempo, também é necessário coletar um resumo de colegas advogados para criar mini-estatísticas.

Apesar do hh ter sua própria API e estar bem documentado, o acesso a ela é cuidadosamente protegido.

O acesso à API é realizado como na situação de muitas APIs sociais. redes - por meio do registro preliminar do aplicativo na conta da web da conta, neste caso, o empregador em hh.ru/employer :



Para chegar lá, você precisa se registrar como empregador, confirmar as informações sobre a afiliação da organização (eles ligam para você) e seguir o link: dev.hh.ru
No entanto, neste estágio, o trabalho com a API ainda não está totalmente disponível, pois o aplicativo para registrar o aplicativo no hh .ru pode ser considerado até 20 dias úteis . Longo.

Portanto, trabalharemos sem API, usando os recursos do python e da estrutura do selênio.

No selênio, alimentamos a solicitação de URL em nome do empregador, na qual haverá as seguintes posições:

  • Palavras-chave: advogado;
  • Área profissional: Qualquer;
  • Região: Moscou,
  • Salário: Não mostre currículo sem salário;
  • Educação: Não importa;
  • Cidadania: Qualquer;
  • Permissão de Trabalho: Qualquer;
  • Idade e foto: Somente com foto;
  • Gênero: não importa;
  • Classificar: por data de modificação;
  • Saída: por um mês;
  • Mostrar na página: 100 currículos.

Apesar do fato de haver muitos resultados, apenas 5.000 currículos estarão disponíveis. Restrição para um empregador que trabalha livremente.

No código, isso é:

Importar módulos e entrar no site
from selenium import webdriver
import time,csv
browser = webdriver.Firefox()
time.sleep (5) #   -  
browser.get ('https://hh.ru/employer')
time.sleep (5)


Autorização no site
a = browser.find_element_by_css_selector('.bloko-icon_cancel')
a.click()
time.sleep (2)
a=browser.find_element_by_css_selector('div.supernova-navi-item:nth-child(6) > a:nth-child(1)')
a.click()
time.sleep (3)    
emailElem = browser.find_element_by_css_selector('.HH-AuthForm-Login')
emailElem.click()
time.sleep (1)
emailElem.send_keys('example@yandex.ru')    
time.sleep (1)
passElem = browser.find_element_by_css_selector('.HH-AuthForm-Password')
passElem.click()
time.sleep (1)
passElem.send_keys('password')
passElem.submit()
time.sleep (3)


example@yandex.ru e senha - substitua pelo e-mail do empregador, senha - pela senha.

Bloco de gravação CSV
def write_csv(data):
    with open('hh.csv','a',encoding='utf8') as f:
        writer=csv.writer(f)
        writer.writerow((data['name'],
                         data['age'],
                         data['salary'],                         
                         data['stag'],
                         #data['post_job_place'],
                         data['resume_link'],
                         data['photo_big']
                         #data['job_places'],
                         #data['education'],
                         #data['address'],
                         #data['update']
                         )) 


Bloco de análise
def resume_get():    
    # 
    a=browser.find_elements_by_class_name('resume-search-item__content-wrapper') # 100 
    #len(a)
    #resume-search-item__description-content -  
    for i in a:
        b=i.find_element_by_class_name('resume-search-item__header')
        name=b.find_element_by_class_name('resume-search-item__name').text # 
        age=b.find_element_by_class_name('resume-search-item__fullname').text # 52 
        salary=b.find_element_by_class_name('resume-search-item__compensation').text # 40000 .
        stag=i.find_elements_by_class_name('resume-search-item__description-content')[0].text # '7   8 '
        resume_link=i.find_element_by_class_name('resume-search-item__name').get_attribute('href') #  
        #post_job_place=i.find_elements_by_class_name('resume-search-item__description-content')[1].text #.  
        #job_places=b.find_elements_by_class_name('resume-search-item__description-content')[1:3] # 
        #education=i.find_elements_by_class_name('resume-search-item__description-content')[-1].text # 
        #photo_small=browser.find_element_by_class_name('resume-userpic').find_element_by_class_name('resume-userpic__photo').get_attribute('src') #   
        try:
            photo_big=i.find_element_by_class_name('bloko-modal-content').find_element_by_tag_name('img').get_attribute('src') #  -
        except:
            photo_big=''

     
        #update=i.find_element_by_class_name('output__addition').text #  
        data={    'name':name,
                  'age':age,
                  'salary':salary,
                  'stag':stag,                  
                  #'post_job_place':post_job_place,
                  'resume_link':resume_link,
                  'photo_big':photo_big
                  #'job_places':job_places,
                  #'education':education,
                  #'address':address,
                  #'update':update
                  }
        #print(data)
        write_csv(data)


Iteração de paginação de 50 páginas com currículo
resume_get()
x=0

while x!=50:
    browser.get (url+'&page='+str(x+1))
    time.sleep(7)
    resume_get()
    x+=1


* fragmentos comentados para quem deseja adicionar informações à seleção.

Após elaborar o programa e carregar os resultados no excel, obtemos a tabela:



Como encontrar seu currículo? A maneira mais fácil é filtrar a idade dos candidatos.

Como olhar para onde o resumo apareceu após o n-ésimo período de tempo? Dirija o programa pela enésima quantidade de tempo e encontre-se novamente. A posição em que o currículo caiu no gráfico será a posição no problema, pois o programa coleta todos os currículos sequencialmente, mediante solicitação.

Finalmente, um pequeno gráfico estatístico sobre o currículo dos advogados, "Moscovitas" (resumo de 2000).





ps. Retomar sem atualizar o site afunda para 2000 posições por dia, a pedido de "Corporate + advogado".

Programa - faça o download da
planilha do Excel -baixar

All Articles