Скрапинг вакансий: Руководство по сбору данных о рынке труда
TL;DR
Скрейпинг вакансий собирает публичные или прямо разрешенные объявления о вакансиях и преобразует их в единообразные записи. Это может поддерживать исследование рынка труда, анализ потребностей в найме и планирование рабочей силы, но публикация описывает рекламу, а не заявителя или подтвержденного трудоустройства.
Предпочитайте официальный API вакансий или лицензированный поток, когда это соответствует вашим потребностям. Для разрешенных веб-страниц захватывайте только относящиеся к бизнесу поля публикаций, сохраняйте временные метки источника и наблюдения, устраняйте дубликаты репостов и удаляйте устаревшие записи в соответствии с вашей политикой хранения. Публичная видимость не означает неограниченных прав на сбор или перераспределение.
Что такое скрейпинг вакансий?
Скрейпинг вакансий — это сбор данных о вакансии с помощью программного обеспечения из источника, такого как страница карьеры компании, публичная доска объявлений о работе или авторизованный поток. Полезная запись может включать работодателя, название роли, местоположение, тип занятости, диапазон зарплат, если он опубликован, дату публикации, URL-адрес источника и дату, когда ваша система его наблюдала.
Команды используют полученные данные для изучения спроса на навыки, географии найма, раскрытия информации о компенсациях, паттернов удаленной работы и изменений в рекрутинговой активности компании. Это агрегированные сигналы. Объявление может быть дублировано, оставаться в сети после закрытия роли или публиковаться для создания пула кандидатов без немедленного найма. Рассматривайте это как свидетельство рекламируемой роли, а не как доказательство закрытой позиции или финансируемого проекта.
Для разрешенных публичных страниц, которые требуют рендеринга браузером или чистого Markdown, Nstdata Crawl может обеспечить слой получения; разрешения на источник и последующая валидация остаются частью вашего рабочего процесса.
Попробуйте Nstproxy Crawl - Начните Бесплатно Уже Сегодня
Источники данных о рынке труда и методы сбора
Выбирайте источник перед тем, как выбрать скрейпер. Опубликованный API может предложить стабильные поля и явные условия доступа; лицензированный поток может предложить более широкое покрытие; публичная страница может быть единственным источником для конкретного работодателя. Сравните покрытие, частоту обновлений, географию, идентификаторы, лимиты скорости, исторический доступ и права на хранение или перераспределение данных.
Документация API USAJOBS описывает структурированный способ доступа к федеральным объявлениям о вакансиях. Для тенденций на рынке труда Программа JOLTS Бюро статистики труда публикует агрегированные данные об открытых вакансиях, найме и увольнениях. Справочник по профессиональной перспективе добавляет контекст профессий. Эти источники отвечают на разные вопросы: список API — это отдельное объявление, в то время как статистическая серия — это агрегированная мера.
Если вы используете HTML-источник, поддерживайте утвержденный список источников и фиксируйте соответствующие условия, цель сбора и ожидаемые поля. Избегайте страниц, требующих личного входа или раскрывающих профили кандидатов, резюме, контактные данные или статус заявки. Не пытайтесь обходить контроль доступа, когда запрос отклонен.
Какие данные о вакансиях следует собирать?
Сохраняйте поля, которые поддерживают названный анализ. Компактная схема может выглядеть следующим образом:
Поле
Почему сохранить
Проверка качества
источник и URL-адрес источника
Проследить оригинальное объявление
Канонизировать редиректы и сохранить точную ссылку на страницу
работодатель и название роли
Группировать вакансии и сравнивать спрос
Сохранять оригинальный текст наряду с нормализованными значениями
местоположение и режим работы
Анализировать географию и удаленные роли
Разделить город, регион, страну и удаленный статус
тип занятости
Различать вакансии на полную занятость, контракт и стажировку
Хранить неизвестное как null, а не делать предположения
диапазон зарплат и валюта
Сравнивать раскрытые компенсации
Сохранять минимальное, максимальное, период и формулировку источника
даты публикации и наблюдения
Измерять актуальность и частоту публикации
Сохранять дату источника отдельно от времени обхода
статус и дата истечения
Избегать подсчета устаревших вакансий
Повторно проверять источник и сохранять причину закрытия
хэш описания
Обнаруживать правки без хранения ненужного дублированного текста
Версионировать логику парсинга и хеширования
Избегайте сбора информации о заявителях. Не делайте выводов о личности, контактных данных или статусе занятости человека на основе объявления о вакансии. Если описание по ошибке содержит личную информацию, исключите ее из нижнего набора данных и следуйте процедуре удаления вашей организации.
Как собрать публичные объявления о вакансиях с помощью Nstdata Crawl
Для исследования рынка труда начните с официального API или разрешенной ленты данных, когда такая доступна. Например, документация API USAJOBS описывает свой API для поиска работы. Используйте кран для общедоступных страниц вакансий, когда источник позволяет автоматизированный доступ. Не собирайте информацию о кандидатах или контент, требующий входа в систему.
Nstdata Crawl получает страницу и может вернуть ее основной контент в формате Markdown. Это дает вам читаемый исходный текст для хранения или обработки; это не превращает автоматически каждую страницу вакансии в стандартизированные поля работы. Текущий Python SDK и параметры запроса задокументированы в документации Nstdata Crawl.
Храните ключ в переменной окружения или менеджере секретов; не добавляйте его в систему контроля версий.
2. Получите страницы вакансий и сохраните их в формате Markdown
Используйте кураторский список общедоступных URL вакансий. URL ниже являются заполнительными — замените их на страницы из источников, доступ к которым вам разрешен.
import json
import os
import re
from datetime import datetime, timezone
from nstdata_ai_crawl import( Format, NstDataClient, ScrapeRequestDto,)job_urls =["https://careers.example.com/jobs/123","https://careers.example.com/jobs/456",]deffirst_heading(markdown:str)->str|None:for line in markdown.splitlines():match= re.match(r"^\s*#{1,3}\s+(.+?)\s*#*\s*$", line)ifmatch:returnmatch.group(1).strip()returnNonedeflabeled_value(markdown:str, labels:list[str])->str|None:"""Пример для страниц, которые экспонируют поля как 'Location: ...'."""for raw_line in markdown.splitlines(): line = re.sub(r"[*_]","", raw_line).strip() line = re.sub(r"^[-*]\s+","", line)for label in labels: prefix =f"{label}:"if line.casefold().startswith(prefix.casefold()):return line[len(prefix):].strip()orNonereturnNonedefparse_job(url:str, markdown:str)->dict:return{"source_url": url,"observed_at": datetime.now(timezone.utc).isoformat(),# Проверьте эту кандидатуру в соответствии с макетом страницы целевого сайта."title_candidate": first_heading(markdown),"employer": labeled_value(markdown,["Company","Employer"]),"location": labeled_value(markdown,["Location"]),"employment_type": labeled_value( markdown,["Employment type","Job type"]),"salary_text": labeled_value(markdown,["Salary","Compensation"]),# Сохраните оригинальный текст, чтобы последующий разбор можно было исправить."description_markdown": markdown,}records =[]failures =[]with NstDataClient(os.environ["NSTDATA_API_TOKEN"])as client:for url in job_urls:try: result = client.submit_scrape_task_sync( ScrapeRequestDto( url=url, formats=[Format.MARKDOWN], timeout=60_000, onlyMainContent=True,)) markdown = result.data.get_markdown()ifnot markdown ornot markdown.strip(): failures.append({"source_url": url,"reason":"empty_markdown"})continue records.append(parse_job(url, markdown))except Exception as exc: failures.append({"source_url": url,"error_type":type(exc).__name__,})withopen("jobs.jsonl","w", encoding="utf-8")as output_file:for record in records: output_file.write(json.dumps(record, ensure_ascii=False)+"\n")withopen("job_scrape_failures.jsonl","w", encoding="utf-8")as error_file:for failure in failures: error_file.write(json.dumps(failure, ensure_ascii=False)+"\n")print(f"Сохранено {len(records)} записей; {len(failures)} страниц требуют проверки.")
Парсер меток преднамеренно простой: он работает только тогда, когда страница представляет поля в легко распознаваемых строках, таких как Location: Boston. Сайты вакансий используют разные макеты, поэтому проверьте Markdown и адаптируйте parse_job для каждого источника. Рассматривайте первый заголовок как потенциальный заголовок и подтверждайте его; некоторые сайты используют общий заголовок, такой как "Карьера". Оставляйте отсутствующие данные о зарплате или трудоустройстве пустыми, вместо того чтобы делать предположения.
3. Обход ограниченного раздела карьеры
Если страницы с деталями вакансий связаны с разделом карьеры, Nstdata также поддерживает асинхронный обход сайтов. Установите лимиты, такие как maxDepth и maxPages, чтобы ограничить обнаружение в рамках, затем проверьте статус задачи и получите ее результаты с помощью API задач, описанных в документации. Обход всего сайта полезен для обнаружения связанных страниц; это не отменяет необходимость валидации того, какие URL являются объявлениями о вакансиях, или парсинга структуры страниц каждого сайта.
4. Валидация и поддержание набора данных
Перед использованием записей для анализа проверьте, что каждый URL является допустимой страницей с деталями вакансий, подтвердите заголовок и местоположение в сравнении с источником и просмотрите неудачи и пустые результаты. Удаляйте дубликаты, используя стабильный идентификатор вакансии из источника, когда это возможно; в противном случае используйте нормализованный канонический URL. Храните observed_at, чтобы вы могли различить, когда объявление было собрано, в отличие от того, когда работодатель его первоначально опубликовал.
Этот рабочий процесс создает отслеживаемый набор общедоступного контента страниц вакансий. Markdown является исходной записью; структурированные поля — это отдельный этап парсинга, специфичный для источника.
Сколько стоит сбор данных о вакансиях?
Сравните общую стоимость трех подходов: использование официального API или лицензированной ленты, содержание вашего собственного парсера и использование управляемого API обхода для источников, которые допускают автоматизированный доступ.
API или лента могут сократить время на инженерные работы, но важны условия охвата и повторного использования. Скрипт, управляемый самостоятельно, имеет затраты на инфраструктуру, а также регулярную работу по обновлению селекторов, обработке повторных запросов и просмотру изменений в источниках. Управляемый сервис может уменьшить операции в браузере и прокси, в то время как ваше приложение все равно отвечает за планирование, очистку данных, хранение и управление источниками.
Используйте стоимость за принятое, текущее объявление, а не стоимость за запрос:
эффективная стоимость за 1,000 объявлений =
1,000 × (сбор + инфраструктура + инжиниринг + обзор + затраты на хранение)
÷ принятые текущие объявления
Для примерной оценки заполните свой собственный почасовой тариф инженера, количество источников, объём выборки, процент дубликатов или устаревших записей, а также период хранения. Если источник часто меняется или дает много непригодных страниц, самая дешевая цена за запрос может не дать самой низкой стоимости за действительное объявление. Рассматривайте любую оценку как модель, пока вы не измерите репрезентативную выборку.
Юридические, конфиденциальные и качественные аспекты данных
Проверьте условия источника, политики API, рекомендации для роботов, правила конфиденциальности, лицензирование и ваше предполагаемое использование перед сбором. Объявления о вакансиях, доступные для публики, не являются неограниченным набором данных. Права на повторное использование могут различаться между просмотром страницы, сохранением копии, перераспределением производных записей и использованием данных для коммерческих решений.
Храните только поля, необходимые для указанной цели. Установите график хранения и процесс удаления устаревших или невостребованных записей. Ограничьте доступ к собранным описаниям и избегайте использования набора данных для составления профилей отдельных соискателей. Если данные могут повлиять на решения о трудоустройстве или другое решение с высоким воздействием, получите юридическую и конфиденциальную проверку, прежде чем полагаться на них.
Качество данных требует равного внимания. Названия вакансий варьируются в зависимости от работодателей; раскрытия зарплаты могут быть годами, почасовыми или отсутствовать; одна роль может быть представлена в нескольких местах; и дата страницы может отражать редактирование, а не оригинальную публикацию. Храните сырые значения, документируйте правила нормализации и сообщайте о пропусках, вместо того чтобы заполнять их догадками.
Как построить надежный поток данных о рынке труда
Практический повторяющийся поток выглядит следующим образом:
Запланируйте сбор. Выберите частоту на основе частоты обновления источника и временной линии принятия решений. Ежедневные проверки могут быть достаточны для многих рыночных анализов.
Собирайте в рамках разрешенного объема. Сначала используйте официальный API, когда это возможно; в противном случае собирайте только разрешенные общедоступные страницы.
Нормализуйте поля. Сохраняйте первоначальные строки и добавляйте нормализованные поля местоположения, типа занятости и вознаграждения.
Удаляйте дубликаты. Предпочитайте идентификатор источника. Если он недоступен, объедините данные о работодателе, названии, местоположении и нормализованном отпечатке описания, затем просмотрите неоднозначные совпадения.
Обнаруживайте устаревшие объявления. Повторно проверьте, существует ли еще объявление. Отметьте его как закрытое или недоступное с датой, а не удаляйте историю сразу.
Храните историю. Храните наблюдения как версии с датами, чтобы аналитики могли различать новое объявление и отредактированное.
Измеряйте охват и качество. Отслеживайте успешность выборки, процент действительных полей, процент дубликатов, процент устаревших записей и стоимость за принятое объявление.
Минимальная таблица размещения может содержать стабильный внутренний ID, ID источника, работодателя, должность, поля местоположения, диапазон заработной платы и валюту, тип занятости, URL источника, время первого просмотра, время последнего просмотра, статус, хеш содержимого и версию парсера. Внедрите обработку удаления и коррекции в дизайн до первого запланированного запуска.
Заключение: Постройте набор данных вокруг размещения
Сбор вакансий полезен, когда команде нужна стабильная история рекламируемых ролей и она может определить источники, которые ей разрешено использовать. Выберите правильный источник, соберите минимальные поля, которые поддерживают анализ, сохраняйте метки времени и происхождение, иTreatate каждую запись как наблюдение, которое может потребовать проверки.
Сбор вакансий - это сбор полей объявления о работе из общественных или авторизованных источников и организация их для исследования или анализа. Размещение указывает на рекламируемую вакансию, а не на завершенный найм.
В: Как я могу собрать списки вакансий с помощью Python?
Начните с официального API или лицензированного фида, если это возможно. Для разрешенного HTML-источника используйте HTTP-клиент или инструмент браузера только в рамках правил доступа источника, парсите необходимые поля и сохраняйте URL-адреса источников и метки времени.
В: Законен ли сбор вакансий?
Это зависит от источника, юрисдикции, собранных данных, хранения и замысла использования. Ознакомьтесь с условиями, обязательствами по конфиденциальности, лицензированием и применимым правом. Одно лишь публичное наличие не является разрешением на неограниченное повторное использование.
В: Как мне извлечь описания вакансий?
Используйте авторизованный структурированный источник, если это возможно. Для разрешенных страниц извлекайте описание, сохраняя оригинальный URL и время наблюдения, и избегайте сбора информации о соискателях или несопоставимых данных профиля.
В: Какие хорошие источники для данных о рынке труда?
Используйте официальные API рынка труда и статистические агентства для структурированных списков и агрегированных тенденций. Страницы карьеры компаний и лицензированные поставщики могут расширить охват, когда их условия доступа и повторного использования соответствуют исследовательской цели.
Практическое руководство по сбору вакансий для маркетинговых исследований и анализа рабочей силы. Узнайте, как выбирать разрешенные источники, нормализовать объявления и валидировать повторяющийся набор данных.
Marcus Chen
Oct. 21st 2026
Сканируйте целые сайты одним API-запросом
Успешность 99,8% с рендерингом JavaScript
Получайте чистые данные для LLM в разных форматах
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.