Certains liens de cette page sont des liens d'affiliation : si vous vous inscrivez via ces liens, ce site touche une commission, sans surcoût pour vous. Les prix et les recommandations ne changent pas.

La question est venue sous notre article sur l’analytique, et dans le bon ordre : robots.txt, Cloudflare, Anubis. On en discute comme d’alternatives. Ce n’en sont pas. L’un publie une préférence, l’autre applique une décision en bordure, le troisième fait payer au client l’accès à la page. Choisir entre eux, c’est décider laquelle de ces trois choses on veut réellement.

Nous avons quinze jours de log d’accès d’un site mis en ligne en octobre, 9 996 lignes, et une pile Anubis jetable sur un portable. Tout ce qui porte un chiffre ci-dessous vient de l’une de ces deux sources. Là où nous n’avons pas de chiffres à nous, c’est écrit.

D’abord : qui demande, au fait

Avant de choisir un outil, regardez ce que vaut le protocole poli sur votre propre log. Sur 9 996 requêtes, 334 visaient robots.txt. Voici qui les a envoyées, face à ce que chacun a pris :

CrawlerRequêtesRequêtes robots.txtURL distinctes
ClaudeBot48478330
Googlebot54117333
GoogleOther5200327
GPTBot3910387
meta-externalagent3220315
AhrefsBot20221129
bingbot1641867
OAI-SearchBot1083561
Amazonbot96394
PerplexityBot63921
YandexBot49338
Applebot30522

Les deux zéros au milieu sont la partie intéressante, et ils ne veulent pas dire ce qu’ils semblent dire.

GPTBot n’a pas demandé notre robots.txt une seule fois sur 391 requêtes. OAI-SearchBot l’a demandé 35 fois - et les deux partagent des plages d’IP. Idem chez Meta : meta-externalagent, le crawler de données d’entraînement, n’a jamais demandé le fichier, tandis que facebookexternalhit, qui récupère les aperçus de liens, l’a demandé huit fois. Google fait pareil : Googlebot 17 fois, GoogleOther pas une, et les deux sur la même infrastructure.

La lecture honnête n’est donc pas « les crawlers d’entraînement ignorent robots.txt ». C’est que la requête se fait ailleurs dans la flotte de l’éditeur, et que le crawler visible dans votre log est en aval d’un cache que vous ne pouvez pas observer. Conséquence pratique : votre log ne peut pas dire si une règle de robots.txt a jamais été vue, encore moins respectée. Le seul test de l’efficacité d’une règle, c’est que les chemins interdits cessent d’être demandés.

Anthropic est l’exception en sens inverse. 78 requêtes sur 484, c’est une vérification de robots.txt pour six requêtes de contenu, et les deux premières requêtes que ClaudeBot nous ait jamais adressées étaient /robots.txt puis /, à une seconde d’intervalle.

robots.txt : une demande, avec une mince couche de droit derrière

Coût : zéro. Effet mécanique : zéro. Un chemin interdit est toujours servi à qui le demande.

Ce qui a changé récemment, c’est la paperasse derrière. L’article 53(1)(c) du règlement IA impose aux fournisseurs de modèles à usage général de mettre en place une politique visant à identifier et respecter les réserves de droits exprimées au titre de l’article 4(3) de la directive sur le droit d’auteur, « y compris au moyen de technologies de pointe ». Le code de bonnes pratiques qui l’accompagne nomme explicitement l’une de ces technologies : les signataires s’engagent à respecter robots.txt conformément au RFC 9309.

Lisez le périmètre avant de vous appuyer dessus. L’obligation pèse sur les fournisseurs de modèles à usage général, et le code est volontaire et signé. Un scraper qui n’est pas lui-même fournisseur de modèle en est dehors, et ce qui constitue une réserve de droits valable reste une question pour les tribunaux. La FAQ de la Commission liste plusieurs autres mécanismes lisibles par machine à côté de robots.txt.

La valeur pratique est réelle mais étroite : un robots.txt avec des directives IA explicites ne coûte rien, et c’est l’artefact que vous montrerez s’il faut un jour prouver que la réserve a été exprimée. Une preuve, pas un mur.

Cloudflare : l’application, si votre DNS y est déjà

C’est la section où nous n’avons aucun chiffre à nous, et nous préférons le dire plutôt que déguiser de la documentation en mesure. Notre blog n’est pas derrière Cloudflare, rien de ce qui suit n’a été mesuré par nous.

D’après la documentation de Cloudflare, AI Crawl Control montre quels services IA vous explorent, permet des règles d’autorisation ou de blocage par crawler, suit le respect de robots.txt et expose une option pay per crawl en bêta privée. La fonction managed robots.txt génère les directives à partir des politiques choisies et les place avant ce que votre origine sert déjà. Les deux sont documentées comme disponibles sur toutes les offres.

Le point architectural : c’est la seule des trois options qui bloque une requête avant qu’elle n’atteigne votre serveur, et la seule où quelqu’un d’autre maintient la liste de qui est qui. Tout l’échange est là. Vous obtenez l’application sans rien exploiter, et en contrepartie la décision de ce qui compte comme crawler IA est prise par un tiers, devant votre site, pour chaque visiteur.

Anubis : faire payer le client

Anubis est un proxy inverse qui place une épreuve de proof-of-work devant l’origine. Aucune revendication d’identité n’intervient : un client incapable d’exécuter le JavaScript de l’épreuve n’obtient pas la page, quel que soit son user-agent.

Nous avons fait tourner la v1.28.2 devant une origine nginx sur un portable et l’avons sondée. Avec la politique par défaut livrée :

ClientRéponse
curl/8.18.0200, direct vers l’origine, 53 octets
user-agent GPTBotpage de refus, 2 270 octets, servie en HTTP 200
user-agent ClaudeBotpage de refus, servie en HTTP 200
user-agent Googlebotpage d’épreuve, ~7,1 Ko
user-agent Chrome bureaupage d’épreuve, ~7,1 Ko

Trois choses à savoir avant de déployer.

La page de refus revient en HTTP 200, pas 403. Si vous surveillez votre site par code de statut, un crawler totalement bloqué ressemble à un crawler en bonne santé.

Un client non-navigateur simple et honnête passe sans entrave. C’est délibéré - cela garde curl, les lecteurs de flux et votre propre supervision en état de marche - mais cela veut aussi dire qu’Anubis n’est pas un mur contre le scraping en général. Tout ce qui ne prétend pas être un navigateur passe par défaut.

Et la ligne Googlebot est un artefact de laboratoire qui mérite d’être signalé : Anubis vérifie les moteurs de recherche par DNS inverse, ce qui ne peut pas aboutir pour une requête venant de 127.0.0.1. Sur un déploiement réel, cette ligne serait un passage, pas une épreuve. Nous la montrons parce que c’est exactement le genre de résultat qui ressemble à une découverte sans en être une.

Ce que l’épreuve coûte à l’humain

C’est le chiffre qui décide si Anubis est utilisable sur un site avec de vrais visiteurs. Nous avons résolu l’épreuve avec un Chromium headless et mesuré de la navigation à l’affichage de la page d’origine :

DifficultéMédianePassages
2 (défaut)0,08 s5
40,27 s5
650 à 75 s2 sur 3

Au défaut livré, la barrière est invisible. Deux crans plus haut, c’est une minute de page qui tourne, car chaque niveau multiplie le travail par seize. Le troisième passage en difficulté 6 n’a pas abouti du tout dans notre délai de 90 s, et c’est la forme honnête de la queue de distribution : à ce réglage, le coût n’est pas seulement élevé, il est assez dispersé pour qu’une partie des visiteurs abandonne. Si vous tournez ce bouton parce que le défaut « a l’air faible », vous ne le sentirez pas : votre propre navigateur garde le cookie de passage une semaine. C’est chaque nouveau venu qui paie.

Deux pièges de déploiement, chacun plus coûteux que la mesure elle-même.

La variable d’environnement DIFFICULTY ne change pas l’épreuve. En v1.28.2, le log de démarrage l’annonce, l’épreuve servie l’ignore, et le chiffre qui compte vient du fichier de politique. Nous ne l’avons vu qu’en lisant la difficulté dans le JSON embarqué de la page d’épreuve elle-même.

Sans USE_REMOTE_ADDRESS=true, chaque requête renvoyait un HTTP 500, avec [misconfiguration] X-Real-IP header is not set dans le log. Anubis suppose que quelque chose devant lui pose cet en-tête. Si rien ne le pose, il se ferme sur tout le trafic, pas seulement sur les robots.

Peut-on même savoir qui est qui

Les trois approches reposent au fond sur l’identification, nous avons donc vérifié à quel point elle fonctionne aujourd’hui. Chaque requête de crawler de notre log, confrontée à la liste publiée par l’éditeur ou au DNS inverse :

CrawlerRequêtesVérifiéesContre
ClaudeBot484484 / 484claude.com/crawling/bots.json
GPTBot391391 / 391openai.com/gptbot.json
OAI-SearchBot108108 / 108openai.com/searchbot.json
PerplexityBot6363 / 63perplexity.ai/perplexitybot.json
ChatGPT-User3937 / 39openai.com/chatgpt-user.json
Googlebot541541 / 541DNS inverse
GoogleOther520520 / 520DNS inverse
bingbot164164 / 164DNS inverse
Amazonbot9696 / 96DNS inverse
YandexBot4949 / 49DNS inverse
Applebot3030 / 30DNS inverse
meta-externalagent322322 / 322préfixes annoncés AS32934

Mieux que ce que suggère le folklore. Les grands crawlers IA publient désormais des listes d’IP qu’on peut récupérer et vérifier, et les nôtres correspondaient à la requête près.

Deux exceptions. ChatGPT-User a envoyé deux requêtes depuis des adresses hors de la liste publiée : c’est le seul agent déclenché par un humain du tableau, et celui où un écart est le moins inquiétant. Et meta-externalagent n’a ni DNS inverse ni liste de crawlers publiée que nous ayons pu trouver, donc la seule vérification disponible est de savoir si l’adresse se situe dans les préfixes réseau annoncés par Meta. C’est une affirmation bien plus faible : elle dit que le paquet vient du réseau de cette entreprise, pas que le crawler est celui qu’il prétend être.

Le rythme, quand l’identité n’est pas disponible

Pour tout ce qui ne se vérifie ni ne s’identifie, le comportement trahit quand même. L’intervalle entre requêtes consécutives du même crawler, sur quinze jours :

CrawlerIntervalle médianPart des intervalles sous 1 s
GPTBot1 s92,1 %
meta-externalagent1 s88,2 %
YandexBot1 s75,0 %
ClaudeBot1 s52,0 %
AhrefsBot29 s31,8 %
Googlebot158 s8,0 %
GoogleOther137 s0,8 %

La coupure est nette, et ce n’est pas une question de politesse. Google a récupéré plus de pages que tout le monde (541 et 520 URL) avec un intervalle médian de plus de deux minutes, parce que le rythme d’exploration est un problème résolu qu’il a eu des décennies pour résoudre. Les crawlers d’entraînement ont pris le site en une passe, aussi vite qu’il servait.

L’usage pratique : sur un site calme, un histogramme des intervalles d’arrivée sépare une exploration d’une audience sans lire un seul user-agent. Un pic concentré dans un seul intervalle inférieur à la seconde est une machine. Les humains produisent bien des rafales serrées - restauration d’onglets, préchargement - mais ne les tiennent pas sur 390 requêtes.

Alors, que choisir

Si vous voulezPrenezPrix
Exprimer une préférence et garder la tracerobots.txt avec des directives IA explicitesRien
Arrêter les requêtes avant que le serveur ne les voie, sans rien exploiterCloudflare AI Crawl ControlVotre DNS passe chez eux, et leur liste définit qui est un robot
Rendre le contenu indisponible à tout ce qui n’exécute pas un navigateurAnubis devant l’origineUne barrière que franchit aussi chaque humain de passage
Savoir ce qui se passe vraimentVotre log d’accès, analyséUn après-midi, une seule fois

Ils s’empilent, et c’est la configuration sensée : robots.txt dit ce que vous voulez, l’un des deux autres applique la part qui vous importe assez pour être appliquée, et le log dit si quelque chose a marché.

Ce qui tourne sur ce site : robots.txt, et rien d’autre. Nous publions des articles pour qu’ils soient lus, y compris par ce qui les résumera ensuite. Si nous avons monté la pile Anubis, c’était pour pouvoir chiffrer l’alternative, et le chiffre dit que l’outil va bien et que le danger est le réglage de difficulté.

Ce que cela ne peut pas dire

Un site, une niche, une fenêtre de quinze jours, 9 996 requêtes. Un site au contenu commercial réel attire une autre classe de scrapers, celle qui ne s’annonce pas et n’apparaît dans aucun de ces tableaux, et face à cette population tous les chiffres ci-dessus ne valent rien.

Les mesures Anubis viennent d’un portable contre localhost : pas de latence réseau, un seul client, et un processeur plus rapide que le téléphone médian. Prenez la courbe de difficulté comme la forme du coût, pas comme sa valeur absolue.

Et le trou qu’aucun log ne peut combler : demander robots.txt n’est pas le respecter, et ne pas le demander n’est pas l’ignorer. Tout dans le premier tableau est une mesure de requêtes, pas de consentement.