Коротко. ИИ-краулер — это обычный HTTP-клиент: он делает один GET, забирает исходный HTML и уходит. Он не хранит куки, редко возвращается и, за исключением Google, нигде публично не обещает исполнять JavaScript. Ботов три класса: обучающие, индексирующие для ответа и загружающие страницу по запросу пользователя — у последних правила robots.txt могут не применяться. Проверяется всё это по логам сервера.

Что делает ИИ-краулер и чем он отличается от поискового
Механика совпадает: разрешить имя, установить соединение, запросить /robots.txt, запросить страницу, разобрать HTML, вытащить ссылки. Разные у них цели. Поисковый робот собирает индекс, чтобы потом выдать список ссылок; ИИ-краулер собирает текст, из которого модель соберёт связный ответ и, если повезёт, поставит рядом ссылку на источник.
Отсюда практические различия. Поисковику важна страница целиком и её место в структуре сайта. Модели важен фрагмент: абзац, который сам по себе отвечает на вопрос. Поисковик вернётся ещё раз, если страница обновится, — у ИИ-обхода частота ниже и предсказуемость хуже, поэтому цена одной неудачной попытки выше.
Главное следствие: у ИИ-краулера обычно нет второй попытки в разумном горизонте. Если в момент обхода вы отдали 503 или пустой каркас, это и станет вашим представлением о сайте на неопределённый срок.
Три класса ботов: обучение, индекс, загрузка по запросу
Ошибка «заблокировал ИИ-ботов» чаще всего означает, что заблокирован один токен из трёх, а остальные два продолжают работать — или наоборот, вместе с обучением отрезан поиск. Операторы сами разделяют роли и документируют их.
| Токен | Класс | Оператор | Что делает |
|---|---|---|---|
| GPTBot | Обучение | OpenAI | Сбор материалов, которые могут попасть в обучающие наборы |
| OAI-SearchBot | Индекс для ответа | OpenAI | Индексация, чтобы сайт появлялся в поисковых ответах ChatGPT |
| ChatGPT-User | Загрузка по запросу | OpenAI | Заход на страницу в момент вопроса пользователя; не используется для автоматического обхода |
| OAI-AdsBot | Служебный | OpenAI | Проверка посадочных страниц, отправленных как реклама |
| ClaudeBot | Обучение | Anthropic | Сбор веб-контента для обучения моделей |
| Claude-SearchBot | Индекс для ответа | Anthropic | Индексация для качества и точности поисковых ответов |
| Claude-User | Загрузка по запросу | Anthropic | Заход на сайт, когда пользователь задаёт вопрос |
| PerplexityBot | Индекс для ответа | Perplexity | Индексация для выдачи со ссылками; для обучения моделей не используется |
| Perplexity-User | Загрузка по запросу | Perplexity | Заход по запросу пользователя; по документации обычно игнорирует robots.txt |
| Googlebot | Индекс | Обычный обход; на его индексе строятся и AI Overviews | |
| Google-Extended | Только токен | Не имеет собственной строки User-Agent. Управляет обучением Gemini и подгрузкой контента в ответ | |
| Applebot / Applebot-Extended | Индекс / токен | Apple | Applebot обходит сайт, Applebot-Extended — отказ от использования в обучении |
| CCBot | Открытый корпус | Common Crawl | Публичный датасет, на котором обучаются многие |
Разница между классами не косметическая. Запрет обучающего токена не убирает вас из ответов, а запрет индексирующего — убирает. Пользовательские загрузки инициирует человек, и операторы прямо предупреждают, что robots.txt к ним может не применяться.
Сценарии разрешений и готовые блоки robots.txt разобраны в отдельном материале; здесь важнее, как эти токены выглядят на входе сервера.
Как выглядит запрос краулера на сервере
Возьмите реальный запрос из логов и сравните с браузерным. Отличий несколько, и все они полезны для отладки.
- Один метод — GET. Формы, кнопки и всё, что требует POST, для бота не существует.
- Нет кук и нет сессии. Контент, доступный «после согласия с баннером» или после закрытия модального окна, бот увидит только если он есть в HTML сразу.
- Как правило, нет заголовка
Referer. Логика вида «показать полный текст только пришедшим из поиска» отрезает бота. - Строка User-Agent содержит адрес документации. Всё, что идёт после
+, — это URL оператора. Незнакомая строка проверяется именно так. - Отдельная пометка для robots.txt. OpenAI документирует, что при запросе
robots.txtв строку может добавляться маркерrobots.txt— чтобы владелец отличал этот запрос, даже если в логах не пишутся пути.
Воспроизвести запрос бота можно точно, включая заголовки:
UA='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot'
curl -sS -D - -o /dev/null -A "$UA" \
-H 'Accept: text/html,application/xhtml+xml' \
-H 'Accept-Encoding: gzip, br' \
https://example.com/page
Смотрите в ответе три вещи: код, Content-Type и наличие Vary: User-Agent. Последнее — тревожный сигнал: значит, сервер или CDN отдаёт разное содержимое разным агентам, и надо понимать, что именно достаётся боту.
Исполняют ли ИИ-краулеры JavaScript
Честный ответ: по-разному, и почти никто не берёт на себя публичных обязательств.
- Google — единственный из перечисленных, кто документирует рендеринг: Googlebot отрисовывает страницы, а AI Overviews строятся на индексе Google. Но и там подключённые ресурсы тянутся отдельно и подпадают под лимиты размера.
- OpenAI, Anthropic, Perplexity — в публичной документации ботов исполнение JavaScript не описано и не обещано. Строить на этом стратегию нельзя.
Вместо веры проверьте по своим логам. Метод простой: возьмите IP, с которого приходил бот, и посмотрите, какие типы файлов он запрашивал в тот же промежуток.
BOTIP=203.0.113.10
awk -F'"' -v ip="$BOTIP" 'index($1, ip)==1 {split($2,r," "); print r[2]}' /var/log/nginx/access.log \
| grep -oE '\.[a-z0-9]+' | sort | uniq -c | sort -rn
Как читать вывод. Если в списке только HTML-адреса и ничего больше — рендеринга не было, бот забрал разметку как текст. Если рядом видны запросы к .js, .css и к вашим API-эндпоинтам с того же адреса и в те же секунды — значит, страница отрисовывалась. Это не догадка, а факт из ваших логов.
Практическое правило не меняется от результата: ключевой текст должен быть в исходном HTML. Даже там, где рендеринг есть, он стоит ресурсов и происходит с задержкой — а разметка без скриптов читается всегда и сразу.

Что видит краулер и что видит человек
Главный источник заблуждений — панель «Элементы» в DevTools. Она показывает DOM после исполнения скриптов, то есть результат, которого у бота может не быть. Сравнивать надо сырой ответ.
curl -sL -A "$UA" https://example.com/page \
| python3 -c "import sys,re,html
t=sys.stdin.read()
t=re.sub(r'(?is)<script.*?</script>|<style.*?</style>|<!--.*?-->',' ',t)
t=re.sub(r'(?s)<[^>]+>',' ',t)
t=re.sub(r'\s+',' ',html.unescape(t)).strip()
print('слов в сыром HTML:', len(t.split()))
print(t[:500])"
Дальше сопоставьте число с тем, что видно на экране. Типичные расхождения повторяются от сайта к сайту.
| Что на экране | Что в сыром HTML | Почему так | Что делать |
|---|---|---|---|
| Полная статья | Шапка, меню, футер | Тело рендерится на клиенте | Серверный рендеринг или предрендер шаблона |
| Таблица характеристик | Пусто | Данные подгружаются отдельным запросом | Отдавать первый экран данных в HTML |
| Текст во вкладках и аккордеонах | Обычно есть | Скрыт стилями, но присутствует в разметке | Ничего; это рабочий вариант |
| Отзывы, цены, наличие | Пусто | Виджет стороннего сервиса | Дублировать ключевые значения текстом |
| Цифры на инфографике | Пусто | Текст внутри изображения | Повторить числа текстом или таблицей |
| Контент под баннером согласия | Есть или нет — зависит от реализации | Часть баннеров блокирует отрисовку тела | Не блокировать основной контент баннером |
Приёмы, которые возвращают текст в разметку, разобраны в материале про извлекаемость контента. Пошаговая проверка своей страницы — в чек-листе AI-готовности.
Лимиты: сколько байт и сколько времени
Бот не скачивает документ бесконечно. Публичные числа есть только у Google, и они полезны как ориентир для всех.
- Размер страницы. При обходе для поиска Google берёт первые 2 МБ поддерживаемого типа файла и первые 64 МБ файла PDF. Лимит считается по несжатым данным. Всё, что после отсечки, не рассматривается.
- Подключённые ресурсы. Каждый CSS- и JS-файл тянется отдельным запросом и подпадает под тот же лимит.
- robots.txt. Google обрабатывает первые 500 КиБ файла; остальное игнорируется. Правило, уехавшее за эту границу, просто не существует.
- Остальные операторы своих чисел не публикуют. Единственный корректный вывод — держать запас и мерить.
curl -sL -o /tmp/p.html -A "$UA" \
-w 'code=%{http_code} ttfb=%{time_starttransfer}s total=%{time_total}s redirects=%{num_redirects}\n' \
https://example.com/page
wc -c /tmp/p.html
curl -sL -H 'Accept-Encoding: gzip' -o /tmp/p.gz https://example.com/page
printf 'сжатый: %s байт, несжатый: %s байт\n' "$(wc -c < /tmp/p.gz)" "$(gunzip -c /tmp/p.gz | wc -c)"
Норма: несжатый HTML — сотни килобайт, TTFB меньше примерно 0,8 с, редиректов не больше одного. Тревога: мегабайты разметки из-за встроенных данных, цепочка из трёх редиректов, секунды до первого байта. Про сжатие есть отдельный разбор, замерить с внешнего узла удобно через проверку скорости и анализ заголовков.
Как найти ИИ-краулеров в логах nginx
Логи — единственное место, где видно, что происходит на самом деле. По умолчанию nginx пишет формат combined, в котором строка User-Agent идёт последним полем в кавычках, — этого достаточно.
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Дальше всё делается тремя разборами. Первый — кто вообще приходил:
LOG=/var/log/nginx/access.log
awk -F'"' '{print $6}' "$LOG" \
| grep -oiE 'GPTBot|OAI-SearchBot|ChatGPT-User|OAI-AdsBot|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|CCBot|Applebot|Googlebot|bingbot|YandexBot' \
| sort | uniq -ci | sort -rn
Второй — с какими кодами им отвечали. Здесь и всплывает блокировка на WAF, о которой владелец не знал:
awk -F'"' '$6 ~ /GPTBot|OAI-SearchBot|PerplexityBot|ClaudeBot/ {split($3,s," "); print s[1]}' "$LOG" \
| sort | uniq -c | sort -rn
Как читать. Преобладание 200 — всё в порядке. Заметная доля 403 или 429 — вас режет WAF или лимит запросов. Много 301 — бот тратит обход на редиректы вместо контента. Много 404 — в карте сайта или в ссылках остались мёртвые адреса.
Третий разбор — что именно они забирали:
awk -F'"' '$6 ~ /GPTBot|OAI-SearchBot/ {split($2,r," "); print r[2]}' "$LOG" \
| sort | uniq -c | sort -rn | head -20
Если в топе фильтры каталога, сортировки и адреса с параметрами — бюджет обхода уходит в мусор, а важные страницы остаются непрочитанными. Лечится закрытием параметрических адресов в robots.txt и канонизацией.
И динамика по дням — чтобы увидеть, когда обход прекратился:
awk -F'"' '$6 ~ /PerplexityBot/ {split($1,d,"["); split(d[2],e,":"); print e[1]}' "$LOG" \
| sort | uniq -c
Ноль строк по всем ИИ-токенам за месяц — это не «нас не любят». Это либо блокировка на уровне CDN, до которой запросы просто не доходят до вашего nginx, либо сайт нигде не связан ссылками и его некому обнаружить.
Если логи ротируются и старые лежат сжатыми, добавьте zcat: zcat -f /var/log/nginx/access.log* — и те же три разбора работают по всей истории. Больше про разбор журналов — в гайде по логам nginx.

Как отличить настоящего бота от подделки
Строка User-Agent подделывается одной опцией curl. Подставляются под известных ботов и парсеры, и сканеры уязвимостей, и накрутчики — расчёт на то, что для «поисковика» вы отключите защиту. Верить строке нельзя; проверять надо адрес.
Есть два надёжных способа, и они дополняют друг друга.
Способ 1. Опубликованные диапазоны адресов
Крупные операторы выкладывают списки своих подсетей машиночитаемо. Скачайте нужный и сверьте адрес из логов:
curl -s -o /tmp/gptbot.json https://openai.com/gptbot.json
python3 - 203.0.113.10 <<'PY'
import json, ipaddress, sys
ip = ipaddress.ip_address(sys.argv[1])
data = json.load(open('/tmp/gptbot.json'))
nets = [ipaddress.ip_network(p.get('ipv4Prefix') or p.get('ipv6Prefix')) for p in data['prefixes']]
print(sys.argv[1], 'принадлежит оператору' if any(ip in n for n in nets) else 'ОПЕРАТОРУ НЕ ПРИНАДЛЕЖИТ')
PY
| Оператор | Где список | Обратный DNS |
|---|---|---|
| OpenAI | gptbot.json, searchbot.json, chatgpt-user.json | Сверяйте по диапазонам |
| Anthropic | crawling/bots.json | Сверяйте по диапазонам |
| Perplexity | perplexitybot.json, perplexity-user.json | Сверяйте по диапазонам |
| common-crawlers.json | Поддерживается и документирован | |
| Common Crawl | — | Выделенные диапазоны с обратным DNS; оператор прямо предупреждает о подделках CCBot |
Списки обновляются, поэтому в правилах WAF их надо тянуть по расписанию, а не копировать один раз руками. Perplexity в документации прямо рекомендует автоматизировать обновление.
Способ 2. Обратный DNS с прямой перепроверкой
Там, где оператор публикует PTR-записи, работает классическая двусторонняя проверка: адрес → имя → снова адрес. Одного шага мало: PTR может указать куда угодно, поэтому обязательна прямая перепроверка.
IP=66.249.66.1
NAME=$(dig +short -x "$IP" | sed 's/\.$//')
echo "PTR: $NAME"
dig +short "$NAME"
Пройдено: имя заканчивается на домен оператора, и прямой запрос по этому имени возвращает тот же самый адрес. Не пройдено: PTR отсутствует, ведёт на посторонний домен или прямой запрос даёт другой адрес — перед вами подделка либо адрес, который надо проверять по опубликованным диапазонам.
Никогда не открывайте доступ в WAF по одной строке User-Agent. Правило «пропускать всё, где написано GPTBot» — это приглашение обойти защиту одной опцией командной строки. Условие должно быть двойным: строка агента И адрес из списка оператора.
Частота обхода, Crawl-delay и нагрузка
ИИ-краулеры обычно ходят реже поисковых и заметно неравномернее: серия запросов, потом тишина на недели. Управлять этим можно ограниченно.
- Crawl-delay — нестандартное расширение. Anthropic документирует его поддержку для своих ботов. Google прямо указывает, что
crawl-delayне поддерживает: поле будет проигнорировано. - Ограничение по количеству запросов на уровне nginx или CDN действует всегда, но 429 в ответ боту — это отказ, а не вежливая просьба подождать. Сначала посмотрите на реальную нагрузку в логах.
- Блокировка по IP — плохой инструмент: Anthropic предупреждает, что она мешает боту прочитать сам
robots.txt, и потому отказ через неё не гарантируется. Отказываться нужно директивами.
awk -F'"' '$6 ~ /ClaudeBot|GPTBot|PerplexityBot/ {print}' "$LOG" | wc -l
awk -F'"' '$6 ~ /ClaudeBot|GPTBot|PerplexityBot/ {split($1,d,"["); split(d[2],e,":"); print e[1]" "e[2]}' "$LOG" \
| sort | uniq -c | sort -rn | head
Вывод показывает часы пиковой активности. Если пик составляет доли процента от вашего обычного трафика — ограничивать нечего, и любые лимиты только отрежут цитирования.
Разбор ошибок: симптом, причина, проверка, фикс
| Симптом | Вероятная причина | Чем проверить | Что сделать |
|---|---|---|---|
| В логах нет ни одного ИИ-токена | Блокировка на CDN до nginx либо отсутствие входящих ссылок | Логи CDN, curl -A с бот-строкой | Разрешить токены на периметре, добавить страницу в карту сайта |
| Токены есть, но код 403 или 429 | Правило WAF или лимит запросов | Разбор кодов по агентам | Правило «агент И адрес из списка оператора» с действием «пропустить» |
| Код 200, но передано 3–5 КБ | Отдаётся страница-челлендж, а не контент | %{size_download} у curl | Исключить бота из проверки на человечность |
| Бот забирает только фильтры и параметры | Обход уходит в бесконечные комбинации | Топ путей по агенту | Закрыть параметрические адреса, оставить канонические |
| Приходит незнакомая строка агента | Подделка под известного бота | Диапазоны адресов и обратный DNS | Блокировать адрес, а не строку |
| Обход был и прекратился | Правка robots.txt, редирект домена, серия 5xx | Динамика по дням, история кодов | Откатить правило, починить ответы, дождаться следующего цикла |

Как проверить
Команды выше отвечают на вопрос по одной странице и одному логу. Быстрее получить общую картину помогают готовые проверки:
- Проверка AI-готовности — доступ для краулеров, текст в исходном HTML, разметка, llms.txt.
- Проверка robots.txt — какая группа применится к конкретному токену и адресу.
- Валидатор llms.txt — синтаксис и живые ссылки внутри файла.
- Анализ заголовков — коды, редиректы,
Vary, кеширование. - Проверка редиректов — цепочки, которые бот проходит вместо чтения контента.
- Замер скорости и мониторинг доступности — чтобы обход не пришёлся на 5xx.
Смежные материалы: чек-лист AI-готовности — что проверить у себя, robots.txt и ИИ-боты — директивы и сценарии, Schema.org для ИИ-поиска — разметка, llms.txt — формат файла. Про площадки: AI Overviews, Perplexity, Bing Copilot, Нейро в Яндексе. Про содержательную сторону — GEO и как попадать в ответы ИИ.
Частые вопросы
Исполняют ли ИИ-краулеры JavaScript?
Google документирует рендеринг, и AI Overviews работают на его индексе. OpenAI, Anthropic и Perplexity в документации своих ботов исполнение скриптов не описывают. Проверить можно только по своим логам: если с адреса бота не было запросов к .js и к вашим API, рендеринга не было.
Как понять, заходил ли GPTBot?
Отфильтруйте логи по подстроке GPTBot и обязательно сверьте адрес с опубликованными диапазонами оператора. Строка агента сама по себе ничего не доказывает.
Стоит ли блокировать ИИ-ботов?
Решение принимается по токенам, а не оптом. Обучающие можно закрыть без потери видимости, индексирующие — только вместе с показом в ответах. Пользовательские загрузки инициирует человек, и robots.txt к ним может не применяться.
Почему бот заходит редко и неравномерно?
Частота зависит от того, как часто сайт встречается в ссылках и запросах, а не от ваших настроек. Регулярность повышают внутренняя перелинковка, живая карта сайта и стабильные ответы без 5xx.
Влияет ли скорость сайта на обход?
Да. Медленный ответ повышает риск, что загрузка оборвётся, а тяжёлый документ рискует не поместиться в лимит: Google, например, читает первые 2 МБ несжатых данных. Сотни килобайт HTML и TTFB меньше секунды — безопасная зона.
Можно ли отдавать боту отдельную версию страницы?
Нет. Разное содержимое по User-Agent — это клоакинг, нарушение рекомендаций поисковых систем и риск санкций. Заголовок Vary: User-Agent в ответе — повод разобраться, что именно достаётся боту.
Что делать с незнакомым ботом в логах?
Откройте URL, указанный в его строке после знака +: настоящие операторы ведут там документацию и публикуют диапазоны адресов. Нет документации и адрес не сходится — блокируйте по адресу, а не по строке.
Чек-лист
- В логах есть строки ИИ-токенов, и преобладающий код ответа у них — 200.
- Нет заметной доли 403, 429 и 5xx на бот-агентах.
- Для каждого токена осознанно решено: обучение, индекс для ответа, пользовательская загрузка.
- Ключевой текст есть в сыром HTML, а не только в DOM после скриптов.
- Несжатый HTML — сотни килобайт; robots.txt заведомо меньше 500 КиБ.
- Редиректов на пути к контенту не больше одного.
- В топе запрошенных ботом путей — статьи и разделы, а не параметры фильтров.
- Правила WAF проверяют и строку агента, и адрес из опубликованного списка.
- Списки диапазонов обновляются по расписанию, а не скопированы один раз.
- Отказ от обхода оформлен директивами в robots.txt, а не блокировкой по адресу.
- Нет
Vary: User-Agentс разной выдачей контента для ботов и людей.