Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3583393
А
Аноним
11 марта 2026 12:00 · публичный вопрос
А
Аноним

напиши код вакансии самой последней на сайте kadrout

Ответ нейросети
11 марта 2026 12:00

Задача понятна: написать код, который возвращает информацию о самой последней вакансии на сайте kadrout (то есть последняя по дате размещения). Ниже — подробное решение с пояснениями и рабочим примером кода на Python. Учти, что структура страницы может меняться, поэтому код рассчитан на адаптацию под реально изучаемый HTML.

Важно: перед скрапингом проверь robots.txt у сайта и правила использования данных. Также желательно добавлять задержки между запросами и уважать ограничение частоты запросов.

Часть 1. Общее объяснение подхода

  • Мы загружаем страницу с вакансиями (страница с последними объявлениями).
  • Парсим HTML и ищем первый элемент-карточку вакансии, которая обычно имеет классы, содержащие слова vacancy, job, card и т.д.
  • Из найденного элемента извлекаем:
    • title (название вакансии)
    • link (ссылка на полное объявление)
    • company (компания)
    • location (местоположение)
    • date_posted (дата размещения, если есть)
  • Если структура страницы отличается, код подцепит данные с других селекторов и подскажет, какие селекторы подставить.

Часть 2. Пример кода (Python, requests + BeautifulSoup)

  • Требуются библиотеки: requests, beautifulsoup4
  • Установка: pip install requests beautifulsoup4

Сохранение: ниже приведён единый скрипт. Он ищет наиболее вероятные CSS-селекторы карточки вакансии и полей, и возвращает словарь с данными. Если какой-то элемент найти не удалось — он будет None.

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def fetch_latest_vacancy(base_url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
    }

    resp = requests.get(base_url, headers=headers, timeout=20)
    resp.raise_for_status()

    soup = BeautifulSoup(resp.text, 'html.parser')

    # Попытки найти карточку вакансии по нескольким распространённым селекторам
    selectors = [
        '.vacancy-card',        # common
        '.job-card',              # common
        '.job-item',              # common
        '.vacancy',               # common
        'article.job',            # common структура
        'div[id^="vacancy"]',     # динамические id
        'div[class*="vacancy-card"]',
        'li[class*="vacancy"]',
        'div[class*="job-card"]',
        'section[class*="vacancy"]',
    ]

    latest_el = None
    for sel in selectors:
        el = soup.select_one(sel)
        if el:
            latest_el = el
            break

    # Если не нашли карточку — fallback к первой ссылке на странице
    if latest_el is None:
        a = soup.find('a')
        if a:
            title = a.get_text(strip=True)
            link = urljoin(base_url, a.get('href'))
            return {
                'title': title,
                'link': link,
                'company': None,
                'location': None,
                'date_posted': None
            }
        return None

    # Из самой карточки извлекаем данные
    def get_text(parent, selectors):
        for s in selectors:
            el = parent.select_one(s)
            if el and el.get_text(strip=True):
                return el.get_text(strip=True)
        return None

    # Заголовок и ссылка (возьмём первый <a> внутри карточки, если он есть)
    title_tag = latest_el.select_one('a') or latest_el.find(['h1','h2','h3','span','div'])
    title = title_tag.get_text(strip=True) if title_tag else None
    link = None
    if title_tag and title_tag.name == 'a' and title_tag.get('href'):
        link = urljoin(base_url, title_tag['href'])
    else:
        # попытка найти любую ссылку внутри карточки
        a = latest_el.find('a')
        if a and a.get('href'):
            link = urljoin(base_url, a['href'])

    company = get_text(latest_el, [
        '.company', '.employer', '.organization', '.brand',
        'span.company', 'div.company'
    ])

    location = get_text(latest_el, [
        '.location', '.city', '.region', '.place',
        'span.location', 'div.location'
    ])

    date_posted = get_text(latest_el, [
        '.date', '.posted', '.time', 'time'
    ])

    return {
        'title': title,
        'link': link,
        'company': company,
        'location': location,
        'date_posted': date_posted
    }

if __name__ == '__main__':
    # Замените на фактическую страницу вакансий kadroout
    url = 'https://kadrout.ru/vacancies'  # пример; укажите реальный адрес страницы вакансий
    result = fetch_latest_vacancy(url)
    print(result)

Как адаптировать под конкретный сайт kadroout

  • Откройте страницу вакансий в браузере.
  • Правой кнопкой по карточке вакансии -> "Inspect" (Инспектор).
  • Посмотрите структуру HTML: какие классы у карточки вакансии (например, идущие в селекторах .vacancy-card, .job-card и т.д.), какие элементы содержат title, company, location, date.
  • Подставьте реальные селекторы в массив selectors. Можно временно распечатать весь HTML и найти нужные элементы, чтобы подобрать точные селекторы.

Часть 3. Альтернатива: динамическая загрузка контента (JS) Если страница подгружает данные ваканси через JavaScript и HTML не содержит карточек сразу после загрузки, используйте Selenium (или Playwright) чтобы рендерить страницу и потом парсить готовый HTML.

Пример с Selenium (headless Chrome):

  • Требуется: selenium, chromedriver (или geckodriver). Установка: pip install selenium
  • Убедитесь, что версия драйвера совместима с вашей версией Chrome.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
from urllib.parse import urljoin

def fetch_latest_vacancy_js(url):
    options = Options()
    options.add_argument("--headless")
    options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=options)
    try:
        driver.get(url)
        time.sleep(3)  # подождать загрузку JS
        html = driver.page_source
    finally:
        driver.quit()

    soup = BeautifulSoup(html, 'html.parser')
    # используйте те же селекторы, что и в статическом примере
    # ...
    # здесь можно повторить логику из fetch_latest_vacancy на полученном soup
    return None  # заменить на реальную обработку

if __name__ == '__main__':
    url = 'https://kadrout.ru/vacancies'
    print(fetch_latest_vacancy_js(url))

Часть 4. Что нужно изменить под твой случай

  • Замени URL в коде на фактическую страницу вакансий на kadrou t.
  • Обнови список selectors под конкретную версию HTML данного сайта.
  • При отсутствии даты размещения — оставляй date_posted как None.
  • Добавь обработку относительных ссылок и корректную нормализацию URL.

Часть 5. Примечания

  • Уважай robots.txt и правила сайта касательно скрапинга.
  • Не перегружай сайт частыми запросами; можешь добавить паузы между запросами.
  • Если страница предоставляет RSS/Atom фид вакансий, проще парсить его — он однозначно отдаёт последние записи.

Если хочешь, скажи точный URL страницы kadroout, и я адаптирую селекторы под конкретную версию страницы и пришлю готовый рабочий скрипт под твой случай.