Отделите получение ответа от его обработки
Для работы с данными hh.ru следует ориентироваться на официальный API и его текущие условия. Он возвращает JSON; запросы должны соответствовать требованиям к заголовкам, авторизации конкретного метода и ограничениям сервиса. Документация старого примера может отставать от действующей схемы. В Python удобно разделить программу на три части. Первая получает ответ и проверяет HTTP-статус. Вторая превращает запись вакансии во внутренний формат. Третья сохраняет таблицу. Тогда обработку пропусков можно проверять на локальном файле, не выполняя сетевые запросы при каждом изменении кода. Сетевой сбой, отказ доступа и корректный пустой результат должны оставаться разными состояниями. Если программа записала пустую таблицу после ошибки соединения, пользователь может ошибочно решить, что подходящих вакансий нет.
Сохраните смысл отсутствующих значений
Заранее определите столбцы: идентификатор, название, работодатель, регион, ссылка, сведения о зарплате и время получения. Для зарплаты важны границы диапазона, валюта, налоговый признак и другие параметры, предусмотренные текущей схемой. Не считайте любые две суммы сопоставимыми только потому, что они выглядят как числа. Представим три вымышленные записи. В первой указано только «от восьмидесяти тысяч», во второй — диапазон, в третьей зарплата отсутствует. Нижняя граница первой записи не является её точной зарплатой, а отсутствие сведений в третьей не означает нулевой доход. Во внутренней таблице пропуск сохраняют явно. Название поля своего проекта не обязано совпадать с названием поля API, но преобразование должно быть описано. Это особенно полезно при изменении внешней схемы: поправить нужно определённый слой, а не все последующие расчёты.
Контролируйте страницы и повторные записи
Выдача обычно разбита на страницы. Программа должна учитывать параметры и пределы пагинации конкретного метода, а завершение обхода определять по его документированным правилам. Произвольное увеличение номера страницы не гарантирует получение всей базы. При объединении результатов нескольких запросов используйте идентификатор вакансии как ключ устранения дублей. Две записи с одинаковым названием могут относиться к разным предложениям; одна запись с тем же идентификатором может появиться повторно. Для обновлённой версии заранее выберите правило: например, сохранять последнее полученное состояние вместе со временем загрузки. Записывайте параметры поиска и момент сбора. Выгрузка отражает доступный результат определённого запроса в определённое время. Она не становится полной картиной рынка труда автоматически. Ограничения доступа и частоты запросов соблюдают; ошибки не обходят сменой учётных записей или маскировкой клиента.
Попробуйте на практике
Проверьте слой обработки на локальных вымышленных данных без обращения к сервису.
- Создайте три условные записи вакансий с разными идентификаторами: с полной зарплатной вилкой, только с нижней границей и без зарплаты.
- Добавьте четвёртую запись, повторяющую идентификатор первой, но с обновлённым названием.
- Опишите или реализуйте функцию, которая возвращает одинаковый набор внутренних полей, сохраняя пропуски.
- Объедините записи по идентификатору с заранее выбранным правилом обновления и подготовьте строки будущей таблицы.
- Проверьте число уникальных записей и отдельно перечислите ограничения, которые останутся при подключении реального API.
Как проверить результат. В результате остаются три уникальные вакансии, пропущенная зарплата не превращается в ноль, а обновление имеет объяснимое правило. Ошибка получения данных не должна выглядеть как подтверждённое отсутствие вакансий.
Частые вопросы
Зачем сохранять исходный JSON?
Он помогает проверить преобразования и разбирать изменения схемы. Для учебного проекта достаточно вымышленных ответов; при реальной работе сохраняют только необходимые данные в рамках действующих условий доступа.
Можно ли сразу вычислить среднюю зарплату по всей выгрузке?
Сначала нужно определить сопоставимость валют, периодов оплаты, налоговых признаков и неполных диапазонов. Иначе итоговое число объединит разные величины и будет вводить в заблуждение.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.