Сбор вакансий: заголовки, повторы и закрытие
Создайте межсайтовую запись вакансий: храните исходные и нормализованные поля, разделяйте повторные публикации и не превращайте отсутствие в закрытие.
BotBrowser Team
Нужна структурированная документация по теме Развертывание?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Сбор вакансий становится задачей модели данных, как только несколько сайтов публикуют одну и ту же должность. Одинаковые заголовки не определяют одну вакансию, новый URL не доказывает новую позицию, а строка, переставшая появляться, не доказывает, что работодатель закрыл вакансию. BotBrowser поддерживает документированные браузерные параметры профиля для разрешённого наблюдения, но не предоставляет данные вакансий, не выполняет вход и не предоставляет доступ к сайту. Выберите разрешённый источник, сохраняйте исходные поля рядом с нормализованными и явно указывайте каждый экземпляр публикации и результат наблюдения.
Кратко
- Храните исходные строки заголовка, работодателя и места рядом с нормализованными значениями и версией правила.
- Ключ записи: экземпляр публикации в источнике. Для повторной публикации нужны свидетельства непрерывности, прежде чем заменять предыдущий экземпляр.
datePosted,validThroughи время наблюдения: разные факты с разным смыслом.- Неудачное обновление является инцидентом. Отсутствие в ограниченном списке остаётся отсутствием, а не доказательством закрытия.
- Предпочитайте официальную выгрузку или одобренный экспорт. Возможность размещать структурированные данные не разрешает сбор.
Содержание
- Разделение трёх задач нормализации
- Сохранение исходных полей и версий правил
- Когда повторная публикация является новым экземпляром
- Обнаружение закрытия без выдумывания
- Минимальная схема сбора
- Одобренный источник важнее браузерного маршрута
- Практический вывод
Разделение трёх задач нормализации
Межсайтовым данным о вакансиях нужны три разных решения. Их объединение в один шаг очистки уничтожает свидетельства, необходимые позже.
Заголовок. «Senior Engineer», «Sr. Engineer, Platform» и «Engineer III» могут означать сопоставимый уровень или разные области. Нормализуйте отдельное поле для заявленной цели, например широкую группу должностей, сохраняя исходный заголовок. Не заменяйте заголовок нормализованной меткой.
Место. «Remote», «Remote, US», «New York, NY (Hybrid)» и название города в свободном тексте отвечают на разные вопросы. Сохраните исходный текст, затем запишите реально предоставленные поля: страну, регион, город, область удалённой работы и формат. Отсутствующая страна не позволяет выводить её из языка браузера или региона прокси.
Работодатель. Бренд, юридическое лицо, кадровое агентство и метка сайта не взаимозаменяемы. Сохраняйте исходную метку и любую ссылку на организацию. Похожие названия могут относиться к разным организациям, а один работодатель может публиковать через несколько каналов.
Записывайте три решения отдельными полями, например title_family, location_parts и employer_ref, каждое со своей версией правила. Одно поле cleaned_title или city скрывает, что было предоставлено, а что выведено. Храните исходные строки рядом с этими полями и явное неизвестное состояние, когда источник не отвечает на вопрос. Тогда последующее сравнение можно проверить без восстановления исходного ответа.
Контракт полей вакансии определяет, как один сайт предоставляет поля и наблюдения. Этот конвейер начинается после контракта источника и добавляет межсайтовую запись, явно показывающую сопоставление.
Сохранение исходных полей и версий правил
Нормализация является решением приложения, поэтому запись должна показывать вход и правило преобразования. Словарь JobPosting в schema.org описывает объявление о вакансии и определяет datePosted как дату публикации онлайн-объявления. Он даёт значения для сравнения, а не универсальный анализатор каждого сайта.
| Поле записи | Что сохранять | Граница |
|---|---|---|
| Источник | Идентичность сайта или выгрузки и область набора | Одинаковые значения разных источников не доказывают одну публикацию |
| Ключ публикации | Определённый поставщиком идентификатор, если дан | URL или заголовок не являются автоматически стабильным ключом |
| Исходный заголовок | Точная строка в разрешённых рамках хранения | Не заменяйте нормализованной меткой |
| Исходное место | Точный текст и предоставленные структурные части | Не выводите отсутствующую страну из локали или прокси |
| Метка работодателя | Текст работодателя или организации | Бренд, юридическое лицо и агентство остаются разными без доказательств |
| Нормализованные поля | Значение, идентификатор правила и версия | Изменение правила создаёт новую интерпретацию, а не тихую перезапись |
| Публикация и срок | datePosted и validThrough, если даны | Ни один не устанавливает дату закрытия или фактическое заполнение вакансии |
| Наблюдение | Время сбора, состояние источника и результат приёмки | Время сбора не является публикацией, сроком или сделкой |
Документация Google JobPosting описывает структурированные данные, которые могут сделать объявление кандидатом на показ в поиске вакансий, и приводит поля identifier, datePosted, validThrough, employmentType, hiringOrganization и jobLocation. Возможность показа не гарантирует точность, доступ или одинаковую разметку сайтов. Используйте словарь для названий полей и сопоставляйте только то, что фактически возвращает одобренный источник.
Версионируйте правило сопоставления. Если «Senior» переходит в другую группу должностей, старая запись не должна выглядеть так, будто всегда использовала новое правило. Нормализованный ряд можно восстановить из исходных значений и записанного правила; перезапись исходных полей лишает этой возможности. Храните только разрешённое соглашением и в тех же пределах, что и нормализованную запись.
Это особенно важно, когда два сайта описывают одну должность разными форматами. Один может дать структурированные город и страну, другой объединить их в текстовом поле, третий опустить страну, назвав метрополию. Нормализованное сравнение остаётся полезным, но требует правила, указывающего выведенное и предоставленное. Записывайте путь исходного поля или место в ответе для каждого значения, чтобы проверяющий видел, пришла ли страна из поля поставщика или из предположения приложения. Если страна не предоставлена, нормализованное значение остаётся неизвестным. Не подставляйте локаль браузера, регион прокси или язык интерфейса: они описывают среду наблюдения, а не вакансию.
Нормализация работодателя требует такой же трассировки. Сайт может обозначать организацию отображаемым именем, юридическим названием или агентством. Идентификатор организации от источника сильнее совпадения имён, но всё равно относится только к этому источнику. Записывайте метку, идентификатор и правило связи двух записей. Сохраняйте видимой связь с низкой уверенностью, не сворачивая её в одну строку работодателя. Это позволяет сравнивать количество по источникам и отменить совпадение при новых доказательствах.
Нормализованные поля должны нести состояние уверенности или разрешения, если сопоставление неоднозначно. Группа должностей может быть mapped, место partial, работодатель unresolved. Эти состояния отличают «не предоставлено» от «ещё не истолковано». Сохраняйте их в экспортах и отчётах, чтобы аналитик не считал неразрешённое значение чистым.
Когда повторная публикация является новым экземпляром
Сайт может переопубликовать должность с новым URL, внутренним идентификатором или изменённым заголовком. Ни одно изменение само по себе не доказывает новую вакансию или непрерывность. Оставляйте экземпляры раздельными, если одобренный источник не устанавливает связь.
| Искусственное наблюдение | Свидетельство источника | Принятая связь |
|---|---|---|
| Тот же ключ, заголовок изменён | Ключ не изменён; источник предоставляет обновление | Тот же экземпляр с наблюдаемым изменением поля |
| Новый URL, тот же работодатель и заголовок | URL изменён; поля непрерывности нет | Связь не разрешена; отдельный экземпляр до появления доказательств |
| Новый ключ, источник отмечает замену | Источник явно связывает новое объявление со старым | Связанный экземпляр; сохраняются оба ключа и связь |
| Тот же заголовок и город на другом сайте | Другой источник без общего ключа | Экземпляр другого источника; не объединять по тексту |
Таблица искусственная, а не измеренное поведение сайта. Модель объявлений недвижимости применяет ту же дисциплину: экземпляр объявления, физический объект и предложение различны. Для вакансий также различны экземпляр публикации, должность работодателя и заявка кандидата.
Используйте ключ в области источника, если он есть, и записывайте, почему совпадение принято или оставлено открытым. Нечёткое совпадение заголовка, работодателя и места может предложить пару, но предложение не доказывает непрерывность. Сохраняйте оба ключа и метку связи. Если дедупликация объединяет записи, запишите правило и свидетельства, чтобы аудит мог отделить две разные вакансии с одинаковым заголовком.
Метка связи должна пережить обновление. Записывайте same_occurrence, related_occurrence или unknown и свидетельство: общий ключ, явное поле замены или каноническую ссылку источника. Не выводите метку только из текущего нормализованного заголовка. Заголовок может измениться внутри публикации, а неизменный заголовок может сопровождать новую вакансию. Связь описывает непрерывность источника, а не сходство текста.
Если сайт даёт идентификатор публикации и идентификатор должности, храните их раздельно. Первый может измениться при повторной публикации, пока второй остаётся, или наоборот. Хранение одного теряет различие, необходимое дедупликации. Если нет ни одного, сохраняйте URL и время наблюдения как свидетельство, но помечайте экземпляр предварительным. Предварительная запись полезна для ограниченного анализа; без дополнительных доказательств её нельзя объединять в постоянную каноническую должность.
Храните ссылку источника рядом с ключом, не заменяя его. URL может меняться из-за параметров отслеживания, языковых префиксов или миграции сайта, а старый URL может позже перенаправлять. Сохраняйте фактически наблюдаемую ссылку и нормализованную форму сравнения отдельно. Перенаправление может указать на связь для проверки, но не доказывает, что цель является той же публикацией. Это вопрос к источнику, а не правило строки URL.
Обнаружение закрытия без выдумывания
Руководство Google по истечению указывает, что объявления, переставшие принимать заявки, должны истечь, и называет способы: заполнить validThrough прошедшей датой, удалить страницу с 404 или 410 либо удалить структурированные данные JobPosting. Это обязанность публикатора перед поисковым интерфейсом. Сборщик, не обнаруживший карточку или увидевший изменённый ответ, не обязательно наблюдал одно из этих событий.
| Искусственное событие после исходного | Наблюдение | Принимаемая интерпретация |
|---|---|---|
| Принятое изменение поля | Тот же ключ; источник даёт новый заголовок или место | Наблюдаемое изменение; без утверждения о новом работодателе или вакансии |
| Повторная публикация с новым URL | Новая ссылка без доказательств непрерывности | Отдельный экземпляр с неразрешённой связью |
| Обновление не удалось | Принятой записи нет | Инцидент сбора; не удалять прежнее принятое значение |
| Карточки нет в ограниченном списке | Окно списка валидно; цель не наблюдается | Ограниченное отсутствие; закрытие не установлено |
datePosted описывает публикацию объявления, validThrough задаёт границу срока, время наблюдения показывает момент проверки приложением. Прошедший validThrough может обосновать метку истечения при известном смысле источника, но не показывает, когда вакансию заполнили. Отсутствующая строка подтверждает «не наблюдалось в этом окне», а не «закрыто». Проверка, тайм-аут или ошибка разбора являются инцидентом, а не успешным пустым результатом.
Собственный пример может воспроизвести четыре строки без сбора реального сайта. Требуйте одно принятое изменение, один отдельный повтор, один инцидент обновления и одно ограниченное отсутствие. Отклоняйте вывод, превращающий всё в закрытия. Это проверка логики приложения, а не частоты обновления сайта и не доказательство открытой вакансии.
Обнаружению закрытия нужна временная граница. Объявление может исчезнуть из результата из-за смещения окна запроса, усечения списка или изменения порядка. Записывайте область запроса или выгрузки, диапазон страниц и время наблюдения. Если проверена только первая страница, её отсутствие не означает отсутствия на сайте. Если порядок изменился, отсутствующий элемент может быть артефактом разбиения. Храните такие исходы отдельно от состояния срока, предоставленного источником.
Состояние источника имеет приоритет над выводом приложения. Если одобренный источник явно возвращает закрытое или истёкшее состояние, запишите его с именем поля и временем наблюдения. Если он возвращает ответ об удалении, запишите его отдельно от успешного пустого списка. Если полезного ответа нет из-за проверки, тайм-аута или повреждённого тела, запишите инцидент. Тогда представление жизненного цикла может сказать «истечение подтверждено источником», «не наблюдалось в этом окне» или «неизвестно», а не сводить исчезновение к одному ярлыку.
Исторические записи должны сохранять свидетельства, доступные тогда. Более новый контракт источника может добавить статус, но это не превращает старое отсутствие в закрытие. Храните результат наблюдения вместе с версией схемы источника. При изменении схемы начните новый ряд интерпретации или явно согласуйте старые записи. Это та же дисциплина, что и для нормализованных полей: изменение правила не должно выглядеть изменением мира.
Минимальная схема сбора
Небольшая запись сохраняет решения проверяемыми:
source_namespace, source_posting_key, raw_title, raw_location,
raw_employer_label, employer_ref, normalized_title, normalized_location,
normalization_rule_version, date_posted, valid_through,
query_scope, page_range, source_schema_version,
observed_at, observation_outcome, relation_to_prior_occurrence
Схема является записью приложения, а не обязательным форматом сайта. Отсутствующее поле остаётся пустым или неизвестным, а не получает угаданное значение. Держите исход ответа отдельно от истолкованного жизненного цикла. Если два наблюдения имеют общий ключ, их изменения сравнимы; если нет, связь остаётся открытой до свидетельства источника.
Граница доступа к сайтам вакансий отделяет публичные страницы от аутентифицированных данных кандидатов. Схема сбора не меняет эту границу. Профили, заявки и сообщения находятся вне области, даже если сеанс браузера мог бы к ним получить доступ. Предпочитайте официальную выгрузку или одобренный экспорт и останавливайтесь без разрешения или нужных свидетельств.
Одобренный источник важнее браузерного маршрута
RFC 9309 указывает, что правила robots не являются разрешением доступа. Публичная страница, разрешающая обход, может не разрешать создание рыночного набора или перераспространение вакансий. Применимые условия сайта и реальное соглашение о данных определяют сбор и хранение. Успешный ответ браузера не является разрешением.
Документация BotBrowser о часовом поясе, локали и языке описывает браузерные параметры языка, пояса и локали с автоматическим определением и ручными переопределениями. Они делают среду разрешённого наблюдения явной; ручные переопределения требуют лицензию ENT Tier1. Они не устанавливают место вакансии, страну работодателя или смысл текста места сайта.
Справочник конфигурации профиля описывает пакеты профиля с требованием совпадения основной версии, приоритет конфигурации и доступность полей. Профиль делает заявленные браузерные параметры воспроизводимыми; он не выполняет вход, не даёт лицензию на данные и не гарантирует одинаковые объявления между запусками. Записывайте профиль и условия наблюдения рядом с принятыми записями, а соглашение источника оставляйте источником прав для доступа и хранения.
Вопросы и ответы
Можно ли объединить одинаковые заголовки двух сайтов в одну вакансию?
Только при свидетельстве источника, что это одна публикация или должность. Одинаковый текст является кандидатом для проверки, а не доказательство. Сохраняйте каждый экземпляр и явную неразрешённую связь до установления непрерывности.
Означает ли исчезновение объявления из списка закрытие вакансии?
Нет. Ограниченный список может не содержать объявление по многим причинам, а неудачное обновление не является пустым результатом. Записывайте отсутствие и требуйте свидетельства источника, например состояние срока или ответ об удалении, до присвоения закрытия.
Следует ли использовать datePosted как время сбора?
Нет. Это дата публикации онлайн-объявления. Храните время наблюдения, datePosted и validThrough отдельными полями с собственным смыслом.
Поставляет ли BotBrowser вакансии или разрешение на сбор?
Нет. Он предоставляет документированные параметры браузера. Он не поставляет данные вакансий, не выполняет вход, не даёт доступ и не устанавливает условия сайта; используйте одобренный источник и храните только разрешённое соглашением.
Источники
- schema.org JobPosting
- Структурированные данные JobPosting в Google
- RFC 9309
- BotBrowser: часовой пояс, локаль и язык
- Конфигурация профилей BotBrowser
Практический вывод
Стройте разрешённую запись вакансий вокруг экземпляров публикации в области источника. Храните исходные и нормализованные значения с версией правила, разделяйте повторные публикации до подтверждения непрерывности и считайте публикацию, срок и наблюдение разными фактами. Классифицируйте неудачные обновления и ограниченное отсутствие без выдуманных закрытий. Браузерные параметры делают разрешённое наблюдение воспроизводимым; одобренный источник и соглашение определяют доступные данные, их смысл и допустимую историю.
Эта статья входит в руководство: Развёртывание и выпуск браузера: операционная карта
Похожие статьи
Данные Indeed: поля, страницы и повторные записи
РазвертываниеСбор вакансий: границы браузера
РазвертываниеПарсинг Zillow: ID объявлений, цены и история статусов
РазвертываниеМониторинг цен конкурентов: устройство сбора
РазвертываниеПарсинг Google Maps: Places API или списки на странице?
РазвертываниеСбор данных Amazon: источники и границы браузера
Выполните ту же проверку в BotBrowser
Загрузите профиль, сохраните внутри браузера те сигналы, о которых только что прочитали, и подтвердите результат на своей машине до раскатки.