Skip to content
EN
← Все статьи

Как AI-краулеры читают ваш сайт: user-agent, JS и логи

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

Три класса ИИ-ботов: обучение, индексация для ответа и загрузка по запросу пользователя
Один сервис — несколько разных ботов. У каждого свой токен в 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ИндексGoogleОбычный обход; на его индексе строятся и AI Overviews
Google-ExtendedТолько токенGoogleНе имеет собственной строки User-Agent. Управляет обучением Gemini и подгрузкой контента в ответ
Applebot / Applebot-ExtendedИндекс / токенAppleApplebot обходит сайт, 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. Даже там, где рендеринг есть, он стоит ресурсов и происходит с задержкой — а разметка без скриптов читается всегда и сразу.
Слева исходный HTML с текстом, справа пустой каркас страницы, который получает бот
Инспектор браузера показывает DOM после скриптов. Бот получает то, что слева, — сырой ответ сервера.

Что видит краулер и что видит человек

Главный источник заблуждений — панель «Элементы» в 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.

Разбор строк лога nginx: группировка запросов по User-Agent и коду ответа
Три разбора логов отвечают на всё: кто приходил, что получил и что забирал.

Как отличить настоящего бота от подделки

Строка 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
OpenAIgptbot.json, searchbot.json, chatgpt-user.jsonСверяйте по диапазонам
Anthropiccrawling/bots.jsonСверяйте по диапазонам
Perplexityperplexitybot.json, perplexity-user.jsonСверяйте по диапазонам
Googlecommon-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Динамика по дням, история кодовОткатить правило, починить ответы, дождаться следующего цикла
Проверка подлинности бота: сверка адреса с опубликованными диапазонами и обратный DNS
Строка агента подделывается одной опцией. Настоящую принадлежность подтверждает только адрес.

Как проверить

Команды выше отвечают на вопрос по одной странице и одному логу. Быстрее получить общую картину помогают готовые проверки:

Смежные материалы: чек-лист 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 с разной выдачей контента для ботов и людей.

Проверить, что видит ИИ-краулер на вашем сайте →

Проверьте ваш сайт прямо сейчас

Проверить SEO своего сайта →
Другие статьи: SEO
SEO
Open Graph: как настроить превью ссылки в Telegram, VK и соцсетях
21.07.2026 · 476 просм.
SEO
Sitemap XML: структура карты сайта, лимиты, генерация и проверка
16.03.2026 · 398 просм.
SEO
SEO-аудит сайта: чеклист из 20 пунктов
14.03.2026 · 225 просм.
SEO
Цепочки редиректов: как они влияют на SEO и скорость
11.03.2026 · 205 просм.