Come cercare i crawler di IA nei log del server

Pubblicato

Risposta breve

Cerca nel campo user agent del tuo log di accesso token come GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot e PerplexityBot, poi guarda i codici di stato che hanno ricevuto. Lo user agent da solo non prova nulla, quindi confronta ogni IP di origine con l'elenco di IP pubblicato dal fornitore, oppure usa il DNS inverso e diretto per Google e Apple.

Il robots.txt dice che cosa chiedi ai crawler di fare. Il log di accesso mostra che cosa è successo davvero: quali crawler di IA sono passati, quali pagine hanno richiesto e che cosa ha risposto il tuo server. È la prova più diretta che hai, e non servono altro che i file di log e un terminale. Gli esempi qui sotto usano il formato combined dei log, quello predefinito di nginx e Apache.

In questa pagina
  1. Che aspetto ha la visita di un crawler di IA in un log di accesso?
  2. Come conto le visite dei crawler di IA?
  3. Che cosa ha ricevuto davvero ogni crawler?
  4. Come verifico che una visita provenga davvero da OpenAI, Anthropic o Perplexity?
  5. Come verifico Googlebot, Applebot e CCBot?
  6. Come si riconoscono i falsi crawler di IA?
  7. Che cosa non possono dirti i log?

Che aspetto ha la visita di un crawler di IA in un log di accesso?

Nel formato combined ogni riga contiene l'IP del client, l'ora, la riga della richiesta, il codice di stato, la dimensione della risposta, il referrer e lo user agent. nginx lo definisce come $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", e il formato combined di Apache ha gli stessi campi. La visita del crawler di addestramento di OpenAI si presenta così:

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"

I token da cercare sono quelli documentati dai fornitori: GPTBot, OAI-SearchBot e ChatGPT-User (OpenAI); ClaudeBot, Claude-SearchBot e Claude-User (Anthropic); PerplexityBot e Perplexity-User (Perplexity); Googlebot, Applebot, meta-externalagent, meta-webindexer e CCBot. Non vedrai mai Google-Extended né Applebot-Extended. Google dice che Google-Extended non ha una stringa user agent separata, e Apple dice che Applebot-Extended non scansiona; sono entrambi solo token del robots.txt.

Come conto le visite dei crawler di IA?

Dividendo ogni riga sul carattere virgolette doppie, lo user agent finisce nel campo 6. Confrontare solo quel campo evita falsi positivi dovuti a URL che contengono per caso il nome di un bot. Questo comando conta le visite per crawler nel log corrente e in quelli ruotati e compressi:

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

Adatta il percorso per Apache, spesso /var/log/apache2/access.log* o /var/log/httpd/access_log*. zcat -f legge sia i file normali sia quelli in formato gzip. Se manca un crawler che ti aspetti, questo da solo non prova un blocco: potrebbe semplicemente non essere passato nel periodo coperto dai tuoi log.

Che cosa ha ricevuto davvero ogni crawler?

Le visite contano meno delle risposte. Un crawler che riceve un 403 a ogni richiesta è passato ma non ha letto nulla. Questi comandi mostrano i codici di stato, i percorsi più richiesti e se il crawler ha scaricato il 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

Quello che vuoi vedere sono soprattutto 200. Molti 403 o 429 indicano una regola del firewall o un limite di frequenza. Le risposte 5xx sul robots.txt sono gravi: secondo l'RFC 9309 un crawler che riceve un errore del server per il robots.txt deve presumere che l'intero sito sia vietato.

Se il tuo sito sta dietro una CDN, cambiano due cose. Le richieste che la CDN blocca non raggiungono mai il tuo server di origine, quindi non compaiono affatto nei suoi log; controlla invece gli eventi di sicurezza della CDN. E se non ripristini l'IP del visitatore, il server di origine registra l'indirizzo della CDN. Cloudflare, per esempio, invia l'IP originale nell'intestazione CF-Connecting-IP e per impostazione predefinita registra un IP di Cloudflare.

Come verifico che una visita provenga davvero da OpenAI, Anthropic o Perplexity?

Questi fornitori pubblicano gli intervalli di IP usati dai loro agenti: OpenAI su openai.com/gptbot.json, openai.com/searchbot.json e openai.com/chatgpt-user.json; Anthropic su claude.com/crawling/bots.json; Perplexity su perplexity.ai/perplexitybot.json e perplexity.ai/perplexity-user.json. Anthropic dice che un IP di origine presente nel suo elenco indica che il crawler proviene da Anthropic. Nessuno di questi tre documenta la verifica con DNS inverso, quindi usa gli elenchi.

I file hanno tutti la stessa forma, un elenco prefixes di voci ipv4Prefix o ipv6Prefix, quindi un piccolo script basta per controllare un IP rispetto a uno qualsiasi di essi:

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

Per elencare gli IP che hanno dichiarato di essere un certo crawler, esegui awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' sul log e passa il risultato a sort | uniq -c | sort -rn. Controlla ciascuno rispetto all'elenco corrispondente. Gli elenchi cambiano, quindi scaricali ogni volta invece di tenere una vecchia copia.

Come verifico Googlebot, Applebot e CCBot?

Google, Apple e Common Crawl documentano un controllo con DNS inverso e diretto. Cerca il nome host dell'IP, controlla il suo dominio, poi cerca quel nome host e conferma che rimandi allo stesso 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

Per Google il nome host deve terminare con googlebot.com, google.com o googleusercontent.com, a seconda del crawler; Google pubblica anche i suoi intervalli, con Googlebot in common-crawlers.json. Per Apple deve appartenere a applebot.apple.com, con gli intervalli in applebot.json. Per Common Crawl deve trovarsi sotto crawl.commoncrawl.org, e Common Crawl avverte che altri crawler usano falsamente il nome CCBot.

Come si riconoscono i falsi crawler di IA?

Gli scraper spesso prendono in prestito lo user agent di un crawler noto per superare i filtri. Segnali tipici:

Esiste anche il problema inverso: un crawler che usa un normale user agent da browser non si può identificare affatto dalla riga del log. Nel 2025 Cloudflare ha dichiarato di aver osservato Perplexity scansionare con user agent non dichiarati, simili a quelli di un browser, da IP esterni ai suoi intervalli pubblicati; Perplexity ha contestato questa ricostruzione e ha attribuito parte del traffico a un servizio di terze parti. I log da soli non bastano a risolvere casi come questo, ed è per questo che la verifica tramite gli intervalli di IP pubblicati conta in entrambe le direzioni.

Che cosa non possono dirti i log?

I log mostrano ciò che è arrivato al tuo server. Non mostrano che cosa la CDN ha bloccato prima dell'origine, se una pagina che ha restituito 200 conteneva il testo o solo un guscio di script, né se un crawler verrebbe ammesso se arrivasse oggi. Coprono inoltre solo il periodo che conservi, e sui siti poco visitati i crawler di IA possono passare di rado.

In un account AISeeWhy puoi caricare un log di accesso in formato combined (normale o .gz, fino a 50 MB); viene analizzato ed eliminato, e le richieste di ogni crawler di IA vengono conteggiate con i loro codici di stato e confrontate con gli intervalli di IP pubblicati dai fornitori.

Domande frequenti

Perché non vedo Google-Extended nei miei log?

Google dice che Google-Extended non ha una stringa user agent separata. La scansione è fatta dai crawler già esistenti di Google, e il token controlla solo come i contenuti possono essere usati. Lo stesso vale per Applebot-Extended, che secondo Apple non scansiona.

Posso fidarmi dello user agent nei miei log?

No. Chiunque può inviare qualsiasi user agent. Consideralo una dichiarazione e confermala con gli intervalli di IP pubblicati dal fornitore oppure, per Google, Apple e Common Crawl, con una ricerca DNS inversa e diretta.

I miei log non mostrano visite di crawler di IA. Sono bloccato?

Non necessariamente. Il crawler potrebbe non essere ancora passato, la tua CDN potrebbe averlo bloccato prima dell'origine, oppure i tuoi log potrebbero registrare solo gli indirizzi IP della CDN. Controlla gli eventi di sicurezza della CDN e prova la pagina con lo user agent di ciascun crawler.

Il traffico di ChatGPT-User è quello di un crawler?

OpenAI dice che ChatGPT-User viene usato per certe azioni dell'utente e non per la scansione automatica del web. Le sue visite in genere seguono una persona che chiede a ChatGPT di una pagina, quindi arrivano in piccoli numeri.

Fonti

Altri articoli