Cómo buscar rastreadores de IA en los registros de tu servidor

Publicado

Respuesta corta

Busca en el campo user agent de tu registro de accesos tokens como GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot y PerplexityBot, y luego mira los códigos de estado que recibieron. Un user agent por sí solo no prueba nada, así que compara cada IP de origen con la lista de IP que publica el proveedor, o usa DNS inverso y directo en el caso de Google y Apple.

El robots.txt dice lo que pides a los rastreadores. Tu registro de accesos muestra lo que ocurrió de verdad: qué rastreadores de IA vinieron, qué páginas pidieron y qué respondió tu servidor. Es la prueba más directa que tienes, y solo necesita los archivos de registro y un terminal. Los ejemplos siguientes usan el formato combinado de registro que nginx y Apache emplean por defecto.

En esta página
  1. ¿Cómo se ve la visita de un rastreador de IA en un registro de accesos?
  2. ¿Cómo cuento las visitas de rastreadores de IA?
  3. ¿Qué recibió realmente cada rastreador?
  4. ¿Cómo verifico que una visita vino realmente de OpenAI, Anthropic o Perplexity?
  5. ¿Cómo verifico Googlebot, Applebot y CCBot?
  6. ¿Cómo son los rastreadores de IA falsos?
  7. ¿Qué no pueden decirte los registros?

¿Cómo se ve la visita de un rastreador de IA en un registro de accesos?

En el formato combinado, cada línea contiene la IP del cliente, la hora, la línea de la petición, el código de estado, el tamaño de la respuesta, el referente y el user agent. nginx lo define como $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", y el formato combined de Apache tiene los mismos campos. Una visita del rastreador de entrenamiento de OpenAI tiene este aspecto:

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"

Los tokens que debes buscar son los que documentan los proveedores: GPTBot, OAI-SearchBot y ChatGPT-User (OpenAI); ClaudeBot, Claude-SearchBot y Claude-User (Anthropic); PerplexityBot y Perplexity-User (Perplexity); Googlebot, Applebot, meta-externalagent, meta-webindexer y CCBot. Nunca verás Google-Extended ni Applebot-Extended. Google dice que Google-Extended no tiene una cadena de user agent propia, y Apple dice que Applebot-Extended no rastrea; ambos son solo tokens de robots.txt.

¿Cómo cuento las visitas de rastreadores de IA?

Si divides cada línea por el carácter de comillas dobles, el user agent queda en el campo 6. Comparar solo ese campo evita falsos positivos de URLs que contienen por casualidad el nombre de un bot. Esto cuenta las visitas por rastreador en el registro actual y en los rotados y comprimidos:

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

Ajusta la ruta para Apache, a menudo /var/log/apache2/access.log* o /var/log/httpd/access_log*. zcat -f lee tanto archivos normales como comprimidos con gzip. Si falta un rastreador que esperabas, eso por sí solo no prueba un bloqueo: puede que simplemente no haya visitado en el periodo que cubren tus registros.

¿Qué recibió realmente cada rastreador?

Importan menos las visitas que las respuestas. Un rastreador que recibe un 403 en cada petición ha visitado pero no ha leído nada. Estos comandos muestran los códigos de estado, las rutas más pedidas y si el rastreador descargó el 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

Lo que quieres ver son sobre todo 200. Muchos 403 o 429 apuntan a una regla del cortafuegos o a un límite de peticiones. Las respuestas 5xx en el robots.txt son graves: según la RFC 9309, un rastreador que recibe un error del servidor para el robots.txt debe asumir que todo el sitio está bloqueado.

Si tu sitio está detrás de un CDN, cambian dos cosas. Las peticiones que bloquea el CDN nunca llegan a tu servidor de origen, así que no aparecen en sus registros; revisa en su lugar los eventos de seguridad del propio CDN. Y, a menos que restaures la IP del visitante, el origen registra la dirección del CDN. Cloudflare, por ejemplo, envía la IP original en la cabecera CF-Connecting-IP y por defecto registra una IP de Cloudflare.

¿Cómo verifico que una visita vino realmente de OpenAI, Anthropic o Perplexity?

Estos proveedores publican los rangos de IP que usan sus agentes: OpenAI en openai.com/gptbot.json, openai.com/searchbot.json y openai.com/chatgpt-user.json; Anthropic en claude.com/crawling/bots.json; Perplexity en perplexity.ai/perplexitybot.json y perplexity.ai/perplexity-user.json. Anthropic dice que una IP de origen que figura en su lista indica que el rastreador procede de Anthropic. Ninguno de estos tres documenta la verificación por DNS inverso, así que usa las listas.

Los archivos comparten una misma forma, una lista prefixes de entradas ipv4Prefix o ipv6Prefix, de modo que un pequeño script comprueba una IP contra cualquiera de ellos:

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

Para listar las IP que se identificaron como un rastreador concreto, ejecuta awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' sobre el registro y pásalo por sort | uniq -c | sort -rn. Comprueba cada una con la lista correspondiente. Las listas cambian, así que descárgalas de nuevo en lugar de conservar una copia antigua.

¿Cómo verifico Googlebot, Applebot y CCBot?

Google, Apple y Common Crawl documentan una comprobación de DNS inverso y directo. Busca el nombre de host de la IP, comprueba su dominio, busca después ese nombre de host y confirma que apunta de vuelta a la misma 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

En el caso de Google, el nombre de host debe terminar en googlebot.com, google.com o googleusercontent.com, según el rastreador; Google también publica sus rangos, con Googlebot en common-crawlers.json. En el de Apple debe estar en applebot.apple.com, con los rangos en applebot.json. En el de Common Crawl debe estar bajo crawl.commoncrawl.org, y Common Crawl advierte de que otros rastreadores usan falsamente el nombre CCBot.

¿Cómo son los rastreadores de IA falsos?

Los scrapers suelen tomar prestado el user agent de un rastreador conocido para saltarse los filtros. Señales típicas:

También existe el problema inverso: un rastreador que usa un user agent de navegador corriente no se puede identificar en absoluto por la línea del registro. En 2025 Cloudflare dijo que había observado a Perplexity rastrear con user agents no declarados, similares a los de un navegador, desde IP fuera de sus rangos publicados; Perplexity discutió esa versión y atribuyó parte del tráfico a un servicio de terceros. Los registros por sí solos no pueden resolver casos así, y por eso la verificación por rangos de IP publicados importa en ambos sentidos.

¿Qué no pueden decirte los registros?

Los registros muestran lo que llegó a tu servidor. No muestran lo que tu CDN bloqueó antes de llegar al origen, si una página que devolvió 200 contenía el texto o solo una carcasa de scripts, ni si un rastreador estaría permitido si viniera hoy. Además solo cubren el periodo que conservas, y los sitios con poco tráfico pueden ver rastreadores de IA muy pocas veces.

En una cuenta de AISeeWhy puedes subir un registro de accesos en formato combinado (normal o .gz, hasta 50 MB); se analiza y se descarta, y las peticiones de cada rastreador de IA se cuentan con sus códigos de estado y se comparan con los rangos de IP que publican los proveedores.

Preguntas frecuentes

¿Por qué no veo Google-Extended en mis registros?

Google dice que Google-Extended no tiene una cadena de user agent propia. El rastreo lo hacen los rastreadores existentes de Google, y el token solo controla cómo puede usarse el contenido. Lo mismo vale para Applebot-Extended, que según Apple no rastrea.

¿Puedo fiarme del user agent de mis registros?

No. Cualquiera puede enviar cualquier user agent. Trátalo como una afirmación y confírmala con los rangos de IP que publica el proveedor o, en el caso de Google, Apple y Common Crawl, con una consulta de DNS inverso y directo.

Mis registros no muestran visitas de rastreadores de IA. ¿Estoy bloqueado?

No necesariamente. Puede que el rastreador aún no haya visitado, que tu CDN lo haya bloqueado antes de llegar al origen o que tus registros solo guarden las direcciones IP del CDN. Revisa los eventos de seguridad de tu CDN y prueba la página con el user agent de cada rastreador.

¿El tráfico de ChatGPT-User es un rastreador?

OpenAI dice que ChatGPT-User se usa para determinadas acciones del usuario y no para rastrear la web de forma automática. Sus visitas suelen darse cuando una persona le pregunta a ChatGPT por una página, así que llegan en pequeñas cantidades.

Fuentes

Más artículos