Jak sprawdzić w logach serwera crawlery AI

Opublikowano

Krótka odpowiedź

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
  1. Jak wygląda wizyta crawlera AI w logu dostępu?
  2. Jak policzyć wizyty crawlerów AI?
  3. Co faktycznie otrzymał każdy crawler?
  4. Jak sprawdzić, że wizyta naprawdę pochodzi od OpenAI, Anthropic lub Perplexity?
  5. Jak zweryfikować Googlebot, Applebot i CCBot?
  6. Jak wyglądają fałszywe crawlery AI?
  7. Czego logi nie mówią?

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:

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

Więcej artykułów