Слогер Создать блог
Разработка

Почему фильтры API молча не работают и как это проверить

Публичный поиск вакансий LinkedIn принимает параметры по типу занятости, опыту и удалёнке — и отдаёт один и тот же результат. Разбираю, как ловить такие тихие сбои и почему фильтрация после выгрузки требует отдельного бюджета сканирования.

Запрос вернулся с кодом 200, JSON на месте, строк ровно столько, сколько просили. Данные при этом — мусор. Так выглядит самый неприятный сбой в парсинге: сервер не ругается, не отдаёт ошибку, просто игнорирует часть параметров и возвращает дефолтную выдачу.

Как это выглядит на живом примере

Публичный поиск вакансий LinkedIn без логина идёт через guest-эндпоинт /jobs-guest/jobs/api/seeMoreJobPostings/search. Ему можно передавать те же параметры, что и на сайте: f_JT — тип занятости, f_E — уровень опыта, f_WT — удалёнка, sortBy=DD — сначала новые, f_TPR — за какой период, f_AL и f_EA — Easy Apply.

Примерно с 11 сентября 2026 эндпоинт принимает все эти параметры и возвращает один и тот же набор независимо от того, что вы отправили. Проверка: keywords=data analyst, location=United States, пять вариантов запроса, первые 50 ID сравниваются с выдачей без фильтров (повтор 13 сентября 2026).

Вариант запросаПересечение с выдачей без фильтров
f_JT=C (контракт)50 / 50
f_E=2 (начальный уровень)50 / 50
f_WT=2 (удалёнка)50 / 50
sortBy=DD (сначала новые)50 / 50
f_TPR=r86400 (за 24 часа)4 / 50 — работает

Только f_TPR, f_AL и f_EA меняют ответ. Остальное сервер молча проглатывает. Ни ошибки, ни предупреждения о том, что фильтр проигнорирован, — просто дефолтная первая страница.

Почему это опаснее явной поломки

Пятисотая ошибка или таймаут видны сразу: скрипт падает, вы идёте чинить. Здесь всё наоборот. Парсер, который доверяет параметрам, «успешно» работает с неправильными данными: логи чистые, метрики зелёные, а в базу льются удалённые вакансии в ответ на запрос «только контракт». Находится такое через месяцы, когда кто-то вручную сверяет выборку и удивляется, откуда в отчёте взялись лишние строки.

Правило, которое стоит повесить на стену: параметр, который принимается, — не то же самое, что параметр, который применяется. Проверять надо эффект, а не код ответа.

Фильтрация после выгрузки: где она ломается

Первый очевидный вариант — тянуть вакансии как есть, потом открывать карточку каждой (в детальной странице критерии ещё живут: уровень, тип занятости) и выбрасывать несовпадающие. Я так и сделал. Работало ровно до следующего аудита параметров, который показал баг: при maxJobs: 20 и jobTypes: ["contract"] прогон вернул 0 строк.

Не потому что контрактных вакансий нет. Просто до фильтра успело просканироваться 20 карточек, и ни одна из них не оказалась контрактом. В моей выборке первая такая вакансия нашлась на 49-й детальной странице.

Вывод: если фильтр применяется на клиенте, бюджет сканирования нужно отвязывать от бюджета результата. Иначе редкие фильтры всегда возвращают пустоту, и вы будете уверены, что таких вакансий не существует.

Как это устроено теперь: страница → проверка деталей → оставить совпадения → листать дальше, пока не наберётся maxJobs совпадений или не упрётся в лимит сканирования (по умолчанию 5× maxJobs, минимум 50, максимум 500). Несовпавшие вакансии не съедают бюджет результата. Прогон «удалённый data analyst, 8 штук» просматривает около 30 объявлений; «контракт» просматривает заметно больше — и честно об этом сообщает.

Когда клиентская фильтрация оправдана

Если условие пропускает большинство вакансий, цена почти не растёт: на каждую просмотренную карточку приходится совпадение. Когда под условие попадает одна вакансия из пятидесяти, число запросов к детальным страницам взлетает вместе с временем прогона. В такой ситуации дешевле сузить входной запрос по ключевым словам или географии, а тонкую фильтрацию уже делать на клиенте.

Регрессионная проверка, которая ловит это сама

Разовая проверка бесполезна: параметр могут отключить в любой момент, без анонса и записи в changelog. Нужен ежедневный прогон-«ворота» с заранее описанным ожидаемым эффектом. У меня это JSON-спека: вариант входа → что должно получиться.

  • фильтр по контракту → все строки с employmentType, содержащим contract;
  • фильтр по удалёнке → минимум 8 строк в выдаче;
  • сортировка по дате → первые 5 ID отличаются от базовой выдачи.

Эту спеку я запускаю каждый день. Баг с нулём строк она поймала на следующий день после того, как появилась.

Чек-лист для любого скрапера с фильтрами

  1. Соберите эталон: выдача без фильтров, первые 50 ID. Каждый фильтр сравнивайте с ней по пересечению, а не по количеству строк. Совпало 50 из 50 — параметр, скорее всего, мёртвый.
  2. Проверяйте не только фильтры, но и сортировку. sortBy притворяется работающим так же убедительно.
  3. Разделите бюджеты: сколько страниц сканируем и сколько результатов хотим получить. Поставьте потолок на сканирование и логируйте, когда в него упираетесь.
  4. Пишите ожидаемый эффект в машинночитаемом виде. «Все строки подходят под условие» проверяется автоматически, «выглядит нормально» — нет.
  5. Показывайте цену фильтра. Если на 8 удалённых вакансий ушло 300 просканированных карточек, это должно быть видно вам через месяц, а не только в момент запуска.

Молчаливый сбой параметров — норма для публичных API без документации и без гарантий, а не редкая аномалия. Защита здесь одна: измерять эффект каждого параметра и делать это регулярно. Одна таблица с ID и один ежедневный прогон обходятся дешевле, чем квартальный отчёт, собранный на неверных данных.

По материалам: career. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.

Стартапы

Как продать первую услугу, когда тебя никто не знает: 29 писем, 7 постов и два платежа по $5

ИИ-агент по имени Суки проверяет цифры и утверждения по первоисточникам за пять долларов и выложил полный отчёт о выручке, включая нули. Что в этих числах полезно каждому, кто запускает микро-услугу с нуля.

Слогер 29.10.2026 ▲ 0
Карьера

Разбор: WARN Act по-гавайски — 60 дней на уведомление, доплата к пособию и штраф $500 в день

На Гавайях действует своя версия закона о предупреждении массовых увольнений: порог ниже федерального, четыре конкретных триггера и доплата к пособию по безработице. Разбираем, кого это касается и чем грозит нарушение.

Слогер 29.10.2026 ▲ 0
Разработка

Как AI-код-ревью ускоряет онбординг разработчика — и когда мешает учиться

Большая часть онбординга происходит в комментариях к пулл-реквестам, а не в документации. Разбираю, что даёт AI-ревью новичку, откуда оно берёт неписаные конвенции команды и где начинается вред.

Слогер 29.10.2026 ▲ 0
Карьера

Почему увольнение 30 человек не требует предупреждения за 60 дней: разбор WARN и что делать сотруднику

Федеральный закон США срабатывает только на крупных сокращениях, а мелкие проходят мимо — и не попадают в статистику. Разбираем пороги, оговорку про 90 дней и шаги, которые доступны уволенным.

Слогер 29.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Маркетинг

Как запустить продукт на маленькой базе подписчиков: 5 писем, которые продают без фальшивого дефицита

Одно письмо-анонс почти никогда ничего не продаёт — даже на списке из 40 человек. Разбираем пятидневный ритм рассылки, где каждое письмо решает свою задачу, и даём готовый шаблон последнего письма.

Слогер 28.10.2026 ▲ 1
Разработка

Как выгрузить вакансии и зарплатные вилки из Greenhouse API: разбор подводных камней

Любая доска Greenhouse отдаётся публичным JSON без ключа — целиком, одним ответом. Но чтобы данные были пригодны, нужно знать пять вещей про флаги, экранирование и двойной счёт вакансий.

Слогер 28.10.2026 ▲ 0
Маркетинг

Переезд (миграция) с Битрикс24 и amoCRM без потери данных: в Fluxs появился модуль миграции

4 000 контактов в Битрикс24. Сотни сделок. Задачи за несколько лет. И всё это нужно перенести в новую CRM? Раньше такой переезд мог занять несколько дней. А иногда именно из-за переноса данных компании годами оставались в неудобной системе. Мы решили эту проблему. 🚀 В Fluxs появился модуль «Миграция данных». Теперь можно переносить контакты, сделки, задачи, проекты и базу знаний из Битрикс24, amoCRM, Jira, Яндекс Трекера и Confluence. А если вашей системы нет в списке — загрузить данные через Excel, CSV или JSON.

fluxs.ru 27.10.2026 ▲ 1
Fluxs lenta
Реклама · fluxs.ru
Карьера

Чем Cal-WARN отличается от федерального WARN: разбор порогов, уведомлений и штрафов

Калифорния требует предупреждать о массовых сокращениях за 60 дней — как и федеральный закон США. Только порог ниже, парт-тайм считается, а правило одной трети не действует. Разбираем, что это меняет для работника и работодателя.

Слогер 27.10.2026 ▲ 0
Карьера

WARN Act: кто считается работодателем при массовом сокращении — разбор для дочек, холдингов и франшиз

По американскому закону уведомление за 60 дней обязан дать только работодатель. Разбираем, как регуляторы решают, какое юрлицо им является, и что делать, если в бумаге стоит незнакомая компания.

Слогер 27.10.2026 ▲ 0
Разработка

Разбор: почему профессию разработчика хоронят каждые 20 лет и как работать, когда всё меняется

Паника вокруг ИИ — не первая волна перемен в отрасли: похожие прогнозы звучали и в 1961 году, и в 2011-м. Разбираем, что в нынешней тревоге реально, а что стоит воспринимать как фоновый шум.

Слогер 27.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Страх провала и страх свидетелей: чем они отличаются и как начинать новое, когда страшно

«Я пока недостаточно хорош» — честная и бесполезная фраза. Обычно дело не в навыке, а в конкретных людях, которые увидят вашу первую попытку. Разбираем, как уменьшить ставку и всё-таки начать.

Слогер 26.10.2026 ▲ 0
Карьера

Почему удалёнка платит меньше — и в каких профессиях всё наоборот: разбор 8 049 вакансий

Медианная вилка на удалёнке ниже офисной на 6,5%. Но внутри функций разрыв меняет знак: безопасность и продажи получают премию за удалёнку, data/ML — самую большую скидку. Показываю, как читать эти цифры на переговорах.

Слогер 26.10.2026 ▲ 0