YandexDirect

24 января 2019

Python. Снова парсим, на этот раз под раздачу попал сайт hh.kz

Доброго времени друзья, по мере изучения языка Python, приходит интерес к парсингу сайтов, применяются новые библиотеки. На этот раз решил попробовать спарсить список компаний с сайта hh.kz вместе с вакансиями. Что меня интересует, так это весь список компаний с описанием, а также заходим по каждой ссылке и смотрим открытые вакансии компании.





Эта информация доступна без регистрации. Во время парсинга столкнулся с проблемой, hh защищен от парсингов по useragent, при отправке useragent python, выдает ошибку 404. Я решил использовать пакет fake_useragent , функция UserAgent().chrome возвращает нормальный "человеческий" useragent. Во время подсчета количества страниц столкнулся с проблемой, дело в том, что пагинатор
при считывании почему то склеивал последнюю страницу и надпись дальше, получалось 50дальше, воспользовался библиотекой re - reqular expression.

Весь код привожу ниже:

import requests
import re
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import csv


# функция для получения html
def get_html(url, useragent=None, proxy=None):
    r = requests.get(url, headers={'User-Agent': UserAgent().chrome}, proxies=proxy)
    return r.text

# функция для записи csv файла 
def write_csv(data):
    with open('hh.csv', 'a', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow((data['company_name'],
                         data['description'],
                         data['name_vacancy'],
                         data['vacancy_link'],
                         data['pay'],
                         data['city']))


# получить все ссылки на странице
def get_all_hrefs(html):
    url = get_html(html)
    soup = BeautifulSoup(url, 'lxml')
    table = soup.find('table', class_='l')
    item_count = table.find_all('div', attrs={'style':'padding: 4px 0;'})
    # print (item_count)
    all_hrefs = []
    for i in range(len(item_count)):
        all_hrefs.append('https://hh.kz' + item_count[i].find_next('a').get('href'))
    return all_hrefs

# получаем данные со страницы компании
def get_html_data(html):
    url = get_html(html)
    soup = BeautifulSoup(url, 'lxml')
    try:
        company_name = soup.find('div', class_='company-description').find('div', class_='company-description__name').text
        print (company_name)
        print('-----------------------------------------')
    except:
        company_name = ''
    try:
        company_descr = soup.find('div', class_='g-user-content').text.strip()
        print(company_descr)
        print('-----------------------------------------')
    except:
        company_descr =''
    try:
        trs = soup.find('div', class_='b-employer-vacancy-indent').find('table').find_all('tr')
    except:
        trs = 0

    # vacancies = []
    # if trs==1:
    #     vacancies.append(soup.find('div', class_='b-employer-vacancy-indent').find('table').find_all('tr')[0].text.strip())
    # else:
    #     for i in range(1, len(trs)):
    #         vacancies.append(soup.find('div', class_='b-employer-vacancy-indent').find('table').find_all('tr')[i].text.strip())

    vac_name = []
    vac_href = []
    pay = []
    city = []
    if trs == 0:
        vac_name = ''
        vac_href = ''
        pay = ''
        city = ''
    else:
        for i in range(0,len(trs)):
            vac_name.append(trs[i].find('div', class_='resume-search-item__name').text)
            vac_href.append(trs[i].find('div', class_='resume-search-item__name').find('a').get('href'))
            pay.append(trs[i].find('div', class_='b-vacancy-list-salary').text)
            city.append(trs[i].find('div', class_='b-vacancy-list-address').text)

    print(vac_name)
    print(vac_href)
    print(pay)
    print(city)
    print('-----------------------------------------')
    data = {'company_name': company_name,
            'description' : company_descr,
            'name_vacancy': vac_name,
            'vacancy_link': vac_href,
            'pay': pay,
            'city': city}

    write_csv(data)




def main():
    url = 'https://hh.kz/employers_list?areaId=40'
    proxy = None
    print(len(get_all_hrefs(url)))

    for i in range(1, len(get_all_hrefs(url))):

        get_html_data(get_all_hrefs(url)[i])


#блок main
if __name__ == '__main__':
    main()

На выходе получается csv файл следующего содержания:

ТОО Alpha-bet ,"В Казахстане оператором бренда «Букмекерская контора ”Олимп”» является TОО ”Alpha-Bet”, обладающая лицензией №389 на осуществление деятельности в сфере игорного бизнеса, выданной Министерством культуры и спорта Республики Казахстан.""  Букмекерская контора ""Олимп"" является крупным игроком на мировом рынке букмекерских услуг и безусловным лидером на территории Казахстана, где компания была основана в 2004 году. Бренд «Олимп» стремительно расширяет свою международную географию, успешно осуществляя деятельность в разных странах и континентах. Собственные технологии и большой профессиональный штат аналитиков позволяют сделать продукт для спортивных ставок уникальным. Имея широкую сеть глобальных партнеров, Олимп всегда предоставляет своим клиентам только новейшие, интересные и увлекательные решения в сфере букмекерского бизнеса. Высококачественная служба поддержки доступна в любое время и способна оказать скорейшую реальную помощь.","['Аналитик', 'Оператор call-центра', 'Трейдер']","['https://almaty.hh.kz/vacancy/29502071', 'https://almaty.hh.kz/vacancy/29801474', 'https://almaty.hh.kz/vacancy/29501659']","['от 180\xa0000 до 270\xa0000 KZT', 'от 140\xa0000 до 200\xa0000 KZT', 'от 130\xa0000 KZT']","['Алматы', 'Алматы', 'Алматы']"

ТОО Alpha-bet ,"В Казахстане оператором бренда «Букмекерская контора ”Олимп”» является TОО ”Alpha-Bet”, обладающая лицензией №389 на осуществление деятельности в сфере игорного бизнеса, выданной Министерством культуры и спорта Республики Казахстан.""  Букмекерская контора ""Олимп"" является крупным игроком на мировом рынке букмекерских услуг и безусловным лидером на территории Казахстана, где компания была основана в 2004 году. Бренд «Олимп» стремительно расширяет свою международную географию, успешно осуществляя деятельность в разных странах и континентах. Собственные технологии и большой профессиональный штат аналитиков позволяют сделать продукт для спортивных ставок уникальным. Имея широкую сеть глобальных партнеров, Олимп всегда предоставляет своим клиентам только новейшие, интересные и увлекательные решения в сфере букмекерского бизнеса. Высококачественная служба поддержки доступна в любое время и способна оказать скорейшую реальную помощь.","['Аналитик', 'Оператор call-центра', 'Трейдер']","['https://almaty.hh.kz/vacancy/29502071', 'https://almaty.hh.kz/vacancy/29801474', 'https://almaty.hh.kz/vacancy/29501659']","['от 180\xa0000 до 270\xa0000 KZT', 'от 140\xa0000 до 200\xa0000 KZT', 'от 130\xa0000 KZT']","['Алматы', 'Алматы', 'Алматы']"

ТОО Alliance Asia Group ,Туристическая компания.,['Менеджер по туризму'],['https://almaty.hh.kz/vacancy/29730467'],['от 75\xa0000 до 150\xa0000 KZT'],['Шымкент']

ТОО Alliance Elite + ,"Компания является казахстанским туроператором, работаем на рынке Казахстана более 7 лет. Наша компания занимается инновционной системой бронирования, позволяющей значительно экономить средства при поездках за рубеж.  Мы стремимся к продолжению роста и поддержанию нашего лидерства в индустрии туризма. Используя новейшие технологии и методы обслуживания, мы предлагаем членам клуба доступ к невероятным скидкам в путешествия, досуг и индустрии развлечений.","['Менеджер по туризму', 'Оператор call-центра']","['https://almaty.hh.kz/vacancy/29800383', 'https://almaty.hh.kz/vacancy/29800453']","['от 150\xa0000 до 300\xa0000 KZT', 'от 80\xa0000 до 250\xa0000 KZT']","['Алматы', 'Алматы']"

ТОО Alliance Eurasienne ,"Группа компаний занимающая инвестированием и продвижением казахстанских IT, fin tech проектов.
",['Менеджер-консультант'],['https://almaty.hh.kz/vacancy/29460032'],['до 120\xa0000 KZT'],['Астана']


Комментариев нет:

Отправить комментарий

Общее·количество·просмотров·страницы