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

Кто ходит на ваш сайт: семь категорий автоматики

Слово «бот» склеивает семь сущностей с разными мотивами, разной ценностью для бизнеса и разной реакцией на блокировку — и почти все дорогие ошибки начинаются с того, что их не разделили. Ценность обращения определяется не тем, бот это или человек, а тем, чем вы платите за его отсутствие.

💡

Что здесь, а что рядом. Здесь — распознавание: кто стучится в сервер и чем это доказать. Какую политику доступа выбрать и как её записать — в статье про то, каких AI-ботов пускать на сайт. Постоянный учёт обращений нейросетей и связка с заявками — в статье про мониторинг AI-трафика.

КатегорияМотивЦена блокировки
Поисковые краулерыИндексация: HTML, sitemap, картинкиОрганика: страницы выпадают из индекса
AI-краулеры сбора данныхКопят корпус впрок, берут текстыВашего контента не будет в модели
AI-краулеры реального времениТянут страницу под заданный вопросВас не процитируют в ответе, который читают сейчас
Коммерческие SEO-краулерыСтруктура и ссылки для платформПодрядчик не увидит ваш сайт в отчётах
Парсеры и скрейперыЦены, остатки, тексты, контактыНичем — но опознать их труднее всего
Служебная автоматикаМониторинг, превью ссылок, вебхукиПревью не разворачиваются, платёж висит
Сканеры уязвимостейСтучатся в чужие админки и битые путиНичем. Что делать — в чек-листе защиты от взлома

User-Agent — самоподпись, а не документ

User-Agent — строка, которую клиент сам о себе пишет в заголовке, и подменяется она одним параметром командной строки, поэтому сама по себе не доказывает ничего. В протоколе нет механизма, заставляющего клиента говорить правду: сервер принимает заголовок как есть и как есть кладёт в лог. Браузер, curl и десять строк на Python одинаково свободны назваться чем угодно.

два запроса с одного адреса обе записи одинаково «честные»
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.ru/
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/128.0" https://example.ru/

# обе строки легли в access.log как есть, без всякой проверки
203.0.113.77 - - [01/Sep/2026:11:04:12 +0300] "GET / HTTP/1.1" 200 18422 "-" "...Googlebot/2.1..."
203.0.113.77 - - [01/Sep/2026:11:04:19 +0300] "GET / HTTP/1.1" 200 18422 "-" "...Chrome/128.0"

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

Подтверждение через обратный DNS

Заявившегося краулера подтверждают двойной DNS-проверкой: по адресу находят имя хоста, затем проверяют, что имя принадлежит домену вендора и резолвится обратно в тот же адрес. Одного обратного запроса мало: PTR-запись настраивает владелец адреса, и вписать в неё чужое имя технически можно. Прямую запись в зоне вендора подделать нельзя — доказательство не имя, а совпадение двух направлений.

шаг 1Берём IP из строки лога, делаем PTR-запрос: какое имя закреплено за адресом
тупикPTR пустой — зоны нет, идём к сверке по диапазонам
шаг 2Суффикс имени сверяем с документацией вендора; чужой — самозванец
шаг 3Прямой запрос A/AAAA по этому имени
подтверждёнАдрес совпал с исходным — это тот, кем назвался
отсевАдрес не совпал — подпись есть, документа нет
двойная проверка адреса из лога порядок шагов важен
IP=203.0.113.77
NAME=$(dig +short -x "$IP" | sed 's/.$//')   # шаг 1: имя по адресу
echo "PTR: ${NAME:-обратной записи нет}"
# шаг 2: суффикс сверяем с документацией вендора
dig +short "$NAME"                            # шаг 3: должен вернуть тот же $IP

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

Подтверждение по диапазонам вендора

Часть вендоров вместо обратных зон публикует машиночитаемые списки своих IP-диапазонов: сверка по списку быстрее DNS-проверки, но требует регулярного обновления файла. Разница в том, где хранится истина: при DNS-проверке — у вендора, при сверке — у вас на диске. Вендор добавляет подсети, устаревший файл — и легитимный краулер с нового адреса уезжает в «заявился, но не подтвердился».

Кто ходитЧем подтверждаетсяПри несовпадении
Поисковые системыОбычно обратная зона + панель вебмастераНе блокировать: сверить вторым способом
Крупные AI-вендорыЧаще список диапазонов, зона не у всехЛимит скорости, не блок
SEO-платформыПеречень адресов в справке платформыСпросить подрядчика: белый список или лимит
Краулер с ноутбука специалистаНичем: подтверждать нечемДоступ на время аудита, снять после
Служебная автоматикаИногда адреса в документации сервисаОпознавать по набору запрашиваемых адресов
Всё остальноеНичем — декларации нетТолько поведенческий профиль из раздела 6
⚠️

Любой список ботов устаревает, включая тот, что вы читаете. Таблица описывает метод, а не перечень: имена ботов, адреса файлов с диапазонами и суффиксы меняются каждые несколько месяцев. Пересматривайте их раз в квартал, а файл диапазонов обновляйте по расписанию.

Три уровня доказательства: от подписи до профиля

Порядок установления личности клиента: User-Agent даёт только гипотезу; подтверждает её двойная DNS-проверка, а где обратной зоны нет — сверка по опубликованным диапазонам вендора; тем, кто не заявился вовсе, остаётся поведенческий профиль.1Декларация: User-Agentклиент пишет её сам — этогипотеза, а не факт2Подтверждение личностидвойная DNS-проверка илисверка по диапазонам3Поведенческий профильдля тех, кто не представился:проверять больше нечего
Порядок работ. Как установить личность клиента по строке лога: декларация, подтверждение, поведение.

Что читать в логе сервера

Для расследования хватает шести полей стандартного лога: адрес, время, метод и URL, код ответа, размер ответа и User-Agent. Адрес — единственное поле, которое клиент не пишет сам. Время даёт ритм, URL — форму обхода, код ответа — главный вопрос регламента (200 или 403 у подтверждённых краулеров), размер — цену обращения.

четыре однострочника, с которых начинается любой разбор формат combined
# топ адресов
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

# топ User-Agent — это декларации, не факты
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -20

# распределение кодов ответа
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# сколько мегабайт отдано каждому UA — вот это уже деньги
awk -F'"' '{split($3,a," "); b[$6]+=a[2]} END {for (u in b) printf "%10.1f МБ  %sn", b[u]/1048576, u}' access.log | sort -rn | head -20

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

Парсер, который притворяется браузером

Если клиент объявляет себя обычным Chrome, отличить его от человека по заголовкам невозможно в принципе — здесь заканчиваются доказательства из запроса и начинается работа с поведением. Строка UA берётся из настоящего браузера и ротируется, headless-браузер выполняет JavaScript и принимает cookies, а запросы идут с резидентных адресов, неотличимых от домашних. Отпечатки TLS-рукопожатия существуют, но это инструмент специализированных сервисов, а не панели хостинга.

И про мотивы: снимая позиции сайта сервисом, вы сами заказчик парсинга. За парсингом вашего сайта часто стоит чей-то мониторинг цен, а не атака: повод соразмерять реакцию.

⚠️

Правило «блокировать всё, где в UA есть bot, crawler или spider» — чистый вред. Под него попадают поисковые и AI-краулеры, обязанные называть себя честно, генераторы превью и ваш мониторинг. Не попадает ровно тот, ради кого правило писали: у парсера в UA написано «Chrome».

User-Agent делит поток наблюдений надвое

Вопрос: клиент назвался краулером? Если да — заявку проверяют двойной DNS-проверкой или сверкой по диапазонам вендора. Если нет, в том числе когда парсер объявляет себя обычным Chrome, доказательств из запроса не остаётся и работать приходится с поведением.Клиент назвался краулером?ДАЗаявку можно проверитьдвойная DNS-проверка или сверка по диапазонамвендораНЕТОстаётся только поведениеу парсера в User-Agent написано «Chrome»
Схема. Представившемуся клиенту проверяют заявку, непредставившемуся остаётся только поведение.

Поведенческие признаки парсера

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

ПризнакКак выглядит в логахКого заденете по ошибке
Ровный ритм без суточных проваловОдинаковый интервал, ночью столько же, сколько в обедАптайм-мониторинг, ночные выгрузки в 1С и маркетплейсы
HTML без статикиСтраница отдана, а запросов к CSS, JS и картинкам нетСтатику раздаёт CDN мимо ваших логов; прогретый кэш; блокировщики
Последовательный переборПагинация подряд, инкремент ID, обход всех комбинаций фильтровКраулеры тоже обходят пагинацию; ваш аудит; предзагрузка ссылок
robots.txt не запрашивалсяТысячи страниц за сутки без обращения к файлу — или заходы в закрытые им разделыЛюди файл тоже не читают: работает только с массовостью. Механика — в статье про индексацию
Аномальные заголовкиПустой Accept, нет Accept-Language и Referer при входе на глубокую страницуЗаходы из закладок и мессенджеров тоже без Referer; приватные режимы
Нет cookies и сессииКаждый запрос как первый, сессия не переиспользуетсяПервый запрос нового посетителя; жёсткая приватность; прокси
Концентрация в подсети или ASСотня «разных браузеров» из одного диапазонаБизнес-центры за одним адресом, мобильный NAT, VPN, AI-краулеры из облаков

Правило порога: реагируем при совпадении трёх и более признаков на одном источнике. Один признак — гипотеза, три — профиль; проверьте её руками на конкретном адресе, прежде чем делать правилом.

Логи против счётчика

Разница между числом обращений в логах и числом визитов в счётчике за тот же период — самая быстрая оценка автоматического трафика, потому что счётчик считает только тех, кто выполнил JavaScript. Простой HTTP-клиент скрипт не выполняет и в статистику не попадает, а в логе есть всегда. «Логи минус счётчик» — верхняя оценка автоматики плюс люди с блокировщиками. Возьмите одинаковое окно и посмотрите, какая часть разницы объясняется подтверждёнными краулерами, а какая остаётся неопознанной. Интересна вторая.

сводка за сутки по трём корзинам разовая диагностика
# только успешные HTML-страницы, без статики
grep ' 200 ' access.log | grep -vE '.(css|js|png|jpe?g|webp|svg|ico|woff2?)( |?)' > html.log
wc -l html.log                                   # всего обращений

grep -icE  'bot|crawler|spider|slurp' html.log   # корзины 1+2: назвались ботом
grep -icvE 'bot|crawler|spider|slurp' html.log   # корзина 3: назвались браузером

# адреса первых двух корзин прогоняем через проверку из раздела 2
grep -iE 'bot|crawler|spider|slurp' html.log | awk '{print $1}' | sort -u

Если счётчик и цели не настроены, сравнивать не с чем — начните с настройки Метрики и целей. Это разовая проверка руками, а не постоянный мониторинг AI-трафика. И не превращайте результат в универсальную цифру: она верна только для вашего сайта и за это окно.

Сколько ресурсов реально уходит на ботов

Считать нужно не долю запросов, а долю отданных байт и долю времени генерации: бот, забирающий HTML из кэша, обходится дешевле человека, а бот, перебирающий фильтры каталога, оказывается самым дорогим клиентом сервера. «Доля запросов» вводит в заблуждение: человек за визит тянет страницу плюс десятки файлов статики, бот — одну. В запросах он выглядит скромно, а по нагрузке на базу бывает главным потребителем.

МетрикаКак посчитать из логаО чём говорит
Доля запросовСтроки источника к общему числу строкПочти ни о чём; нужна как фон
Доля отданных байтСумма размера ответа по UA (см. раздел 4)Цена канала: кто тянет тяжёлое
Доля времени генерацииСумма времени ответа — поле надо добавить в формат логаГлавная метрика: кто занимает процессор и базу
Доля промахов мимо кэшаСтатус кэширования на фронтенде по источникамМожно ли сделать бота бесплатным вместо блокировки
Доля 5xx в часы пикаКоды 500–504 по часам, боты и люди отдельноСовпадает ли пик бота с пиком продаж

Дорогой бот указывает не на бота, а на дефект структуры. Если обход генерирует сотни тысяч адресов, смотрите на то, что он нашёл: обычно это комбинаторный взрыв на фильтрах, тема структуры каталога и фильтров. Блокировка уберёт симптом, адреса останутся. Заодно проверьте Core Web Vitals: они меряются на живых визитах и проседают, когда сервер занят.

💡

Прежде чем блокировать дорогого бота, посчитайте, сколько стоит закэшировать то, что он берёт. Закэшированный ответ отдаётся за копейки, и уже безразлично, кто его запросил. Бонусом ускоряется сайт для людей — тот же кэш, что вы и так строите для посетителей.

Доля запросов или доля ресурсов: что мерить

Слева метрика «доля запросов»: человек за визит тянет страницу и десятки файлов статики, бот — одну, поэтому в запросах он выглядит скромно. Справа то, что считать на самом деле: доля отданных байт, доля времени генерации, доля промахов мимо кэша и доля 5xx в часы пика.Доля запросовСтроки источника к общему числу строк логаЧеловек за визит тянет страницу и десяткифайлов статикиБот забирает одну страницу и выглядит скромноПочти ни о чём не говорит: нужна только как фонБайты и время генерацииДоля отданных байт: цена канала, кто тянеттяжёлоеДоля времени генерации: кто занимает процессори базуДоля промахов мимо кэша: можно ли сделатьбота бесплатнымДоля 5xx в часы пика: совпадает ли пик бота спиком продаж
Сравнение. Почему доля запросов вводит в заблуждение и какие метрики показывают реальную цену обращения.

Три реакции: лимитировать, удешевить, заблокировать

Порядок реакции такой: сначала удешевить ответ кэшем, затем ограничить частоту и только потом блокировать — адресно и с датой пересмотра правила. Приоритет: сначала удешевляем, потом лимитируем, блокируем только адресно и с датой пересмотра.

МераКому применятьГлавный риск
Кэш вместо генерацииВсем, включая людейУстаревшие данные при непродуманной инвалидации
Лимит частоты по адресуЗаявившимся, но не подтверждённымNAT: за одним адресом может быть бизнес-центр
Лимит по подсети или ASИсточникам, размазанным по адресам облакаAI-краулеры ходят из облаков — правило бьёт по ним первым
Ответ 429 с Retry-AfterТем, кого ограничиваете, а не запрещаетеПочти нет: 403 трактуется как запрет доступа и может отразиться на обходе
Интерактивная проверкаТочечно: формы, вход, поиск, корзинаНа обычных страницах ломает любой автодоступ, включая нужный
Скорость обхода в панели вебмастераПоисковым системамВозможности панелей меняются — проверьте, что доступно сейчас
Полный блок на WAF или у хостераТолько адресно, по доказанному профилюОшибку увидите через недели — по падению показов

Про robots.txt здесь одна мысль: это просьба, а не механизм принуждения — тот, кто парсит вас вопреки правилам, файл не читает. Кого и как в нём закрывать — в статье про robots.txt для AI-ботов.

Цена широкого правила

Обращения от AI-систем делятся на три вида с разной коммерческой ценностью, а правило «резать ботов» бьёт по всем трём одинаково — включая то, за которым стоит живой человек, уже спросивший про вас.

  • Краулер сбора впрок. Ходит независимо от чьих-либо вопросов. Потеря отложенная и трудноизмеримая.
  • Краулер реального времени. Забирает страницу в момент формирования ответа. Отказ — «источник недоступен» в ответе, который читают сейчас.
  • Агент по поручению пользователя. Идёт по ссылке от имени человека: блокируя его, вы блокируете не бота, а клиента, которого к вам привели.
⚠️

Правила, которые выглядят безобидно и режут выручку: блокировка облачных диапазонов целиком (AI-краулеры ходят именно оттуда); блокировка по подстроке «bot» в User-Agent; включённая по умолчанию «защита от ботов» у хостера или CDN, в исключения которой никто не заглядывал; интерактивная проверка на всех страницах, а не только на формах; отказ клиентам без cookies.

Сигнал запаздывает: сначала перестанут переобходиться страницы, потом просядут показы, потом вас перестанут называть в ответах — и падение уже никто не свяжет с галочкой месячной давности. Доступность для краулера — предусловие всего, что нужно, чтобы попадать в ответы нейросетей: месяцы работы над тем, чтобы вашу компанию называли, обнуляются одним правилом в WAF.

⚠️

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

Регламент проверки правил

После каждого изменения правил проверьте три вещи: коды ответов для подтверждённых краулеров в логах, доступность страниц в панелях вебмастеров и живой запрос с внешнего адреса.

  • У каждого правила есть автор, причина и дата пересмотра. Записанные там же, где само правило, а не в переписке.
  • Неделя наблюдения. Если платформа даёт режим «только логировать», новое правило неделю живёт в нём.
  • Ежедневный отчёт по 403 и 429 для подтверждённых краулеров. Там должен быть ноль; любая строка разбирается в тот же день.
  • Проверка ключевых страниц в панелях вебмастеров. Вручную, по десятку страниц, которые приносят деньги.
  • Контрольный запрос со стороннего адреса. Не из офиса, чей IP давно в белом списке.
  • Проверка без cookies и без JavaScript. Именно так страницу видит краулер.
💡

Заведите белый список подтверждённых краулеров, который проверяется до всех остальных правил. Тогда любая новая эвристика — ваша, хостера или WAF — физически не может их задеть. У такой работы должен быть владелец: это регулярное обслуживание сайта, а не разовая задача.

Правила, которые режут выручку, и что от них страхует

Опасные настройки: блокировка облачных диапазонов целиком, блокировка по подстроке «bot», защита от ботов по умолчанию, интерактивная проверка на всех страницах, отказ клиентам без cookies. Страхует: дата пересмотра у правила, неделя логирования, отчёт по 403 и 429, белый список краулеров.Страхует от ошибкиУ правила есть автор, причина и датапересмотраНеделя в режиме «только логировать»Ежедневный отчёт по 403 и 429 дляподтверждённых краулеровКонтрольный запрос со стороннего адреса, не изофисаБелый список краулеров, который проверяетсядо всех правилРежет выручкуБлокировка облачных диапазонов целикомБлокировка по подстроке «bot» в User-Agent«Защита от ботов» по умолчанию, в исключенияне заглядывалиИнтерактивная проверка на всех страницах, а нена формахОтказ клиентам без cookies
Сравнение. Слева — настройки, которые выглядят безобидно и стоят видимости, справа — регламент проверки правил.

Типичные ошибки

Почти все дорогие ошибки сводятся к одному: правило приняли по декларации, а не по подтверждению, и не поставили дату пересмотра.

  • Верить User-Agent без проверки. Отчёты считают самоподписи, решения — по вымышленным данным.
  • Блокировать по подстроке «bot» или облачные диапазоны целиком. Отсекаются честные краулеры, включая AI-ботов из тех же облаков; парсер под видом Chrome не задет вовсе.
  • Отвечать 403 там, где нужен 429. Краулер читает это как запрет доступа, а не как «зайди позже».
  • Включить «защиту от ботов» и не посмотреть, кого она режет. Падение потом объясняют чем угодно, кроме галочки.
  • Реагировать на один поведенческий признак. Под правило попадают люди с блокировщиками и ваш мониторинг.
  • Считать долю ботов в запросах. Дешёвый выглядит страшно, дорогой прячется за скромным числом обращений.
  • Не оставлять причину, автора и дату пересмотра. Через год правило боятся трогать.
  • Хранить логи сутки. Месячную аномалию расследуют по памяти, то есть никак.
  • Искать бота вместо починки структуры URL, которая его кормит. Симптом уходит, причина остаётся.
  • Путать парсера с посетителем, приведённым агентом. Во втором случае вы отказываете клиенту, а не роботу.

Что в итоге

Распознавание сводится к трём уровням: User-Agent даёт гипотезу, DNS-проверка или официальный список диапазонов её подтверждает, а тем, кто не заявляется вовсе, остаётся поведенческий профиль. Принцип один: доверять подтверждению, а не декларации. Всё, что построено на самоподписи клиента, — учёт намерений, а не фактов.

Вторая часть дела — экономика. Меряйте нагрузку в отданных байтах и времени генерации: часто выяснится, что закэшировать дешевле, чем воевать. Дорогой бот указывает на дефект структуры сайта — он не создаёт сотни тысяч адресов, он их находит.

Риски несимметричны. Пропущенный парсер стоит вам части данных — неприятно, но конечно. Лишнее правило стоит видимости в поиске и в ответах нейросетей, обнаруживается через недели и не всегда связывается с причиной. Поэтому по умолчанию — узкое правило с датой пересмотра.

Что сделать на этой неделе: продлить хранение логов; снять сводку по трём корзинам за сутки; проверить, что подтверждённые краулеры получают 200, а не 403; прочитать, что включено в «защите от ботов» у хостера или CDN.

Не уверены, кто грузит ваш сайт и не режете ли вы нужных?

Разберём логи сервера, проверим коды ответа для подтверждённых краулеров и покажем, во что обходится текущая настройка защиты.

Получить бесплатный аудит