«Яндекс молча выкатил фильтр»: как я три недели искал санкции, которых не было

В начале сентября у моего рабочего сайта за двое суток просели 181 запрос из 200, которые я отслеживаю в Топвизоре. Коммерческие запросы стояли на 1–5 местах, а оказались на 15–25. Клики в Яндекс Вебмастере упали с 2 740 до 88 в сутки. В профильных телеграм‑каналах как раз писали, что Яндекс «молча выкатил фильтр, который убил тысячи сайтов».
Я занимаюсь поиском с 2005 года, но первая мысль у меня была та же: санкции. Три недели ушло на то, чтобы доказать себе обратное. Ниже — что именно я проверял, где оказалась ошибка и короткий порядок действий. Надеюсь, кому‑то он сэкономит эти три недели.
Исходные данные
Важная деталь: за три недели до обвала сайт переехал на новый домен. Постраничный 301, переезд оформлен в Вебмастере, старый домен продлён. Всё по инструкции.
Новый домен Яндекс начал индексировать с нуля. Вот как росло число страниц в поиске:
Дата | Страниц в поиске |
|---|---|
21.08 | 0 |
27.08 | 25 |
31.08 | 214 |
02.09 | 1 836 |
06.09 | 1 750 |
10.09 | 1 911 |
20.09 | 1 994 |
28.09 | 2 068 |
Обратите внимание на 6 сентября: минус 86 страниц ровно в дни «обвала». Тогда я этому значения не придал.
Что я проверил и исключил
Сначала прошёлся по очевидному:
Индекс цел. 1 864 страницы на 9 сентября против 1 836 на 2-е — сайт не вылетал.
Диагностика Вебмастера: 32 проверки из 33 «проблемы нет». Одна в статусе UNDEFINED — это значит «не проверялось», а не «проблема». Я сначала прочитал её как «Яндекс пометил сайт немобильным» и потерял на этом полдня.
Склейка зеркал корректна: у старого домена в API Вебмастера поле
main_mirrorуказывает на новый. У новогоmain_mirror: null— это означает «сам главное зеркало», а не «зеркало не задано». Ещё одна ловушка, в которую я попал.ИКС не изменился — 160.
Упали коммерческие запросы, а информационные почти нет. Значит, дело не в недавней правке нескольких сотен статей блога.
Всё чисто, а позиции лежат. Классическая картина «тихого фильтра». Я даже написал в поддержку Яндекса.
Где была ошибка: в цифрах «до»
Пока ждал ответа, выгрузил из API Вебмастера показы и клики по дням и посмотрел не на падение, а на то, что было перед ним.
1–7 сентября сайт получал около 30 000 показов и 3 000 кликов в сутки. CTR 10–18% при средней позиции 7,5. Для коммерческой выдачи с рекламой сверху и колдунщиками это неправдоподобно много. И главное — в Метрике такого количества людей из поиска не было. Клики в Вебмастере были, а визитов не было.
Дальше разбил запросы на две группы: содержащие название домена и все остальные.
Группа | Запросов | Показы | Клики | CTR |
|---|---|---|---|---|
С названием домена | 274 | 44 856 | 12 655 | 28,2% |
Остальные | — | — | — | 8,6% |
57% всех кликов сайта приходились на запросы вида «название услуги + мой домен». Живые люди так не ищут. Так ищут боты, которые гоняют через выдачу чужие сайты и используют мой как «попутный»: заходят на несколько сайтов из выдачи, чтобы цепочка выглядела естественно. Я никого не заказывал, но статистику мне это нарисовало.
8 сентября Яндекс перестал засчитывать эти клики: 2 740 → 88. Реальный CTR сайта оказался 1,5–2%. Упал не сайт — из статистики исчез мусор, который делал красивый график.
Почему позиции «упали»
Здесь сработали сразу два фактора.
Первый — переклейка. Новый домен ещё набирал индекс, страницы входили и выходили, и выдача по нему болталась.
Второй — сам способ замера. Позже, уже в октябре, я снимал позиции одной и той же семантики два раза с разницей в час. Из 27 запросов 13 разошлись больше чем на 10 мест. «seo продвижение сайта» — 10 и 58. «seo услуги» — 43 и 12. Контрольный прогон подряд: «seo услуги» 43 → 27, «раскрутка сайта» 21 → вне топ-100.
То есть разброс внутри одного часа больше, чем суточная динамика. Одиночный съём в такой период — это не позиция, а шум. Сейчас я снимаю три прогона и беру медиану, а все три значения храню рядом, чтобы видеть разброс:
from statistics import median
def pozitsiya(zapros, prohody=3):
zamery = [snyat(zapros) for _ in range(prohody)] # None = не нашли в топ-100
najdeno = [z for z in zamery if z is not None]
if len(najdeno) < (prohody // 2 + 1): # не нашли в большинстве прогонов
return None, zamery
return median(najdeno), zameryСредние позиции из самого Вебмастера за сентябрь, кстати, были спокойными: «seo продвижение» 8,8, «раскрутка сайта» 7,6, «продвижение сайтов» 9,8. Это реальные показы, а не разовый замер, и они просто не совпадали с тем, что рисовал съём позиций.
Ответ поддержки и что было дальше
27 сентября пришёл ответ: никаких ограничений на сайт не наложено. К этому моменту показы уже вернулись сами: 19.09 — 3 871 в сутки, 26.09 — 24 546. Визиты из Метрики выросли с 185 до 404 в день, и это уже были люди.
Если бы я в первую неделю начал «лечить фильтр» — переписывать тексты, снимать ссылки, перекраивать структуру, — я бы наложил свои правки поверх переклейки и уже никогда не понял, что помогло, а что навредило. Единственное, что я сделал правильно, — поставил на паузу массовые изменения на сайте на 2–3 недели.
Ещё два «фильтра», которые фильтрами не были
Код OTHER в истории обхода. 27–28 сентября Вебмастер показал 180 и 110 страниц с кодом OTHER — до и после стабильно ноль. OTHER — это не 4xx и не 5xx, а «ответа не было вовсе»: таймаут или обрыв. Совпало с тем, что я заливал на сервер с двумя ядрами 100 видеофайлов на 5,9 ГБ. Сервер был занят, робот получал таймауты. Такие страницы не переобходятся и могут выпасть из индекса — снаружи это выглядит как «Яндекс выкидывает страницы без причины».
Волна ботов в октябре. 2 октября с 19:00 на сайт пошло 450–490 визитов в час круглосуточно вместо обычных 20–40. Медиана визита — 5 секунд, одна страница, 100% прямые заходы, 100% Chrome Mobile на Android. При этом 96% трафика шло из четырёх подсетей дата‑центров. Мобильный Android не выходит в сеть с адресов хостинга — это видно сразу.
Поддержка Яндекса на вопрос об этом ответила, что такие переходы на положение сайта в поиске не влияют. То есть блокировка нужна не ради позиций, а ради чистой Метрики и нагрузки на сервер. Блокировал в .htaccess, и тут тоже была ловушка: на моём сервере связка <RequireAll> + Require not ip не срабатывала вообще, страница отдавала 200. Работает только mod_rewrite:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^91\.142\.85\. [OR]
RewriteCond %{REMOTE_ADDR} ^178\.250\.154\. [OR]
RewriteCond %{REMOTE_ADDR} ^109\.248\.57\. [OR]
RewriteCond %{REMOTE_ADDR} ^2a00:f2a0:0:f450:
RewriteRule ^ - [F,L]Перед этим я сверил диапазоны с адресами роботов Яндекса и Googlebot — пересечений ноль. Блокировать по стране или городу не стоит: отрежете живых людей. И проверьте, что X-Forwarded-For у вас не пустой, прежде чем на него опираться, — у меня он был пустой, а правильный адрес лежал в REMOTE_ADDR.
Порядок проверки, прежде чем говорить «фильтр»
Был ли переезд, смена зеркала или HTTPS за последние два месяца? Смотрите историю числа страниц в поиске, а не текущую цифру. Провал на 5–10% в дни «обвала» — это переклейка.
Сравните клики Вебмастера с визитами из поиска в Метрике. Если кликов заметно больше, чем визитов, часть кликов делают не люди. Их исчезновение — это не падение.
Посчитайте долю запросов с названием домена или бренда и их CTR. CTR под 30% на «услуга + домен» при 8% у остальных — признак чужой накрутки через ваш сайт.
Не верьте одному замеру позиций. Минимум три прогона и медиана. Сравнивайте со средней позицией в Вебмастере.
Посмотрите историю обхода на коды OTHER и 5xx. Если они совпали с тяжёлыми работами на сервере — это таймауты, а не санкции.
Откройте «Безопасность и нарушения» в интерфейсе. Санкции за поведенческие факторы в API Вебмастера не отдаются, «чистая диагностика» их не исключает.
Напишите в поддержку с цифрами — даты, показы, клики, примеры запросов. Отвечают дольше, чем хочется, но по существу.
До ответа ничего массово не меняйте на сайте. Иначе потом не отделите причину от следствия.
Тихие фильтры у Яндекса бывают, спорить не буду. Но за двадцать лет я видел куда больше сайтов, которые «уронил фильтр», а на деле уронили переезд, сервер, боты или кривой съём позиций. Сначала диагноз — потом лечение.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.