Доброго времени друзья, по мере изучения языка 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'],['Астана']
Комментариев нет:
Отправить комментарий