Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Парсинг hh.ru на Python.

Андрей Гурин Ученик (105), открыт 1 неделю назад
Пишу код для парсинга вакансий hh.ru . Нужно вывести названия вакансий и требования с одной страницы. Проблема в том, что код выдает не тот результат, который нужен: выдает либо две вакансии, либо вакансии, которых нет на странице. То же самое с требованиями: выдает почему-то названия организаций.
В строку 'class': вводил код, который отвечает именно за эти элементы (названия вакансий и требования), но программа его как будто не видит и выдает ошибку. Проблема сложная, если кто-то разбирается в парсинге, прошу помочь.
Код написан в двух файлах: main.py и headhunter.py.
 #main.py
from headhunter import extract_max_page, extract_hh_jobs

max_page = extract_max_page()
extract_hh_jobs(max_page)

 #headhunter.py
import requests
from bs4 import BeautifulSoup

ITEMS = 100
URL = f'https://hh.ru/search/vacancy?text=python&items_on_page={ITEMS}'

headers = {
'Host': 'hh.ru',
'User-Agent': 'Safari',
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive'
}

def extract_max_page():
hh_request = requests.get(URL, headers=headers)
hh_soup = BeautifulSoup(hh_request.text, 'html.parser')

pages = []

paginator = hh_soup.find_all("span", {'class': 'pager-item-not-in-short-range'})

for page in paginator:
pages.append(int(page.find('a').text))

return pages[-1]

def extract_hh_jobs(last_page):
jobs = []
#for page in range(last_page):
result = requests.get(f'{URL}&page=0', headers=headers)
print(result.status_code)
soup = BeautifulSoup(result.text, 'html.parser')
results = soup.find_all('div', {'class': 'vacancy-serp-item-body__main-info'})
for result in results:
title = result.find('a').text
skills = result.find('div', {'class': 'g-user-content'}).find('a').text
print(skills)

return jobs
1 ответ
Chudo_Chudnoe Мастер (1585) 1 неделю назад
Андрей, ты прав, твоя задача не самая простая.

Можешь использовать мою конструкцию для правки своей, возможно, тебе это как-то поможет)


 import requests 
from bs4 import BeautifulSoup

headers = {
'Host': 'hh.ru',
'User-Agent': 'Safari',
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive'
}

def parse_page(page_number, items_per_page):
url = f"https://hh.ru/search/vacancy?text=python&items_on_page={items_per_page}&page={page_number}"
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

vacancies = []
# Поиск элементов по классу, содержащему информацию о вакансиях
vacancy_items = soup.find_all('div', class_='serp-item serp-item_link vacancy-serp-item_clickme')
for item in vacancy_items:
title = item.find('span', class_='serp-item__title-link serp-item__title')
company = item.find('div', class_='vacancy-serp-item__meta-info-company')
experience = item.find('div', class_='bloko-h-spacing-container bloko-h-spacing-container_base-0')
compensation = item.find('span', class_='vacancy-serp__vacancy-compensation')
apply_link = item.find('a', class_='bloko-button bloko-button_kind-success bloko-button_scale-small')

vacancies.append({
'title': title.get_text(strip=True) if title else None,
'company': company.get_text(strip=True) if company else None,
'experience': experience.get_text(strip=True) if experience else None,
'compensation': compensation.get_text(strip=True) if compensation else None,
'apply_link': apply_link['href'] if apply_link else None
})

return vacancies

# Собираем данные со страниц от 1 до 20
all_vacancies = []
for page in range(1, 21):
all_vacancies.extend(parse_page(page, 20))

for vacancy in all_vacancies:
print(vacancy)
Starman StarУченик (28) 1 неделю назад
Спасибо
Похожие вопросы