Як знайти AI-краулери у журналах сервера
Шукайте в полі user agent вашого журналу доступу токени на кшталт GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot і PerplexityBot, а потім дивіться, які коди стану вони отримали. Сам user agent нічого не доводить, тому звіряйте кожну вихідну IP-адресу з опублікованим списком IP вендора, а для Google і Apple — зворотним та прямим DNS.
robots.txt каже, про що ви просите краулери. Журнал доступу показує, що справді сталося: які AI-краулери приходили, які сторінки запитували і що відповів ваш сервер. Це найпряміший доказ, який у вас є, і йому потрібні лише файли журналів і термінал. У прикладах нижче використано комбінований формат журналу, який nginx та Apache застосовують за замовчуванням.
На цій сторінці
Як виглядає візит 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 називає краулера, але IP немає в опублікованому списку цього вендора або його зворотний DNS не збігається.
- Джерело — домашня мережа чи хмарний провайдер, яких вендор не наводить.
- Клієнт ніколи не запитує robots.txt або запитує шляхи, які robots.txt забороняє для цього краулера.
- Частота чи характер запитів різко відрізняються від перевіреного трафіку під тією самою назвою, наприклад сплески проти кінцевих точок пошуку чи входу.
Існує й зворотна проблема: краулера, що використовує звичайний браузерний 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 про сторінку, тому їх небагато.
Джерела
- nginx: ngx_http_log_module (комбінований формат журналу)
- Apache HTTP Server 2.4: файли журналів
- OpenAI: огляд краулерів OpenAI
- Anthropic: чи збирає Anthropic дані з вебу і як власникам сайтів заблокувати краулер?
- Perplexity: краулери Perplexity
- Google: перевірка краулерів і завантажувачів Google
- Google: поширені краулери, зокрема Google-Extended
- Apple: про Applebot
- Common Crawl: CCBot
- RFC 9309: Robots Exclusion Protocol
- Cloudflare: відновлення вихідних IP відвідувачів
- Cloudflare: Perplexity використовує приховані, необ’явлені краулери, щоб обходити заборони сканування на сайтах
- Perplexity: агенти чи боти? Осмислюємо AI у відкритому вебі