Как найти AI-краулеров в логах сервера

Опубликовано

Короткий ответ

Найдите в поле user agent вашего лога доступа токены вроде GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot и PerplexityBot, затем посмотрите, какие коды статуса они получили. Один user agent ничего не доказывает, поэтому сверяйте каждый IP-адрес источника со списком IP, который публикует разработчик, а для Google и Apple используйте обратный и прямой DNS.

Robots.txt говорит, о чём вы просите краулеров. Лог доступа показывает, что произошло на самом деле: какие AI-краулеры приходили, какие страницы запрашивали и что отвечал ваш сервер. Это самое прямое доказательство из имеющихся, и для него нужны лишь файлы логов и терминал. В примерах ниже используется комбинированный формат логов, который nginx и Apache применяют по умолчанию.

На этой странице
  1. Как выглядит визит AI-краулера в логе доступа
  2. Как посчитать визиты AI-краулеров
  3. Что на самом деле получил каждый краулер
  4. Как проверить, что визит действительно пришёл от OpenAI, Anthropic или Perplexity
  5. Как проверить Googlebot, Applebot и CCBot
  6. Как выглядят поддельные AI-краулеры
  7. О чём логи не скажут

Как выглядит визит AI-краулера в логе доступа

В комбинированном формате каждая строка содержит IP клиента, время, строку запроса, код статуса, размер ответа, реферер и user agent. nginx определяет его как $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", а формат combined в Apache содержит те же поля. Визит краулера OpenAI для обучения выглядит так:

20.171.206.5 - - [12/Nov/2026:10:00:01 +0000] "GET /pricing HTTP/1.1" 200 5120 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot"

Искать нужно токены, которые документируют разработчики: GPTBot, OAI-SearchBot и ChatGPT-User (OpenAI); ClaudeBot, Claude-SearchBot и Claude-User (Anthropic); PerplexityBot и Perplexity-User (Perplexity); Googlebot, Applebot, meta-externalagent, meta-webindexer и CCBot. Google-Extended и Applebot-Extended вы не увидите никогда. Google сообщает, что у Google-Extended нет отдельной строки user agent, а Apple — что Applebot-Extended не выполняет краулинг; оба существуют только как токены robots.txt.

Как посчитать визиты AI-краулеров

Если разбить каждую строку по символу двойной кавычки, user agent окажется в поле 6. Сопоставление только с этим полем исключает ложные совпадения с URL, в которых случайно встречается имя бота. Эта команда считает визиты по краулерам в текущем и в ротированных сжатых логах:

zcat -f /var/log/nginx/access.log* \
  | awk -F'"' '{print $6}' \
  | grep -Eo 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Googlebot|bingbot|Applebot|meta-externalagent|meta-webindexer|CCBot' \
  | sort | uniq -c | sort -rn

Для Apache измените путь, часто это /var/log/apache2/access.log* или /var/log/httpd/access_log*. zcat -f читает и обычные, и сжатые gzip файлы. Если ожидаемого краулера нет в выводе, само по себе это не доказывает блокировку: возможно, он просто не заходил за период, который охватывают ваши логи.

Что на самом деле получил каждый краулер

Визиты важны меньше, чем ответы. Краулер, получающий 403 на каждый запрос, приходил, но ничего не прочитал. Эти команды показывают коды статуса, самые запрашиваемые пути и то, загружал ли краулер robots.txt:

# Status codes returned to PerplexityBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /PerplexityBot/ {split($3, s, " "); print s[1]}' | sort | uniq -c

# Most requested paths for OAI-SearchBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /OAI-SearchBot/ {split($2, r, " "); print r[2]}' | sort | uniq -c | sort -rn | head -20

# Did ClaudeBot fetch robots.txt, and what did it get?
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /ClaudeBot/ && $2 ~ /robots\.txt/ {split($3, s, " "); print s[1]}' | sort | uniq -c

Лучше всего, если в основном 200. Много 403 или 429 указывает на правило файрвола или ограничение частоты запросов. Ответы 5xx на robots.txt — серьёзная проблема: по RFC 9309 краулер, получивший ошибку сервера для robots.txt, должен считать, что закрыт весь сайт.

Если сайт стоит за CDN, меняются две вещи. Запросы, которые блокирует CDN, не доходят до вашего origin-сервера, поэтому в его логах их нет вообще; смотрите события безопасности самой CDN. А если вы не восстанавливаете IP посетителя, origin записывает адрес CDN. Например, Cloudflare передаёт исходный IP в заголовке CF-Connecting-IP, а по умолчанию в лог попадает IP Cloudflare.

Как проверить, что визит действительно пришёл от OpenAI, Anthropic или Perplexity

Эти разработчики публикуют диапазоны IP, которые используют их агенты: OpenAI — в openai.com/gptbot.json, openai.com/searchbot.json и openai.com/chatgpt-user.json; Anthropic — в claude.com/crawling/bots.json; Perplexity — в perplexity.ai/perplexitybot.json и perplexity.ai/perplexity-user.json. Anthropic сообщает, что IP-адрес источника из её списка означает, что краулер приходит от Anthropic. Ни у одного из этих трёх разработчиков не описана проверка обратным DNS, поэтому пользуйтесь списками.

Файлы имеют одинаковую форму — список prefixes с записями ipv4Prefix или ipv6Prefix, — поэтому один небольшой скрипт проверяет IP по любому из них:

python3 - 20.171.206.5 https://openai.com/gptbot.json <<'EOF'
import ipaddress, json, sys, urllib.request
ip = ipaddress.ip_address(sys.argv[1])
req = urllib.request.Request(sys.argv[2], headers={"User-Agent": "log-check"})
prefixes = json.load(urllib.request.urlopen(req))["prefixes"]
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix")) for p in prefixes]
print(ip, "listed" if any(ip in n for n in nets) else "NOT listed")
EOF

Чтобы получить IP, выдававшие себя за нужный краулер, запустите awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' по логу и пропустите вывод через sort | uniq -c | sort -rn. Сверьте каждый адрес с соответствующим списком. Списки меняются, поэтому загружайте их заново, а не храните старую копию.

Как проверить Googlebot, Applebot и CCBot

Google, Apple и Common Crawl описывают проверку обратным и прямым DNS. Узнайте имя хоста по IP, проверьте его домен, затем найдите IP этого имени и убедитесь, что он совпадает с исходным:

host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1

Для Google имя хоста должно заканчиваться на googlebot.com, google.com или googleusercontent.com в зависимости от краулера; Google также публикует свои диапазоны, причём диапазоны Googlebot лежат в common-crawlers.json. Для Apple оно должно быть в applebot.apple.com, а диапазоны лежат в applebot.json. Для Common Crawl оно должно быть в домене crawl.commoncrawl.org, и Common Crawl предупреждает, что другие краулеры ложно называются CCBot.

Как выглядят поддельные AI-краулеры

Парсеры часто заимствуют user agent известного краулера, чтобы обойти фильтры. Типичные признаки:

Бывает и обратная проблема: краулера, использующего обычный user agent браузера, по строке лога опознать невозможно. В 2025 году Cloudflare сообщила, что наблюдала краулинг Perplexity с недекларируемыми user agent, похожими на браузерные, с IP вне опубликованных диапазонов; Perplexity оспорила это описание и отнесла часть трафика на счёт стороннего сервиса. Одни логи такие случаи не разрешают, поэтому проверка по опубликованным диапазонам IP важна в обе стороны.

О чём логи не скажут

Логи показывают то, что дошло до вашего сервера. Они не показывают, что ваша CDN заблокировала до origin, содержала ли страница с ответом 200 текст или лишь оболочку со скриптами и разрешили бы краулеру доступ, если бы он пришёл сегодня. Они охватывают также только тот период, который вы храните, а на тихих сайтах AI-краулеры могут появляться редко.

В аккаунте AISeeWhy можно загрузить лог доступа в комбинированном формате (обычный или .gz, до 50 МБ); он анализируется и удаляется, запросы каждого AI-краулера считаются вместе с кодами статуса и проверяются по диапазонам IP, которые публикуют разработчики.

Частые вопросы

Почему я не вижу Google-Extended в своих логах?

Google сообщает, что у Google-Extended нет отдельной строки user agent. Краулинг выполняют существующие краулеры Google, а токен лишь управляет тем, как можно использовать контент. То же относится к Applebot-Extended, который, по словам Apple, не выполняет краулинг.

Можно ли доверять user agent в моих логах?

Нет. Любой может отправить любой user agent. Считайте его заявлением и подтверждайте опубликованными диапазонами IP разработчика или, для Google, Apple и Common Crawl, обратным и прямым DNS-запросом.

В моих логах нет визитов AI-краулеров. Меня заблокировали?

Не обязательно. Краулер мог ещё не приходить, ваша CDN могла заблокировать его до origin, или ваши логи записывают только IP-адреса CDN. Проверьте события безопасности CDN и протестируйте страницу с user agent каждого краулера.

Является ли трафик ChatGPT-User краулингом?

OpenAI сообщает, что ChatGPT-User используется для некоторых действий пользователей и не используется для автоматического краулинга веба. Его визиты обычно следуют за тем, как человек спрашивает ChatGPT о странице, поэтому их немного.

Источники

Другие статьи