[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fCRagu1V3KEnbZshZDC2WORS6queKIiLpZgrj8XHaExA":3,"$fSlN_6SvQHGHOIt8_s4AOxnBfLK8dggvNWIR1JVbwY6E":26},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":24,"updatedAt":25},"69d89285aa6b273b0c1cbec0","llms-et-crawl-comment-les-bots-ia-crawlent-votre-site",0,"Equipe Seogard","Un éditeur de presse français de 28 000 pages a vu son temps de réponse serveur tripler en novembre 2024. Pas de pic de trafic organique. Pas de campagne virale. Dans les logs : GPTBot, ClaudeBot et Bytespider représentaient 47 % des requêtes totales — plus que Googlebot. Le crawl budget Google s'est effondré mécaniquement, et les pages récemment publiées ont mis 11 jours à être indexées au lieu de 2.\n\nCe scénario se répète sur des centaines de sites depuis 2024. Les crawlers des LLMs sont une nouvelle classe d'agents dont le comportement, les objectifs et l'agressivité n'ont rien à voir avec les search bots traditionnels. Comprendre comment ils fonctionnent est devenu un prérequis technique.\n\n## Cartographie des crawlers IA : qui crawle quoi, et pourquoi\n\nLes crawlers IA ne forment pas un bloc monolithique. Chaque acteur a ses propres user-agents, ses propres objectifs, et surtout ses propres niveaux de respect des conventions.\n\n### Les crawlers identifiés et documentés\n\nVoici les principaux user-agents actifs en 2026, avec leur documentation officielle :\n\n| Bot | Opérateur | User-Agent string | Objectif | Respecte robots.txt |\n|---|---|---|---|---|\n| GPTBot | OpenAI | `GPTBot/1.0` | Entraînement + retrieval | Oui (documenté) |\n| ChatGPT-User | OpenAI | `ChatGPT-User` | Browsing en temps réel | Oui |\n| OAI-SearchBot | OpenAI | `OAI-SearchBot/1.0` | SearchGPT | Oui |\n| ClaudeBot | Anthropic | `ClaudeBot/1.0` | Entraînement | Oui (documenté) |\n| Bytespider | ByteDance | `Bytespider` | Entraînement (TikTok/Doubao) | Partiellement |\n| Meta-ExternalAgent | Meta | `Meta-ExternalAgent/1.0` | Entraînement LLaMA | Oui |\n| PerplexityBot | Perplexity | `PerplexityBot` | RAG en temps réel | Oui |\n| Google-Extended | Google | `Google-Extended` | Entraînement Gemini | Oui |\n| Applebot-Extended | Apple | `Applebot-Extended` | Entraînement Apple Intelligence | Oui |\n| cohere-ai | Cohere | `cohere-ai` | Entraînement | Oui |\n\nLa distinction critique se situe entre les bots d'**entraînement** (qui aspirent massivement du contenu pour créer des datasets) et les bots de **retrieval** (qui récupèrent du contenu à la volée pour répondre à une requête utilisateur). GPTBot sert aux deux. ChatGPT-User ne fait que du retrieval. La différence d'impact sur vos serveurs est considérable.\n\n### Les bots non déclarés\n\nLe problème majeur : une partie significative du crawl IA n'est pas identifiable via le user-agent. Certains bots se font passer pour des navigateurs classiques (Chrome headless, par exemple). Les logs révèlent souvent des patterns suspects — des requêtes séquentielles sur l'intégralité d'un sitemap, provenant de plages IP de fournisseurs cloud (AWS, GCP, Azure), avec un user-agent Chrome standard.\n\nIdentifier ces crawlers fantômes nécessite une analyse des plages IP et des patterns de crawl, pas seulement du user-agent. Nous y reviendrons.\n\n## Anatomie d'un crawl IA : différences fondamentales avec Googlebot\n\nGooglebot crawle votre site avec un objectif précis : construire et maintenir un index de recherche. Son crawl est **sélectif** — il priorise les pages selon leur PageRank interne, leur fréquence de mise à jour, et les signaux de qualité. Il respecte un crawl rate adaptatif qui évite de surcharger votre serveur.\n\nLes crawlers IA, eux, ont un comportement radicalement différent.\n\n### Crawl exhaustif vs. crawl sélectif\n\nGPTBot et ClaudeBot ne cherchent pas à \"indexer\" au sens classique. Ils cherchent du **texte de qualité** pour alimenter des datasets d'entraînement. Conséquence : ils crawlent de manière bien plus agressive les pages à fort contenu textuel (articles, documentation, fiches produit détaillées) et ignorent souvent les pages structurelles (catégories, paginations).\n\nUn pattern typique observé dans les logs :\n\n```\n# Extrait de logs d'accès — GPTBot sur un site e-commerce (15 000 produits)\n# 2026-03-15 — 6h de crawl\n\n66.249.xx.xx - - [15/Mar/2026:02:14:33] \"GET /produit/chaussure-running-nike-pegasus-41 HTTP/2\" 200 48291 \"-\" \"GPTBot/1.0 (+https://openai.com/gptbot)\"\n66.249.xx.xx - - [15/Mar/2026:02:14:34] \"GET /produit/chaussure-trail-salomon-ultra-glide HTTP/2\" 200 52103 \"-\" \"GPTBot/1.0 (+https://openai.com/gptbot)\"\n66.249.xx.xx - - [15/Mar/2026:02:14:34] \"GET /produit/chaussure-running-asics-gel-nimbus-26 HTTP/2\" 200 45887 \"-\" \"GPTBot/1.0 (+https://openai.com/gptbot)\"\n# ... 800 requêtes/minute sur les fiches produit uniquement\n# Aucune requête sur /categorie/ ou /marque/\n```\n\n800 requêtes par minute. Googlebot, sur le même site, tournait à 40-60 requêtes par minute. Un facteur 15x.\n\n### Pas de gestion du crawl budget côté IA\n\nGooglebot a un mécanisme intégré de **crawl rate limiting** : si votre serveur ralentit, il réduit sa cadence. Vous pouvez ajuster ça dans Search Console. Les crawlers IA n'ont pour la plupart **aucun mécanisme d'adaptation dynamique documenté**. GPTBot respecte le `Crawl-delay` dans robots.txt selon la documentation d'OpenAI, mais ce n'est pas un standard universel. Bytespider, historiquement, l'ignore largement.\n\nLe risque concret : un crawl IA agressif consomme les ressources serveur, augmente le TTFB, et Googlebot — qui lui adapte sa cadence — réduit mécaniquement son crawl. Vos pages mettent plus longtemps à être découvertes et indexées. C'est exactement le scénario de l'éditeur de presse évoqué en introduction.\n\nPour suivre ce type de dégradation, [les rapports d'exploration de la Search Console](/blog/google-search-console-les-rapports-que-vous-ignorez) sont votre premier signal d'alerte : une chute du nombre de pages crawlées par jour par Googlebot, corrélée à une hausse du temps de réponse moyen, indique presque toujours une surcharge causée par un tiers.\n\n## Contrôler l'accès via robots.txt : ce qui fonctionne, ce qui ne fonctionne pas\n\nLe robots.txt reste le mécanisme standard pour communiquer vos préférences aux crawlers IA. Tous les opérateurs majeurs (OpenAI, Anthropic, Google, Meta, Apple) se sont engagés publiquement à le respecter. Mais les nuances sont essentielles.\n\n### Configuration robots.txt complète pour les bots IA\n\nVoici une configuration robots.txt qui couvre les principaux crawlers IA actuels, avec des stratégies différenciées :\n\n```nginx\n# robots.txt — Stratégie différenciée pour les bots IA\n# Dernière mise à jour : 2026-04-10\n\n# === SEARCH ENGINES (accès complet) ===\nUser-agent: Googlebot\nAllow: /\n\nUser-agent: Bingbot\nAllow: /\n\n# === BOTS IA — ENTRAÎNEMENT (blocage total) ===\n# On refuse l'utilisation du contenu pour l'entraînement de modèles\n\nUser-agent: GPTBot\nDisallow: /\n\nUser-agent: ClaudeBot\nDisallow: /\n\nUser-agent: Bytespider\nDisallow: /\n\nUser-agent: Meta-ExternalAgent\nDisallow: /\n\nUser-agent: Google-Extended\nDisallow: /\n\nUser-agent: Applebot-Extended\nDisallow: /\n\nUser-agent: cohere-ai\nDisallow: /\n\nUser-agent: CCBot\nDisallow: /\n\nUser-agent: Omgili\nDisallow: /\n\nUser-agent: Diffbot\nDisallow: /\n\n# === BOTS IA — RETRIEVAL (accès autorisé, contenu limité) ===\n# On autorise les bots qui citent/linkent nos pages en temps réel\n\nUser-agent: ChatGPT-User\nAllow: /blog/\nAllow: /guide/\nDisallow: /\n\nUser-agent: PerplexityBot\nAllow: /blog/\nAllow: /guide/\nDisallow: /\n\nUser-agent: OAI-SearchBot\nAllow: /blog/\nAllow: /guide/\nDisallow: /\n```\n\nLa logique derrière cette configuration : bloquer les bots d'entraînement (qui prennent votre contenu sans rien donner en retour) tout en autorisant les bots de retrieval sur les sections où vous souhaitez de la visibilité dans les réponses des LLMs. ChatGPT-User et PerplexityBot, lorsqu'ils citent votre contenu, génèrent du trafic référent mesurable.\n\n### Les limites du robots.txt\n\nTrois problèmes concrets que le robots.txt ne résout pas :\n\n**1. Les bots non identifiés.** Un crawler qui se présente avec un user-agent Chrome ne sera pas filtré par robots.txt. Seule l'analyse des plages IP et des patterns de requête permet de les détecter.\n\n**2. Le robots.txt est consultatif.** Rien n'empêche techniquement un bot de l'ignorer. Les acteurs majeurs le respectent par engagement légal (surtout depuis les procès NYT vs. OpenAI et les régulations européennes). Mais les acteurs plus petits ou les scrapers dérivés ne jouent pas forcément le jeu.\n\n**3. Pas de granularité temporelle.** Vous ne pouvez pas dire \"crawlez-moi 50 pages par jour maximum\" via robots.txt. Le `Crawl-delay` est un hack imparfait et n'est pas supporté par tous les bots.\n\n## Défense en profondeur : contrôler le crawl au niveau serveur\n\nLe robots.txt est votre première ligne. La configuration serveur est votre deuxième ligne — et elle est impérative pour les bots qui ne jouent pas le jeu.\n\n### Rate limiting par user-agent avec Nginx\n\n```nginx\n# /etc/nginx/conf.d/ai-bots-rate-limit.conf\n\n# Définition d'une map pour identifier les bots IA\nmap $http_user_agent $is_ai_bot {\n    default 0;\n    \"~*GPTBot\"              1;\n    \"~*ClaudeBot\"           1;\n    \"~*Bytespider\"          1;\n    \"~*ChatGPT-User\"        1;\n    \"~*PerplexityBot\"       1;\n    \"~*Meta-ExternalAgent\"  1;\n    \"~*OAI-SearchBot\"       1;\n    \"~*cohere-ai\"           1;\n    \"~*Diffbot\"             1;\n    \"~*CCBot\"               1;\n}\n\n# Zone de rate limiting dédiée aux bots IA\n# 5 requêtes par seconde max — burst de 10 avec délai\nlimit_req_zone $binary_remote_addr zone=ai_bot_limit:10m rate=5r/s;\n\nserver {\n    listen 443 ssl http2;\n    server_name www.monsite-ecommerce.fr;\n\n    # Appliquer le rate limit uniquement aux bots IA identifiés\n    location / {\n        if ($is_ai_bot) {\n            set $limit_ai \"1\";\n        }\n\n        limit_req zone=ai_bot_limit burst=10 nodelay;\n        # Note : la directive limit_req s'applique ici à tous,\n        # mais la zone est dimensionnée pour les bots.\n        # Pour un ciblage plus fin, utilisez un location imbriqué\n        # ou un module Lua (OpenResty).\n\n        proxy_pass http://backend;\n    }\n\n    # Bloc spécifique : retourner 403 pour les bots à bloquer complètement\n    # Plus fiable que robots.txt pour les bots non coopératifs\n    if ($http_user_agent ~* \"(Bytespider|CCBot|Diffbot)\") {\n        return 403;\n    }\n}\n```\n\nCette approche a un avantage clé sur le robots.txt : elle s'exécute réellement. Un `return 403` ne laisse pas le choix au bot. Le rate limiting protège vos ressources serveur même si un bot tente un crawl massif.\n\nPour les architectures utilisant un CDN (Cloudflare, Fastly, Akamai), la logique de filtrage peut être déportée au edge — ce qui est souvent plus performant. Si vous utilisez Cloudflare Workers ou des VCL Fastly pour modifier les réponses HTTP, le même principe s'applique : [l'edge SEO](/blog/edge-seo-modifier-les-reponses-http-au-niveau-cdn) permet de filtrer les bots sans toucher à votre infrastructure applicative.\n\n### Détection des crawlers non identifiés via les logs\n\nLe vrai défi n'est pas GPTBot — il s'identifie proprement. Le défi, ce sont les crawlers qui ne s'identifient pas. Voici un script bash pour détecter les patterns de crawl suspects dans vos access logs :\n\n```bash\n#!/bin/bash\n# detect-stealth-crawlers.sh\n# Détecte les IPs qui crawlent de manière séquentielle avec un UA Chrome\n# depuis des plages IP de cloud providers\n\nACCESS_LOG=\"/var/log/nginx/access.log\"\nTHRESHOLD=200  # Nombre de requêtes par IP sur les dernières 24h\n\necho \"=== IPs suspectes (>$THRESHOLD requêtes/24h, UA Chrome, pas de JS/CSS/images) ===\"\n\n# Filtrer les requêtes des dernières 24h, UA contenant Chrome,\n# uniquement des pages HTML (pas de ressources statiques)\nawk -v threshold=\"$THRESHOLD\" '\n/Chrome\\// && !/\\.(js|css|png|jpg|jpeg|webp|svg|woff2|ico)/ {\n    ip = $1\n    count[ip]++\n}\nEND {\n    for (ip in count) {\n        if (count[ip] > threshold) {\n            printf \"%s\\t%d requêtes\\n\", ip, count[ip]\n        }\n    }\n}' \"$ACCESS_LOG\" | sort -t$'\\t' -k2 -rn | head -20\n\necho \"\"\necho \"=== Vérification des plages IP (whois) ===\"\n# Pour chaque IP suspecte, vérifier si elle appartient à un cloud provider\nawk -v threshold=\"$THRESHOLD\" '\n/Chrome\\// && !/\\.(js|css|png|jpg|jpeg|webp|svg|woff2|ico)/ {\n    count[$1]++\n}\nEND {\n    for (ip in count) {\n        if (count[ip] > threshold) print ip\n    }\n}' \"$ACCESS_LOG\" | while read ip; do\n    org=$(whois \"$ip\" 2>/dev/null | grep -i \"org-name\\|OrgName\\|netname\" | head -1)\n    echo \"$ip => $org\"\ndone\n```\n\nUn vrai navigateur Chrome charge des CSS, des images, du JavaScript. Un crawler headless qui se fait passer pour Chrome ne charge généralement que le HTML. Ce pattern (beaucoup de requêtes HTML, zéro ressource statique, IP cloud) est le signal le plus fiable pour identifier un scraper IA non déclaré.\n\nL'intégration de ce type de détection dans un pipeline CI/CD est parfaitement faisable. Si vous [automatisez déjà vos checks SEO dans le CI/CD](/blog/automatiser-les-checks-seo-dans-le-ci-cd), ajouter une vérification des patterns de crawl suspects est un prolongement naturel.\n\n## Impact réel sur le SEO : un scénario documenté\n\nReprenons le cas de l'éditeur de presse mentionné en introduction, avec des chiffres concrets.\n\n### Contexte\n\n- Site de presse francophone, 28 000 pages indexées\n- Stack : Next.js avec SSR, hébergé sur Kubernetes (3 pods, auto-scaling à 8)\n- Trafic organique : 1,2 million de sessions/mois\n- Crawl Googlebot moyen : 18 000 pages/jour\n\n### Chronologie de la dégradation\n\n**Semaine 1 (baseline)** : TTFB moyen 180 ms. Googlebot crawle 18 000 pages/jour. Les articles publiés le matin apparaissent dans Google News sous 2h.\n\n**Semaine 2** : GPTBot et ClaudeBot commencent un crawl intensif. Les logs montrent 45 000 requêtes/jour pour GPTBot seul, ciblant exclusivement les articles éditoriaux. Le TTFB passe à 420 ms. L'auto-scaling fait monter les pods à 6/8 en permanence — la facture cloud augmente de 40 %.\n\n**Semaine 3** : Bytespider rejoint la fête. 62 000 requêtes/jour combinées pour les trois bots IA. Le TTFB atteint 580 ms. Le rapport d'exploration de Search Console montre que Googlebot a réduit son crawl à 7 200 pages/jour — une chute de 60 %. Les nouveaux articles mettent 8 à 11 jours à apparaître dans l'index.\n\n**Semaine 4 (intervention)** : Mise en place du blocage robots.txt + rate limiting Nginx. En 72h, le TTFB redescend à 210 ms. Le crawl Googlebot remonte progressivement à 15 000 pages/jour sur les deux semaines suivantes.\n\n### Ce que ça coûte réellement\n\nLa perte directe : 11 jours de délai d'indexation sur un site de presse, c'est une perte de trafic Google News et Discover estimée à 15-20 % du trafic organique sur la période. Pour un site à 1,2 million de sessions/mois, ça représente environ 180 000 sessions perdues sur un mois.\n\nLa perte indirecte : les coûts d'infrastructure (auto-scaling) ont augmenté de 40 % sans aucun trafic utile supplémentaire. Du pur gaspillage.\n\nL'article sur le [trafic des bots IA en hausse de 300 %](/blog/ai-bot-traffic-surged-300-hitting-publishers-hardest-report) qui frappe les éditeurs en priorité décrit exactement ce phénomène à l'échelle industrielle.\n\n## Stratégie de visibilité dans les réponses LLM\n\nBloquer tous les bots IA n'est pas nécessairement la bonne stratégie. La question est plus nuancée : quels bots, sur quelles sections, pour quel bénéfice ?\n\n### Le calcul coût-bénéfice\n\nIl existe désormais un trafic référent mesurable depuis les interfaces des LLMs. Quand ChatGPT cite votre article avec un lien, quand Perplexity affiche votre contenu en source, ça génère des visites. Ce trafic est encore modeste comparé au SEO traditionnel (typiquement 1-3 % du trafic organique pour les sites qui en bénéficient), mais il croît rapidement.\n\nLa stratégie optimale pour la plupart des sites :\n\n- **Bloquer les bots d'entraînement** (GPTBot, ClaudeBot, Google-Extended, Meta-ExternalAgent) : votre contenu sert à entraîner des modèles qui peuvent ensuite répondre à vos utilisateurs sans jamais les envoyer chez vous\n- **Autoriser les bots de retrieval** (ChatGPT-User, OAI-SearchBot, PerplexityBot) sur vos sections à forte valeur éditoriale : blog, guides, documentation\n\nC'est exactement la logique du robots.txt différencié présenté plus haut.\n\n### Optimiser le contenu pour le retrieval IA\n\nLes bots de retrieval des LLMs fonctionnent différemment de Googlebot dans leur extraction de contenu. Ils privilégient :\n\n- Les paragraphes auto-suffisants (qui répondent à une question sans nécessiter le contexte de la page entière)\n- Les données structurées, en particulier les FAQ et les HowTo\n- Les informations factuelles datées (les LLMs cherchent à fournir des informations à jour)\n\nL'approche est compatible avec le SEO classique : un contenu bien structuré, avec des H2/H3 clairs et des paragraphes qui répondent chacun à une question spécifique, performe bien à la fois pour Google et pour le retrieval IA.\n\nPour approfondir comment les modèles IA interprètent (et parfois déforment) votre contenu, l'article sur [comment l'IA décide ce que signifie votre contenu](/blog/how-ai-decides-what-your-content-means-and-why-it-gets-you-wrong) détaille les mécanismes internes de compréhension sémantique.\n\n## Monitoring et détection en continu\n\nLa difficulté avec les crawlers IA, c'est leur imprévisibilité. Un nouveau bot peut apparaître du jour au lendemain. Un bot existant peut changer de comportement. Vous ne pouvez pas configurer votre robots.txt une fois et oublier.\n\n### Ce qu'il faut monitorer\n\n**1. La part de trafic bot IA dans vos logs.** Si elle dépasse 20-25 % de vos requêtes totales, vous avez un problème de ressources.\n\n**2. Le crawl rate Googlebot.** Disponible dans le rapport d'exploration de Search Console et via [l'API Search Console](/blog/search-console-api-automatiser-le-reporting-seo). Une chute soudaine corrélée à une hausse du TTFB est le signe classique d'une cannibalisation des ressources par les bots IA.\n\n**3. Les nouveaux user-agents inconnus.** Un monitoring automatisé des user-agents dans vos logs, avec une alerte sur tout nouvel agent non répertorié dépassant un seuil de requêtes, est indispensable.\n\n**4. Le trafic référent depuis les LLMs.** Dans Google Analytics 4, les sources `chat.openai.com`, `perplexity.ai`, `claude.ai` doivent être trackées séparément pour mesurer le ROI de l'accès accordé aux bots de retrieval.\n\nUn outil de monitoring SEO technique comme Seogard détecte automatiquement les variations anormales de crawl et de temps de réponse qui signalent ce type de problème, sans attendre que vous pensiez à vérifier vos logs.\n\n### Automatiser la surveillance avec un cron\n\nPour les équipes qui préfèrent un monitoring maison, un cron quotidien qui parse les logs et envoie un rapport Slack est un minimum :\n\n```bash\n#!/bin/bash\n# /etc/cron.daily/ai-bot-report.sh\n# Rapport quotidien du crawl IA\n\nLOG=\"/var/log/nginx/access.log\"\nSLACK_WEBHOOK=\"https://hooks.slack.com/services/xxx/yyy/zzz\"\nDATE=$(date -d \"yesterday\" '+%d/%b/%Y')\n\n# Comptage par bot IA\nreport=$(awk -v date=\"$DATE\" '\n$0 ~ date {\n    if ($0 ~ /GPTBot/)              bots[\"GPTBot\"]++\n    else if ($0 ~ /ClaudeBot/)      bots[\"ClaudeBot\"]++\n    else if ($0 ~ /Bytespider/)     bots[\"Bytespider\"]++\n    else if ($0 ~ /ChatGPT-User/)   bots[\"ChatGPT-User\"]++\n    else if ($0 ~ /PerplexityBot/)  bots[\"PerplexityBot\"]++\n    else if ($0 ~ /OAI-SearchBot/)  bots[\"OAI-SearchBot\"]++\n    else if ($0 ~ /Googlebot/)      bots[\"Googlebot\"]++\n    total++\n}\nEND {\n    printf \"📊 Crawl IA — %s\\n\", date\n    printf \"Total requêtes : %d\\n\\n\", total\n    for (bot in bots) {\n        pct = (bots[bot] / total) * 100\n        printf \"%-20s %8d (%5.1f%%)\\n\", bot, bots[bot], pct\n    }\n}' \"$LOG\")\n\n# Alerte si les bots IA dépassent 30% du crawl total\nai_pct=$(echo \"$report\" | awk '/GPTBot|ClaudeBot|Bytespider|ChatGPT|Perplexity|OAI-Search/ {sum += $2} /Total/ {total = $4} END {printf \"%.0f\", (sum/total)*100}')\n\nif [ \"$ai_pct\" -gt 30 ]; then\n    alert=\"⚠️ ALERTE : les bots IA représentent ${ai_pct}% du crawl total\"\n    report=\"$alert\\n\\n$report\"\nfi\n\n# Envoi Slack\ncurl -s -X POST \"$SLACK_WEBHOOK\" \\\n    -H 'Content-type: application/json' \\\n    -d \"{\\\"text\\\":\\\"$(echo -e \"$report\")\\\"}\"\n```\n\nCe script est basique mais fonctionnel. En production, vous voudrez le compléter avec la corrélation TTFB et le suivi du crawl Googlebot. Les outils comme [Chrome DevTools](/blog/chrome-devtools-pour-le-seo-astuces-avancees) restent utiles pour debugger des problèmes ponctuels de rendu, mais pour le monitoring continu du crawl bot, l'analyse de logs est irremplaçable.\n\n## Le cadre légal en évolution\n\nUn point que beaucoup de leads SEO sous-estiment : la dimension juridique du crawl IA évolue rapidement et influence directement la stratégie technique.\n\nL'AI Act européen (en application depuis 2025) impose aux fournisseurs de modèles d'IA générative de documenter les données d'entraînement utilisées et de respecter les opt-outs. Le robots.txt, combiné avec les meta tags `noai` et `noimageai` proposés par certains acteurs, commence à avoir une valeur juridique — pas seulement conventionnelle.\n\nConcrètement, cela signifie que votre robots.txt est aussi un document de politique de données. Documentez-le, versionnez-le dans git, et horodatez les changements. Si vous devez un jour prouver que vous aviez bloqué un crawler spécifique avant une certaine date, l'historique git de votre robots.txt sera votre pièce à conviction.\n\nLa question de la [génération de contenu automatisée et du SEO](/blog/contenu-genere-automatiquement-et-seo-ce-que-google-accepte) se pose aussi dans l'autre sens : les LLMs entraînés sur votre contenu peuvent produire du texte qui cannibalise vos pages dans les SERP. Bloquer l'entraînement est une forme de protection de votre avantage compétitif éditorial.\n\n---\n\nLes crawlers IA sont une infrastructure parallèle à celle des moteurs de recherche, avec des volumes comparables et une agressivité souvent supérieure. La gestion de ces bots n'est plus optionnelle : c'est un composant à part entière de la stack SEO technique, au même titre que le sitemap ou le robots.txt pour les search bots. La combinaison robots.txt différencié + rate limiting serveur + monitoring continu des logs est le minimum pour garder le contrôle de vos ressources serveur et protéger votre crawl budget Google.","https://seogard.io/blog/llms-et-crawl-comment-les-bots-ia-crawlent-votre-site","IA & SEO","2026-04-10T06:02:45.414Z","2026-04-10","Analyse technique des crawlers IA (GPTBot, ClaudeBot, Bytespider) : identification, impact serveur, contrôle via robots.txt et stratégies de défense.","\u003Cp>Un éditeur de presse français de 28 000 pages a vu son temps de réponse serveur tripler en novembre 2024. Pas de pic de trafic organique. Pas de campagne virale. Dans les logs : GPTBot, ClaudeBot et Bytespider représentaient 47 % des requêtes totales — plus que Googlebot. Le crawl budget Google s'est effondré mécaniquement, et les pages récemment publiées ont mis 11 jours à être indexées au lieu de 2.\u003C/p>\n\u003Cp>Ce scénario se répète sur des centaines de sites depuis 2024. Les crawlers des LLMs sont une nouvelle classe d'agents dont le comportement, les objectifs et l'agressivité n'ont rien à voir avec les search bots traditionnels. Comprendre comment ils fonctionnent est devenu un prérequis technique.\u003C/p>\n\u003Ch2>Cartographie des crawlers IA : qui crawle quoi, et pourquoi\u003C/h2>\n\u003Cp>Les crawlers IA ne forment pas un bloc monolithique. Chaque acteur a ses propres user-agents, ses propres objectifs, et surtout ses propres niveaux de respect des conventions.\u003C/p>\n\u003Ch3>Les crawlers identifiés et documentés\u003C/h3>\n\u003Cp>Voici les principaux user-agents actifs en 2026, avec leur documentation officielle :\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Bot\u003C/th>\n\u003Cth>Opérateur\u003C/th>\n\u003Cth>User-Agent string\u003C/th>\n\u003Cth>Objectif\u003C/th>\n\u003Cth>Respecte robots.txt\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>GPTBot\u003C/td>\n\u003Ctd>OpenAI\u003C/td>\n\u003Ctd>\u003Ccode>GPTBot/1.0\u003C/code>\u003C/td>\n\u003Ctd>Entraînement + retrieval\u003C/td>\n\u003Ctd>Oui (documenté)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>ChatGPT-User\u003C/td>\n\u003Ctd>OpenAI\u003C/td>\n\u003Ctd>\u003Ccode>ChatGPT-User\u003C/code>\u003C/td>\n\u003Ctd>Browsing en temps réel\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>OAI-SearchBot\u003C/td>\n\u003Ctd>OpenAI\u003C/td>\n\u003Ctd>\u003Ccode>OAI-SearchBot/1.0\u003C/code>\u003C/td>\n\u003Ctd>SearchGPT\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>ClaudeBot\u003C/td>\n\u003Ctd>Anthropic\u003C/td>\n\u003Ctd>\u003Ccode>ClaudeBot/1.0\u003C/code>\u003C/td>\n\u003Ctd>Entraînement\u003C/td>\n\u003Ctd>Oui (documenté)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Bytespider\u003C/td>\n\u003Ctd>ByteDance\u003C/td>\n\u003Ctd>\u003Ccode>Bytespider\u003C/code>\u003C/td>\n\u003Ctd>Entraînement (TikTok/Doubao)\u003C/td>\n\u003Ctd>Partiellement\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Meta-ExternalAgent\u003C/td>\n\u003Ctd>Meta\u003C/td>\n\u003Ctd>\u003Ccode>Meta-ExternalAgent/1.0\u003C/code>\u003C/td>\n\u003Ctd>Entraînement LLaMA\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PerplexityBot\u003C/td>\n\u003Ctd>Perplexity\u003C/td>\n\u003Ctd>\u003Ccode>PerplexityBot\u003C/code>\u003C/td>\n\u003Ctd>RAG en temps réel\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Google-Extended\u003C/td>\n\u003Ctd>Google\u003C/td>\n\u003Ctd>\u003Ccode>Google-Extended\u003C/code>\u003C/td>\n\u003Ctd>Entraînement Gemini\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Applebot-Extended\u003C/td>\n\u003Ctd>Apple\u003C/td>\n\u003Ctd>\u003Ccode>Applebot-Extended\u003C/code>\u003C/td>\n\u003Ctd>Entraînement Apple Intelligence\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>cohere-ai\u003C/td>\n\u003Ctd>Cohere\u003C/td>\n\u003Ctd>\u003Ccode>cohere-ai\u003C/code>\u003C/td>\n\u003Ctd>Entraînement\u003C/td>\n\u003Ctd>Oui\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\n\u003Cp>La distinction critique se situe entre les bots d'\u003Cstrong>entraînement\u003C/strong> (qui aspirent massivement du contenu pour créer des datasets) et les bots de \u003Cstrong>retrieval\u003C/strong> (qui récupèrent du contenu à la volée pour répondre à une requête utilisateur). GPTBot sert aux deux. ChatGPT-User ne fait que du retrieval. La différence d'impact sur vos serveurs est considérable.\u003C/p>\n\u003Ch3>Les bots non déclarés\u003C/h3>\n\u003Cp>Le problème majeur : une partie significative du crawl IA n'est pas identifiable via le user-agent. Certains bots se font passer pour des navigateurs classiques (Chrome headless, par exemple). Les logs révèlent souvent des patterns suspects — des requêtes séquentielles sur l'intégralité d'un sitemap, provenant de plages IP de fournisseurs cloud (AWS, GCP, Azure), avec un user-agent Chrome standard.\u003C/p>\n\u003Cp>Identifier ces crawlers fantômes nécessite une analyse des plages IP et des patterns de crawl, pas seulement du user-agent. Nous y reviendrons.\u003C/p>\n\u003Ch2>Anatomie d'un crawl IA : différences fondamentales avec Googlebot\u003C/h2>\n\u003Cp>Googlebot crawle votre site avec un objectif précis : construire et maintenir un index de recherche. Son crawl est \u003Cstrong>sélectif\u003C/strong> — il priorise les pages selon leur PageRank interne, leur fréquence de mise à jour, et les signaux de qualité. Il respecte un crawl rate adaptatif qui évite de surcharger votre serveur.\u003C/p>\n\u003Cp>Les crawlers IA, eux, ont un comportement radicalement différent.\u003C/p>\n\u003Ch3>Crawl exhaustif vs. crawl sélectif\u003C/h3>\n\u003Cp>GPTBot et ClaudeBot ne cherchent pas à \"indexer\" au sens classique. Ils cherchent du \u003Cstrong>texte de qualité\u003C/strong> pour alimenter des datasets d'entraînement. Conséquence : ils crawlent de manière bien plus agressive les pages à fort contenu textuel (articles, documentation, fiches produit détaillées) et ignorent souvent les pages structurelles (catégories, paginations).\u003C/p>\n\u003Cp>Un pattern typique observé dans les logs :\u003C/p>\n\u003Cpre>\u003Ccode># Extrait de logs d'accès — GPTBot sur un site e-commerce (15 000 produits)\n# 2026-03-15 — 6h de crawl\n\n66.249.xx.xx - - [15/Mar/2026:02:14:33] \"GET /produit/chaussure-running-nike-pegasus-41 HTTP/2\" 200 48291 \"-\" \"GPTBot/1.0 (+https://openai.com/gptbot)\"\n66.249.xx.xx - - [15/Mar/2026:02:14:34] \"GET /produit/chaussure-trail-salomon-ultra-glide HTTP/2\" 200 52103 \"-\" \"GPTBot/1.0 (+https://openai.com/gptbot)\"\n66.249.xx.xx - - [15/Mar/2026:02:14:34] \"GET /produit/chaussure-running-asics-gel-nimbus-26 HTTP/2\" 200 45887 \"-\" \"GPTBot/1.0 (+https://openai.com/gptbot)\"\n# ... 800 requêtes/minute sur les fiches produit uniquement\n# Aucune requête sur /categorie/ ou /marque/\n\u003C/code>\u003C/pre>\n\u003Cp>800 requêtes par minute. Googlebot, sur le même site, tournait à 40-60 requêtes par minute. Un facteur 15x.\u003C/p>\n\u003Ch3>Pas de gestion du crawl budget côté IA\u003C/h3>\n\u003Cp>Googlebot a un mécanisme intégré de \u003Cstrong>crawl rate limiting\u003C/strong> : si votre serveur ralentit, il réduit sa cadence. Vous pouvez ajuster ça dans Search Console. Les crawlers IA n'ont pour la plupart \u003Cstrong>aucun mécanisme d'adaptation dynamique documenté\u003C/strong>. GPTBot respecte le \u003Ccode>Crawl-delay\u003C/code> dans robots.txt selon la documentation d'OpenAI, mais ce n'est pas un standard universel. Bytespider, historiquement, l'ignore largement.\u003C/p>\n\u003Cp>Le risque concret : un crawl IA agressif consomme les ressources serveur, augmente le TTFB, et Googlebot — qui lui adapte sa cadence — réduit mécaniquement son crawl. Vos pages mettent plus longtemps à être découvertes et indexées. C'est exactement le scénario de l'éditeur de presse évoqué en introduction.\u003C/p>\n\u003Cp>Pour suivre ce type de dégradation, \u003Ca href=\"/blog/google-search-console-les-rapports-que-vous-ignorez\">les rapports d'exploration de la Search Console\u003C/a> sont votre premier signal d'alerte : une chute du nombre de pages crawlées par jour par Googlebot, corrélée à une hausse du temps de réponse moyen, indique presque toujours une surcharge causée par un tiers.\u003C/p>\n\u003Ch2>Contrôler l'accès via robots.txt : ce qui fonctionne, ce qui ne fonctionne pas\u003C/h2>\n\u003Cp>Le robots.txt reste le mécanisme standard pour communiquer vos préférences aux crawlers IA. Tous les opérateurs majeurs (OpenAI, Anthropic, Google, Meta, Apple) se sont engagés publiquement à le respecter. Mais les nuances sont essentielles.\u003C/p>\n\u003Ch3>Configuration robots.txt complète pour les bots IA\u003C/h3>\n\u003Cp>Voici une configuration robots.txt qui couvre les principaux crawlers IA actuels, avec des stratégies différenciées :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># robots.txt — Stratégie différenciée pour les bots IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Dernière mise à jour : 2026-04-10\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># === SEARCH ENGINES (accès complet) ===\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Googlebot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Bingbot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># === BOTS IA — ENTRAÎNEMENT (blocage total) ===\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># On refuse l'utilisation du contenu pour l'entraînement de modèles\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">GPTBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">ClaudeBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Bytespider\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: Meta-\u003C/span>\u003Cspan style=\"color:#F97583\">ExternalAgent\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: Google-\u003C/span>\u003Cspan style=\"color:#F97583\">Extended\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: Applebot-\u003C/span>\u003Cspan style=\"color:#F97583\">Extended\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: cohere-\u003C/span>\u003Cspan style=\"color:#F97583\">ai\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">CCBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Omgili\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Diffbot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># === BOTS IA — RETRIEVAL (accès autorisé, contenu limité) ===\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># On autorise les bots qui citent/linkent nos pages en temps réel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: ChatGPT-\u003C/span>\u003Cspan style=\"color:#F97583\">User\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /blog/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /guide/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">PerplexityBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /blog/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /guide/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: OAI-\u003C/span>\u003Cspan style=\"color:#F97583\">SearchBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /blog/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /guide/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>La logique derrière cette configuration : bloquer les bots d'entraînement (qui prennent votre contenu sans rien donner en retour) tout en autorisant les bots de retrieval sur les sections où vous souhaitez de la visibilité dans les réponses des LLMs. ChatGPT-User et PerplexityBot, lorsqu'ils citent votre contenu, génèrent du trafic référent mesurable.\u003C/p>\n\u003Ch3>Les limites du robots.txt\u003C/h3>\n\u003Cp>Trois problèmes concrets que le robots.txt ne résout pas :\u003C/p>\n\u003Cp>\u003Cstrong>1. Les bots non identifiés.\u003C/strong> Un crawler qui se présente avec un user-agent Chrome ne sera pas filtré par robots.txt. Seule l'analyse des plages IP et des patterns de requête permet de les détecter.\u003C/p>\n\u003Cp>\u003Cstrong>2. Le robots.txt est consultatif.\u003C/strong> Rien n'empêche techniquement un bot de l'ignorer. Les acteurs majeurs le respectent par engagement légal (surtout depuis les procès NYT vs. OpenAI et les régulations européennes). Mais les acteurs plus petits ou les scrapers dérivés ne jouent pas forcément le jeu.\u003C/p>\n\u003Cp>\u003Cstrong>3. Pas de granularité temporelle.\u003C/strong> Vous ne pouvez pas dire \"crawlez-moi 50 pages par jour maximum\" via robots.txt. Le \u003Ccode>Crawl-delay\u003C/code> est un hack imparfait et n'est pas supporté par tous les bots.\u003C/p>\n\u003Ch2>Défense en profondeur : contrôler le crawl au niveau serveur\u003C/h2>\n\u003Cp>Le robots.txt est votre première ligne. La configuration serveur est votre deuxième ligne — et elle est impérative pour les bots qui ne jouent pas le jeu.\u003C/p>\n\u003Ch3>Rate limiting par user-agent avec Nginx\u003C/h3>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># /etc/nginx/conf.d/ai-bots-rate-limit.conf\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Définition d'une map pour identifier les bots IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $\u003C/span>\u003Cspan style=\"color:#FFAB70\">http_user_agent\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $is_ai_bot {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    default\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*GPTBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">              1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*ClaudeBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">           1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*Bytespider\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">          1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*ChatGPT-User\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">        1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*PerplexityBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">       1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*Meta-ExternalAgent\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">  1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*OAI-SearchBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">       1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*cohere-ai\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">           1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*Diffbot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">             1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*CCBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">               1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Zone de rate limiting dédiée aux bots IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 5 requêtes par seconde max — burst de 10 avec délai\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">limit_req_zone \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$binary_remote_addr zone=ai_bot_limit:10m rate=5r/s;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">server\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    listen \u003C/span>\u003Cspan style=\"color:#79B8FF\">443\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ssl http2;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    server_name \u003C/span>\u003Cspan style=\"color:#E1E4E8\">www.monsite-ecommerce.fr;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Appliquer le rate limit uniquement aux bots IA identifiés\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    location\u003C/span>\u003Cspan style=\"color:#B392F0\"> / \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ($is_ai_bot) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            set \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$limit_ai \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"1\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        limit_req \u003C/span>\u003Cspan style=\"color:#E1E4E8\">zone=ai_bot_limit burst=10 nodelay;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # Note : la directive limit_req s'applique ici à tous,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # mais la zone est dimensionnée pour les bots.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # Pour un ciblage plus fin, utilisez un location imbriqué\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # ou un module Lua (OpenResty).\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        proxy_pass \u003C/span>\u003Cspan style=\"color:#E1E4E8\">http://backend;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Bloc spécifique : retourner 403 pour les bots à bloquer complètement\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Plus fiable que robots.txt pour les bots non coopératifs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ($http_user_agent \u003C/span>\u003Cspan style=\"color:#F97583\">~* \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"(Bytespider|CCBot|Diffbot)\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 403\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Cette approche a un avantage clé sur le robots.txt : elle s'exécute réellement. Un \u003Ccode>return 403\u003C/code> ne laisse pas le choix au bot. Le rate limiting protège vos ressources serveur même si un bot tente un crawl massif.\u003C/p>\n\u003Cp>Pour les architectures utilisant un CDN (Cloudflare, Fastly, Akamai), la logique de filtrage peut être déportée au edge — ce qui est souvent plus performant. Si vous utilisez Cloudflare Workers ou des VCL Fastly pour modifier les réponses HTTP, le même principe s'applique : \u003Ca href=\"/blog/edge-seo-modifier-les-reponses-http-au-niveau-cdn\">l'edge SEO\u003C/a> permet de filtrer les bots sans toucher à votre infrastructure applicative.\u003C/p>\n\u003Ch3>Détection des crawlers non identifiés via les logs\u003C/h3>\n\u003Cp>Le vrai défi n'est pas GPTBot — il s'identifie proprement. Le défi, ce sont les crawlers qui ne s'identifient pas. Voici un script bash pour détecter les patterns de crawl suspects dans vos access logs :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#!/bin/bash\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># detect-stealth-crawlers.sh\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Détecte les IPs qui crawlent de manière séquentielle avec un UA Chrome\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># depuis des plages IP de cloud providers\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">ACCESS_LOG\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/var/log/nginx/access.log\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">THRESHOLD\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">200\u003C/span>\u003Cspan style=\"color:#6A737D\">  # Nombre de requêtes par IP sur les dernières 24h\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"=== IPs suspectes (>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$THRESHOLD\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> requêtes/24h, UA Chrome, pas de JS/CSS/images) ===\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Filtrer les requêtes des dernières 24h, UA contenant Chrome,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># uniquement des pages HTML (pas de ressources statiques)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">awk\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -v\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> threshold=\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$THRESHOLD\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">/Chrome\\// &#x26;&#x26; !/\\.(js|css|png|jpg|jpeg|webp|svg|woff2|ico)/ {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    ip = $1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    count[ip]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">END {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    for (ip in count) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        if (count[ip] > threshold) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            printf \"%s\\t%d requêtes\\n\", ip, count[ip]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}'\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$ACCESS_LOG\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sort\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -t\u003C/span>\u003Cspan style=\"color:#9ECBFF\">$'\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\t\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -k2\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -rn\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -20\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"=== Vérification des plages IP (whois) ===\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Pour chaque IP suspecte, vérifier si elle appartient à un cloud provider\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">awk\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -v\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> threshold=\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$THRESHOLD\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">/Chrome\\// &#x26;&#x26; !/\\.(js|css|png|jpg|jpeg|webp|svg|woff2|ico)/ {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    count[$1]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">END {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    for (ip in count) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        if (count[ip] > threshold) print ip\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}'\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$ACCESS_LOG\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#F97583\"> while\u003C/span>\u003Cspan style=\"color:#79B8FF\"> read\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ip\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#F97583\">do\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    org\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">whois\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$ip\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> 2>\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/dev/null\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -i\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"org-name\\|OrgName\\|netname\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$ip\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> => \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$org\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">done\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Un vrai navigateur Chrome charge des CSS, des images, du JavaScript. Un crawler headless qui se fait passer pour Chrome ne charge généralement que le HTML. Ce pattern (beaucoup de requêtes HTML, zéro ressource statique, IP cloud) est le signal le plus fiable pour identifier un scraper IA non déclaré.\u003C/p>\n\u003Cp>L'intégration de ce type de détection dans un pipeline CI/CD est parfaitement faisable. Si vous \u003Ca href=\"/blog/automatiser-les-checks-seo-dans-le-ci-cd\">automatisez déjà vos checks SEO dans le CI/CD\u003C/a>, ajouter une vérification des patterns de crawl suspects est un prolongement naturel.\u003C/p>\n\u003Ch2>Impact réel sur le SEO : un scénario documenté\u003C/h2>\n\u003Cp>Reprenons le cas de l'éditeur de presse mentionné en introduction, avec des chiffres concrets.\u003C/p>\n\u003Ch3>Contexte\u003C/h3>\n\u003Cul>\n\u003Cli>Site de presse francophone, 28 000 pages indexées\u003C/li>\n\u003Cli>Stack : Next.js avec SSR, hébergé sur Kubernetes (3 pods, auto-scaling à 8)\u003C/li>\n\u003Cli>Trafic organique : 1,2 million de sessions/mois\u003C/li>\n\u003Cli>Crawl Googlebot moyen : 18 000 pages/jour\u003C/li>\n\u003C/ul>\n\u003Ch3>Chronologie de la dégradation\u003C/h3>\n\u003Cp>\u003Cstrong>Semaine 1 (baseline)\u003C/strong> : TTFB moyen 180 ms. Googlebot crawle 18 000 pages/jour. Les articles publiés le matin apparaissent dans Google News sous 2h.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine 2\u003C/strong> : GPTBot et ClaudeBot commencent un crawl intensif. Les logs montrent 45 000 requêtes/jour pour GPTBot seul, ciblant exclusivement les articles éditoriaux. Le TTFB passe à 420 ms. L'auto-scaling fait monter les pods à 6/8 en permanence — la facture cloud augmente de 40 %.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine 3\u003C/strong> : Bytespider rejoint la fête. 62 000 requêtes/jour combinées pour les trois bots IA. Le TTFB atteint 580 ms. Le rapport d'exploration de Search Console montre que Googlebot a réduit son crawl à 7 200 pages/jour — une chute de 60 %. Les nouveaux articles mettent 8 à 11 jours à apparaître dans l'index.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine 4 (intervention)\u003C/strong> : Mise en place du blocage robots.txt + rate limiting Nginx. En 72h, le TTFB redescend à 210 ms. Le crawl Googlebot remonte progressivement à 15 000 pages/jour sur les deux semaines suivantes.\u003C/p>\n\u003Ch3>Ce que ça coûte réellement\u003C/h3>\n\u003Cp>La perte directe : 11 jours de délai d'indexation sur un site de presse, c'est une perte de trafic Google News et Discover estimée à 15-20 % du trafic organique sur la période. Pour un site à 1,2 million de sessions/mois, ça représente environ 180 000 sessions perdues sur un mois.\u003C/p>\n\u003Cp>La perte indirecte : les coûts d'infrastructure (auto-scaling) ont augmenté de 40 % sans aucun trafic utile supplémentaire. Du pur gaspillage.\u003C/p>\n\u003Cp>L'article sur le \u003Ca href=\"/blog/ai-bot-traffic-surged-300-hitting-publishers-hardest-report\">trafic des bots IA en hausse de 300 %\u003C/a> qui frappe les éditeurs en priorité décrit exactement ce phénomène à l'échelle industrielle.\u003C/p>\n\u003Ch2>Stratégie de visibilité dans les réponses LLM\u003C/h2>\n\u003Cp>Bloquer tous les bots IA n'est pas nécessairement la bonne stratégie. La question est plus nuancée : quels bots, sur quelles sections, pour quel bénéfice ?\u003C/p>\n\u003Ch3>Le calcul coût-bénéfice\u003C/h3>\n\u003Cp>Il existe désormais un trafic référent mesurable depuis les interfaces des LLMs. Quand ChatGPT cite votre article avec un lien, quand Perplexity affiche votre contenu en source, ça génère des visites. Ce trafic est encore modeste comparé au SEO traditionnel (typiquement 1-3 % du trafic organique pour les sites qui en bénéficient), mais il croît rapidement.\u003C/p>\n\u003Cp>La stratégie optimale pour la plupart des sites :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Bloquer les bots d'entraînement\u003C/strong> (GPTBot, ClaudeBot, Google-Extended, Meta-ExternalAgent) : votre contenu sert à entraîner des modèles qui peuvent ensuite répondre à vos utilisateurs sans jamais les envoyer chez vous\u003C/li>\n\u003Cli>\u003Cstrong>Autoriser les bots de retrieval\u003C/strong> (ChatGPT-User, OAI-SearchBot, PerplexityBot) sur vos sections à forte valeur éditoriale : blog, guides, documentation\u003C/li>\n\u003C/ul>\n\u003Cp>C'est exactement la logique du robots.txt différencié présenté plus haut.\u003C/p>\n\u003Ch3>Optimiser le contenu pour le retrieval IA\u003C/h3>\n\u003Cp>Les bots de retrieval des LLMs fonctionnent différemment de Googlebot dans leur extraction de contenu. Ils privilégient :\u003C/p>\n\u003Cul>\n\u003Cli>Les paragraphes auto-suffisants (qui répondent à une question sans nécessiter le contexte de la page entière)\u003C/li>\n\u003Cli>Les données structurées, en particulier les FAQ et les HowTo\u003C/li>\n\u003Cli>Les informations factuelles datées (les LLMs cherchent à fournir des informations à jour)\u003C/li>\n\u003C/ul>\n\u003Cp>L'approche est compatible avec le SEO classique : un contenu bien structuré, avec des H2/H3 clairs et des paragraphes qui répondent chacun à une question spécifique, performe bien à la fois pour Google et pour le retrieval IA.\u003C/p>\n\u003Cp>Pour approfondir comment les modèles IA interprètent (et parfois déforment) votre contenu, l'article sur \u003Ca href=\"/blog/how-ai-decides-what-your-content-means-and-why-it-gets-you-wrong\">comment l'IA décide ce que signifie votre contenu\u003C/a> détaille les mécanismes internes de compréhension sémantique.\u003C/p>\n\u003Ch2>Monitoring et détection en continu\u003C/h2>\n\u003Cp>La difficulté avec les crawlers IA, c'est leur imprévisibilité. Un nouveau bot peut apparaître du jour au lendemain. Un bot existant peut changer de comportement. Vous ne pouvez pas configurer votre robots.txt une fois et oublier.\u003C/p>\n\u003Ch3>Ce qu'il faut monitorer\u003C/h3>\n\u003Cp>\u003Cstrong>1. La part de trafic bot IA dans vos logs.\u003C/strong> Si elle dépasse 20-25 % de vos requêtes totales, vous avez un problème de ressources.\u003C/p>\n\u003Cp>\u003Cstrong>2. Le crawl rate Googlebot.\u003C/strong> Disponible dans le rapport d'exploration de Search Console et via \u003Ca href=\"/blog/search-console-api-automatiser-le-reporting-seo\">l'API Search Console\u003C/a>. Une chute soudaine corrélée à une hausse du TTFB est le signe classique d'une cannibalisation des ressources par les bots IA.\u003C/p>\n\u003Cp>\u003Cstrong>3. Les nouveaux user-agents inconnus.\u003C/strong> Un monitoring automatisé des user-agents dans vos logs, avec une alerte sur tout nouvel agent non répertorié dépassant un seuil de requêtes, est indispensable.\u003C/p>\n\u003Cp>\u003Cstrong>4. Le trafic référent depuis les LLMs.\u003C/strong> Dans Google Analytics 4, les sources \u003Ccode>chat.openai.com\u003C/code>, \u003Ccode>perplexity.ai\u003C/code>, \u003Ccode>claude.ai\u003C/code> doivent être trackées séparément pour mesurer le ROI de l'accès accordé aux bots de retrieval.\u003C/p>\n\u003Cp>Un outil de monitoring SEO technique comme Seogard détecte automatiquement les variations anormales de crawl et de temps de réponse qui signalent ce type de problème, sans attendre que vous pensiez à vérifier vos logs.\u003C/p>\n\u003Ch3>Automatiser la surveillance avec un cron\u003C/h3>\n\u003Cp>Pour les équipes qui préfèrent un monitoring maison, un cron quotidien qui parse les logs et envoie un rapport Slack est un minimum :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#!/bin/bash\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># /etc/cron.daily/ai-bot-report.sh\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Rapport quotidien du crawl IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">LOG\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/var/log/nginx/access.log\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">SLACK_WEBHOOK\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://hooks.slack.com/services/xxx/yyy/zzz\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">DATE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">date\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -d\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"yesterday\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '+%d/%b/%Y'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Comptage par bot IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">report\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">awk\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -v\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> date=\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$DATE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">$0 ~ date {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    if ($0 ~ /GPTBot/)              bots[\"GPTBot\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    else if ($0 ~ /ClaudeBot/)      bots[\"ClaudeBot\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    else if ($0 ~ /Bytespider/)     bots[\"Bytespider\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    else if ($0 ~ /ChatGPT-User/)   bots[\"ChatGPT-User\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    else if ($0 ~ /PerplexityBot/)  bots[\"PerplexityBot\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    else if ($0 ~ /OAI-SearchBot/)  bots[\"OAI-SearchBot\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    else if ($0 ~ /Googlebot/)      bots[\"Googlebot\"]++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    total++\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">END {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    printf \"📊 Crawl IA — %s\\n\", date\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    printf \"Total requêtes : %d\\n\\n\", total\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    for (bot in bots) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        pct = (bots[bot] / total) * 100\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        printf \"%-20s %8d (%5.1f%%)\\n\", bot, bots[bot], pct\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}'\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$LOG\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Alerte si les bots IA dépassent 30% du crawl total\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">ai_pct\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$report\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '/GPTBot|ClaudeBot|Bytespider|ChatGPT|Perplexity|OAI-Search/ {sum += $2} /Total/ {total = $4} END {printf \"%.0f\", (sum/total)*100}'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$ai_pct\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> -gt\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 30\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C/span>\u003Cspan style=\"color:#F97583\">then\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    alert\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"⚠️ ALERTE : les bots IA représentent ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">ai_pct\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}% du crawl total\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    report\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$alert\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\\n\\n\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$report\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">fi\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Envoi Slack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -X\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> POST\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$SLACK_WEBHOOK\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    -H\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'Content-type: application/json'\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    -d\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"{\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">text\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -e\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$report\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\")\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce script est basique mais fonctionnel. En production, vous voudrez le compléter avec la corrélation TTFB et le suivi du crawl Googlebot. Les outils comme \u003Ca href=\"/blog/chrome-devtools-pour-le-seo-astuces-avancees\">Chrome DevTools\u003C/a> restent utiles pour debugger des problèmes ponctuels de rendu, mais pour le monitoring continu du crawl bot, l'analyse de logs est irremplaçable.\u003C/p>\n\u003Ch2>Le cadre légal en évolution\u003C/h2>\n\u003Cp>Un point que beaucoup de leads SEO sous-estiment : la dimension juridique du crawl IA évolue rapidement et influence directement la stratégie technique.\u003C/p>\n\u003Cp>L'AI Act européen (en application depuis 2025) impose aux fournisseurs de modèles d'IA générative de documenter les données d'entraînement utilisées et de respecter les opt-outs. Le robots.txt, combiné avec les meta tags \u003Ccode>noai\u003C/code> et \u003Ccode>noimageai\u003C/code> proposés par certains acteurs, commence à avoir une valeur juridique — pas seulement conventionnelle.\u003C/p>\n\u003Cp>Concrètement, cela signifie que votre robots.txt est aussi un document de politique de données. Documentez-le, versionnez-le dans git, et horodatez les changements. Si vous devez un jour prouver que vous aviez bloqué un crawler spécifique avant une certaine date, l'historique git de votre robots.txt sera votre pièce à conviction.\u003C/p>\n\u003Cp>La question de la \u003Ca href=\"/blog/contenu-genere-automatiquement-et-seo-ce-que-google-accepte\">génération de contenu automatisée et du SEO\u003C/a> se pose aussi dans l'autre sens : les LLMs entraînés sur votre contenu peuvent produire du texte qui cannibalise vos pages dans les SERP. Bloquer l'entraînement est une forme de protection de votre avantage compétitif éditorial.\u003C/p>\n\u003Chr>\n\u003Cp>Les crawlers IA sont une infrastructure parallèle à celle des moteurs de recherche, avec des volumes comparables et une agressivité souvent supérieure. La gestion de ces bots n'est plus optionnelle : c'est un composant à part entière de la stack SEO technique, au même titre que le sitemap ou le robots.txt pour les search bots. La combinaison robots.txt différencié + rate limiting serveur + monitoring continu des logs est le minimum pour garder le contrôle de vos ressources serveur et protéger votre crawl budget Google.\u003C/p>",null,12,[18,19,20,21,22,23],"llm","gptbot","crawl","ai","robots-txt","crawler","LLMs et crawl : comment GPTBot, Claude et les bots IA crawlent votre site","Fri Apr 10 2026 06:02:45 GMT+0000 (Coordinated Universal Time)",[27,41],{"_id":28,"slug":29,"__v":6,"author":7,"canonical":30,"category":10,"createdAt":31,"date":12,"description":32,"image":15,"imageAlt":15,"readingTime":16,"tags":33,"title":39,"updatedAt":40},"69d8764caa6b273b0c062b8c","google-sge-ai-overviews-quel-impact-sur-le-seo-technique","https://seogard.io/blog/google-sge-ai-overviews-quel-impact-sur-le-seo-technique","2026-04-10T04:02:20.160Z","Comment adapter votre architecture technique pour que Google SGE et AI Overviews exploitent correctement votre contenu. Code, config et stratégie.",[34,35,36,37,38],"sge","ai-overviews","google","seo","structured-data","AI Overviews et SEO technique : préparer son site","Fri Apr 10 2026 04:02:20 GMT+0000 (Coordinated Universal Time)",{"_id":42,"slug":43,"__v":6,"author":7,"canonical":44,"category":10,"createdAt":45,"date":12,"description":46,"image":15,"imageAlt":15,"readingTime":47,"tags":48,"title":51,"updatedAt":52},"69d8ae9caa6b273b0c333546","optimiser-pour-les-moteurs-de-reponse-ia","https://seogard.io/blog/optimiser-pour-les-moteurs-de-reponse-ia","2026-04-10T08:02:36.072Z","Comment structurer votre site pour être cité par ChatGPT, Perplexity et les LLM. Balisage, crawl IA, contenu structuré : méthodes actionnables.",14,[21,49,50,37,18],"chatgpt","perplexity","Optimiser pour les moteurs de réponse IA : guide technique","Fri Apr 10 2026 08:02:36 GMT+0000 (Coordinated Universal Time)"]