Jak sprawdzić w logach serwera crawlery AI
Przeszukaj pole user agenta w logu dostępu pod kątem tokenów takich jak GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot i PerplexityBot, a następnie sprawdź kody statusu, które otrzymały. Sam user agent niczego nie dowodzi, więc porównaj każdy źródłowy adres IP z listą IP opublikowaną przez dostawcę albo, w przypadku Google i Apple, sprawdź go przez reverse i forward DNS.
Robots.txt mówi, o co prosisz crawlery. Log dostępu pokazuje, co faktycznie się stało: które crawlery AI przyszły, o jakie strony prosiły i co odpowiedział serwer. To najbardziej bezpośredni dowód, jaki masz, i wymaga jedynie plików logów oraz terminala. Poniższe przykłady używają formatu combined, którego domyślnie używają nginx i Apache.
Na tej stronie
Jak wygląda wizyta crawlera AI w logu dostępu?
W formacie combined każda linia zawiera adres IP klienta, czas, linię żądania, kod statusu, rozmiar odpowiedzi, referer i user agenta. nginx definiuje go jako $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", a format combined Apache ma te same pola. Wizyta crawlera treningowego OpenAI wygląda tak:
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"
Tokeny, których należy szukać, to te dokumentowane przez dostawców: GPTBot, OAI-SearchBot i ChatGPT-User (OpenAI); ClaudeBot, Claude-SearchBot i Claude-User (Anthropic); PerplexityBot i Perplexity-User (Perplexity); Googlebot, Applebot, meta-externalagent, meta-webindexer i CCBot. Nigdy nie zobaczysz Google-Extended ani Applebot-Extended. Google podaje, że Google-Extended nie ma osobnego ciągu user agenta, a Apple podaje, że Applebot-Extended nie przeszukuje; oba są wyłącznie tokenami robots.txt.
Jak policzyć wizyty crawlerów AI?
Podzielenie każdej linii po znaku cudzysłowu umieszcza user agenta w polu 6. Dopasowanie wyłącznie do tego pola pozwala uniknąć fałszywych trafień z adresów URL, które przypadkiem zawierają nazwę bota. To polecenie liczy wizyty każdego crawlera w bieżącym logu i w rotowanych, skompresowanych:
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
Dostosuj ścieżkę dla Apache, często /var/log/apache2/access.log* lub /var/log/httpd/access_log*. zcat -f czyta zarówno zwykłe, jak i spakowane gzipem pliki. Jeśli brakuje crawlera, którego oczekujesz, samo to nie dowodzi blokady: mógł po prostu nie odwiedzić witryny w okresie obejmowanym przez Twoje logi.
Co faktycznie otrzymał każdy crawler?
Wizyty liczą się mniej niż odpowiedzi. Crawler, który na każde żądanie dostaje 403, odwiedził witrynę, ale nic nie przeczytał. Te polecenia pokazują kody statusu, najczęściej żądane ścieżki i to, czy crawler pobrał 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
Najlepiej, gdy przeważają kody 200. Wiele kodów 403 lub 429 wskazuje na regułę firewalla lub limit zapytań. Odpowiedzi 5xx na robots.txt są poważne: według RFC 9309 crawler, który dostaje błąd serwera dla robots.txt, musi przyjąć, że cała witryna jest zabroniona.
Jeśli Twoja witryna stoi za CDN, zmieniają się dwie rzeczy. Żądania blokowane przez CDN nigdy nie docierają do serwera źródłowego, więc w jego logach w ogóle się nie pojawiają; sprawdź zamiast tego zdarzenia bezpieczeństwa samego CDN. Ponadto, jeśli nie przywrócisz IP odwiedzającego, serwer źródłowy zapisuje adres CDN. Cloudflare na przykład wysyła oryginalny adres IP w nagłówku CF-Connecting-IP, a domyślnie w logu zapisuje się adres IP Cloudflare.
Jak sprawdzić, że wizyta naprawdę pochodzi od OpenAI, Anthropic lub Perplexity?
Ci dostawcy publikują zakresy IP używane przez ich agentów: OpenAI pod openai.com/gptbot.json, openai.com/searchbot.json i openai.com/chatgpt-user.json; Anthropic pod claude.com/crawling/bots.json; Perplexity pod perplexity.ai/perplexitybot.json i perplexity.ai/perplexity-user.json. Anthropic podaje, że źródłowy adres IP z jego listy wskazuje, iż crawler pochodzi od Anthropic. Żaden z tych trzech nie dokumentuje weryfikacji przez reverse DNS, więc używaj list.
Pliki mają wspólną budowę, listę prefixes z wpisami ipv4Prefix lub ipv6Prefix, więc jeden mały skrypt sprawdza adres IP względem dowolnego z nich:
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
Aby wypisać adresy IP, które podały się za danego crawlera, uruchom awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' na logu i przepuść wynik przez sort | uniq -c | sort -rn. Sprawdź każdy względem odpowiedniej listy. Listy się zmieniają, więc pobieraj je na bieżąco, zamiast trzymać starą kopię.
Jak zweryfikować Googlebot, Applebot i CCBot?
Google, Apple i Common Crawl dokumentują kontrolę reverse i forward DNS. Sprawdź nazwę hosta dla danego IP, zweryfikuj jej domenę, potem wyszukaj tę nazwę hosta i potwierdź, że wskazuje z powrotem na ten sam adres 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
W przypadku Google nazwa hosta musi kończyć się na googlebot.com, google.com lub googleusercontent.com, zależnie od crawlera; Google publikuje też swoje zakresy, z Googlebotem w common-crawlers.json. W przypadku Apple musi należeć do applebot.apple.com, a zakresy są w applebot.json. W przypadku Common Crawl musi znajdować się pod crawl.commoncrawl.org, a Common Crawl ostrzega, że inne crawlery fałszywie podają się za CCBot.
Jak wyglądają fałszywe crawlery AI?
Scrapery często pożyczają user agenta znanego crawlera, by ominąć filtry. Typowe oznaki:
- User agent wymienia crawlera, ale adresu IP nie ma na opublikowanej liście tego dostawcy albo jego reverse DNS się nie zgadza.
- Źródłem jest sieć domowa lub dostawca chmury, których dostawca nie wymienia.
- Klient nigdy nie żąda robots.txt albo żąda ścieżek, które robots.txt zabrania temu crawlerowi.
- Częstotliwość lub wzorzec żądań wyraźnie odbiega od zweryfikowanego ruchu pod tą samą nazwą, na przykład serie żądań do endpointów wyszukiwania lub logowania.
Istnieje też problem odwrotny: crawlera, który używa zwykłego user agenta przeglądarki, nie da się rozpoznać po samej linii logu. W 2025 roku Cloudflare oświadczył, że zaobserwował przeszukiwanie przez Perplexity z użyciem nieujawnionych user agentów podobnych do przeglądarkowych, z adresów IP spoza jego opublikowanych zakresów; Perplexity kwestionowało tę relację i część ruchu przypisało zewnętrznej usłudze. Same logi nie rozstrzygną takich przypadków, dlatego weryfikacja po opublikowanych zakresach IP ma znaczenie w obu kierunkach.
Czego logi nie mówią?
Logi pokazują to, co dotarło do Twojego serwera. Nie pokazują, co CDN zablokował przed serwerem źródłowym, czy strona zwracająca 200 zawierała tekst, czy tylko powłokę skryptu, ani czy crawler zostałby wpuszczony, gdyby przyszedł dzisiaj. Obejmują też tylko okres, który przechowujesz, a na mało odwiedzanych witrynach crawlery AI mogą pojawiać się rzadko.
W koncie AISeeWhy możesz wgrać log dostępu w formacie combined (zwykły lub .gz, do 50 MB); jest analizowany i usuwany, a żądania każdego crawlera AI są liczone wraz z kodami statusu i sprawdzane względem zakresów IP publikowanych przez dostawców.
Najczęstsze pytania
Dlaczego nie widzę Google-Extended w logach?
Google podaje, że Google-Extended nie ma osobnego ciągu user agenta. Przeszukiwanie wykonują istniejące crawlery Google, a token kontroluje tylko to, jak treści mogą być używane. To samo dotyczy Applebot-Extended, który według Apple nie przeszukuje.
Czy mogę ufać user agentowi w logach?
Nie. Każdy może wysłać dowolnego user agenta. Traktuj go jako deklarację i potwierdź ją opublikowanymi zakresami IP dostawcy albo, w przypadku Google, Apple i Common Crawl, wyszukaniem reverse i forward DNS.
W logach nie widać wizyt crawlerów AI. Czy jestem zablokowany?
Niekoniecznie. Crawler mógł jeszcze nie przyjść, Twój CDN mógł go zablokować przed serwerem źródłowym albo logi mogą zapisywać tylko adresy IP CDN. Sprawdź zdarzenia bezpieczeństwa CDN i przetestuj stronę z user agentem każdego crawlera.
Czy ruch ChatGPT-User to crawler?
OpenAI podaje, że ChatGPT-User służy do niektórych działań użytkownika i nie jest używany do automatycznego przeszukiwania sieci. Jego wizyty zwykle następują po tym, jak ktoś pyta ChatGPT o stronę, więc jest ich niewiele.
Źródła
- nginx: ngx_http_log_module (format logu combined)
- Apache HTTP Server 2.4: pliki logów
- OpenAI: przegląd crawlerów OpenAI
- Anthropic: czy Anthropic pobiera dane z sieci i jak właściciele witryn mogą zablokować crawlera?
- Perplexity: crawlery Perplexity
- Google: weryfikowanie crawlerów i fetcherów Google
- Google: popularne crawlery, w tym Google-Extended
- Apple: o Applebot
- Common Crawl: CCBot
- RFC 9309: Robots Exclusion Protocol
- Cloudflare: przywracanie oryginalnych adresów IP odwiedzających
- Cloudflare: Perplexity używa ukrytych, nieujawnionych crawlerów, by omijać dyrektywy zakazujące przeszukiwania
- Perplexity: agenci czy boty? O AI w otwartej sieci