Einige Links auf dieser Seite sind Affiliate-Links: bei einer Anmeldung darüber erhält diese Seite eine Provision, für Sie ohne Mehrkosten. Preise und Empfehlungen bleiben davon unberührt.

Diese Frage kam unter unserem Analytics-Artikel, und sie kam in der richtigen Reihenfolge: robots.txt, Cloudflare, Anubis. Die drei werden als Alternativen diskutiert. Sie sind keine. Eines veröffentlicht eine Präferenz, eines setzt am Rand eine Entscheidung durch, eines lässt den Client für die Seite bezahlen. Die Wahl zwischen ihnen ist die Entscheidung, welches dieser drei Dinge man eigentlich will.

Wir haben fünfzehn Tage Access-Log einer Website, die im Oktober online ging, 9.996 Zeilen davon, und einen Wegwerf-Anubis-Stack auf einem Laptop. Alles unten mit einer Zahl stammt aus einer dieser beiden Quellen. Wo wir keine eigenen Zahlen haben, steht das dort.

Zuerst: wer fragt überhaupt

Vor der Werkzeugwahl lohnt der Blick, was das höfliche Protokoll im eigenen Log wert ist. Von 9.996 Anfragen gingen 334 an robots.txt. Hier, wer sie geschickt hat - gegen das, was jeder genommen hat:

CrawlerAnfragenrobots.txt-AbrufeEindeutige URLs
ClaudeBot48478330
Googlebot54117333
GoogleOther5200327
GPTBot3910387
meta-externalagent3220315
AhrefsBot20221129
bingbot1641867
OAI-SearchBot1083561
Amazonbot96394
PerplexityBot63921
YandexBot49338
Applebot30522

Die zwei Nullen in der Mitte sind der interessante Teil, und sie bedeuten nicht, was sie auf den ersten Blick scheinen.

GPTBot rief unsere robots.txt in 391 Anfragen null mal ab. OAI-SearchBot 35-mal - und beide teilen IP-Bereiche. Dasselbe bei Meta: meta-externalagent, der Crawler für Trainingsdaten, fragte die Datei nie an, während facebookexternalhit, der Link-Vorschauen holt, achtmal fragte. Google macht es genauso: Googlebot 17-mal, GoogleOther kein einziges Mal, beide auf derselben Infrastruktur.

Die ehrliche Lesart ist also nicht “die Trainings-Crawler ignorieren robots.txt”. Sondern: der Abruf passiert woanders in der Flotte des Anbieters, und der Crawler, den ihr im Log sieht, steht hinter einem Cache, den ihr nicht beobachten könnt. Daraus folgt praktisch: euer Log kann nicht sagen, ob eine robots.txt-Regel überhaupt gesehen wurde, geschweige denn befolgt. Der einzige Test, ob eine Regel wirkt, ist, ob die verbotenen Pfade nicht mehr angefragt werden.

Anthropic ist hier der Ausreißer in die andere Richtung. 78 Abrufe auf 484 Anfragen ist eine robots.txt-Prüfung auf je sechs Inhaltsanfragen, und die ersten zwei Anfragen, die ClaudeBot je an uns stellte, waren /robots.txt und dann /, eine Sekunde auseinander.

robots.txt: eine Bitte mit einer dünnen Schicht Recht dahinter

Kostet nichts. Tut mechanisch nichts: ein verbotener Pfad wird weiterhin an jeden ausgeliefert, der fragt.

Was sich zuletzt geändert hat, ist das Papier dahinter. Artikel 53(1)(c) der KI-Verordnung verlangt von Anbietern von Modellen mit allgemeinem Verwendungszweck eine Strategie, um Rechtsvorbehalte nach Artikel 4(3) der Urheberrechtsrichtlinie zu ermitteln und zu beachten, “auch mittels modernster Technologien”. Der begleitende Code of Practice benennt eine dieser Technologien ausdrücklich: Unterzeichner verpflichten sich, robots.txt nach RFC 9309 zu beachten.

Vor dem Verlassen darauf die Reichweite genau lesen. Die Pflicht trifft Anbieter von Modellen mit allgemeinem Verwendungszweck, und der Code ist freiwillig und unterzeichnet. Ein Scraper, der selbst kein Modellanbieter ist, steht außen, und was als wirksamer Rechtsvorbehalt gilt, ist weiter eine Frage für die Gerichte. Die FAQ der Kommission listet neben robots.txt mehrere weitere maschinenlesbare Mechanismen.

Der praktische Wert ist echt, aber eng: eine robots.txt mit ausdrücklichen KI-Direktiven ist billig, und sie ist das Artefakt, auf das ihr zeigt, wenn ihr je belegen müsst, dass ein Vorbehalt erklärt wurde. Ein Beweis, keine Mauer.

Cloudflare: Durchsetzung, wenn das DNS schon dort liegt

Das ist der Abschnitt ohne eigene Zahlen, und wir sagen das lieber, als Dokumentation als Messung zu verkleiden. Unser Blog liegt nicht hinter Cloudflare, nichts unten haben wir selbst gemessen.

Aus Cloudflares Doku: AI Crawl Control zeigt, welche KI-Dienste euch crawlen, erlaubt Allow- oder Block-Regeln pro Crawler, verfolgt die robots.txt-Einhaltung und bietet eine Pay-per-Crawl-Option in privater Beta. Die Funktion managed robots.txt erzeugt die Direktiven aus den gewählten Richtlinien und stellt sie dem voran, was euer Origin schon ausliefert. Beides ist als in allen Tarifen verfügbar dokumentiert.

Architektonisch entscheidend: das ist die einzige der drei Optionen, die eine Anfrage stoppt, bevor sie den Server erreicht, und die einzige, bei der jemand anderes die Liste pflegt, wer wer ist. Darin liegt der ganze Tausch. Ihr bekommt Durchsetzung, ohne etwas zu betreiben, und im Gegenzug fällt die Entscheidung, was als KI-Crawler zählt, bei einem Dritten, vor eurer Website, für jeden Besucher.

Anubis: den Client zahlen lassen

Anubis ist ein Reverse Proxy, der eine Proof-of-Work-Aufgabe vor den Origin setzt. Keine Identitätsbehauptung ist beteiligt: ein Client, der das Challenge-JavaScript nicht ausführen kann, bekommt die Seite nicht, egal was sein User-Agent sagt.

Wir haben v1.28.2 vor einem nginx-Origin auf einem Laptop betrieben und abgetastet. Mit der mitgelieferten Standardpolicy:

ClientAntwort
curl/8.18.0200, direkt zum Origin durch, 53 Bytes
GPTBot-User-AgentAblehnungsseite, 2.270 Bytes, mit HTTP 200 ausgeliefert
ClaudeBot-User-AgentAblehnungsseite, mit HTTP 200 ausgeliefert
Googlebot-User-AgentChallenge-Seite, ~7,1 KB
Desktop-Chrome-User-AgentChallenge-Seite, ~7,1 KB

Drei Dinge daraus sollte man vor dem Ausrollen wissen.

Die Ablehnungsseite kommt mit HTTP 200 zurück, nicht 403. Wer die Website über Statuscodes überwacht, sieht einen vollständig blockierten Crawler als gesunden.

Ein einfacher, ehrlicher Nicht-Browser-Client geht unbehindert durch. Das ist Absicht - so funktionieren curl, Feedreader und das eigene Monitoring weiter - bedeutet aber auch, dass Anubis keine Mauer gegen Scraping im Allgemeinen ist. Alles, was nicht vorgibt, ein Browser zu sein, wird standardmäßig durchgewinkt.

Und die Googlebot-Zeile ist ein Laborartefakt, das Erwähnung verdient: Anubis prüft Suchmaschinen per Reverse DNS, und das kann für eine Anfrage von 127.0.0.1 nicht aufgehen. In einem echten Deployment wäre diese Zeile ein Durchlass, keine Aufgabe. Wir zeigen sie, weil sie genau die Art Ergebnis ist, die wie ein Befund aussieht und keiner ist.

Was die Aufgabe den Menschen kostet

Diese Zahl entscheidet, ob Anubis auf eine Website mit echten Besuchern darf. Wir haben die Aufgabe mit einem Headless-Chromium gelöst und von der Navigation bis zum Rendern der Origin-Seite gemessen:

SchwierigkeitMedianLäufe
2 (Standard)0,08 s5
40,27 s5
650 bis 75 s2 von 3

Beim gelieferten Standard ist das Gate unsichtbar. Zwei Stufen höher ist es eine Minute drehende Seite, denn jede Stufe multipliziert die Arbeit mit sechzehn. Der dritte Lauf bei Schwierigkeit 6 wurde innerhalb unseres 90-s-Timeouts überhaupt nicht fertig, und das ist die ehrliche Form des Ausläufers: bei dieser Einstellung sind die Kosten nicht nur hoch, sie streuen weit genug, dass ein Teil der Besucher einfach aufgibt. Wer an diesem Regler dreht, weil der Standard “niedrig wirkt”, merkt es selbst nicht - der eigene Browser hält das Freigabe-Cookie eine Woche - während jeder Erstbesucher zahlt.

Zwei Deployment-Fallen, beide teurer als die Messung selbst.

Die Umgebungsvariable DIFFICULTY änderte die Aufgabe nicht. In v1.28.2 meldet das Start-Log sie, die ausgelieferte Aufgabe ignoriert sie, und es gilt die Zahl aus der Policy-Datei. Wir haben es nur bemerkt, weil wir die Schwierigkeit aus dem eingebetteten JSON der Challenge-Seite gelesen haben.

Ohne USE_REMOTE_ADDRESS=true gab jede einzelne Anfrage HTTP 500 zurück, mit [misconfiguration] X-Real-IP header is not set im Log. Anubis setzt voraus, dass etwas davor diesen Header setzt. Setzt niemand ihn, schließt es für den gesamten Verkehr, nicht nur für Bots.

Kann man überhaupt sagen, wer wer ist

Alle drei Ansätze beruhen am Ende auf Identifikation, also haben wir geprüft, wie gut die heute funktioniert. Jede Crawler-Anfrage aus unserem Log, gegen die eigene Liste des Anbieters oder Reverse DNS:

CrawlerAnfragenVerifiziertGegen
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 / 541Reverse DNS
GoogleOther520520 / 520Reverse DNS
bingbot164164 / 164Reverse DNS
Amazonbot9696 / 96Reverse DNS
YandexBot4949 / 49Reverse DNS
Applebot3030 / 30Reverse DNS
meta-externalagent322322 / 322angekündigte AS32934-Präfixe

Besser, als die Folklore vermuten lässt. Die großen KI-Crawler veröffentlichen inzwischen IP-Listen, die man abrufen und prüfen kann, und unsere stimmten anfragegenau.

Zwei Ausnahmen. ChatGPT-User schickte zwei Anfragen von Adressen außerhalb der veröffentlichten Liste - der einzige menschlich ausgelöste Agent in der Tabelle, und der, bei dem eine Abweichung am wenigsten alarmierend ist. Und meta-externalagent hat kein Reverse DNS und keine auffindbare veröffentlichte Crawler-Liste, womit die einzige verfügbare Prüfung ist, ob die Adresse in Metas angekündigten Netzpräfixen liegt. Das ist eine deutlich schwächere Aussage: sie sagt, dass das Paket aus dem Netz dieses Unternehmens kam, nicht dass der Crawler der ist, für den er sich ausgibt.

Takt, wenn Identität nicht verfügbar ist

Für alles, was sich weder verifizieren noch identifizieren lässt, verrät das Verhalten es trotzdem. Der Abstand zwischen aufeinanderfolgenden Anfragen desselben Crawlers über fünfzehn Tage:

CrawlerMedian-AbstandAnteil Abstände unter 1 s
GPTBot1 s92,1%
meta-externalagent1 s88,2%
YandexBot1 s75,0%
ClaudeBot1 s52,0%
AhrefsBot29 s31,8%
Googlebot158 s8,0%
GoogleOther137 s0,8%

Ein klarer Schnitt, und es geht nicht um Höflichkeit. Google holte mehr Seiten als alle anderen (541 und 520 URLs) und tat das mit einem Medianabstand von über zwei Minuten, weil Crawl-Pacing ein gelöstes Problem ist, an dem es Jahrzehnte hatte. Die Trainings-Crawler nahmen die Website in einem Durchgang, so schnell wie sie ausliefert.

Der praktische Nutzen: auf einer ruhigen Website trennt ein Histogramm der Ankunftsabstände einen Crawl von einem Publikum, ohne einen einzigen User-Agent zu lesen. Ein Peak, der sich in einem Subsekunden-Bucket sammelt, ist eine Maschine. Menschen erzeugen durchaus dichte Bursts - Tab-Wiederherstellung, Prefetch - halten sie aber nicht über 390 Anfragen.

Was also wählen

Wenn ihr wolltNehmtPreis
Eine Präferenz erklären und das Artefakt vorweisen könnenrobots.txt mit ausdrücklichen KI-DirektivenNichts
Anfragen stoppen, bevor der Server sie sieht, ohne etwas zu betreibenCloudflare AI Crawl ControlEuer DNS läuft über die, und deren Liste definiert, wer Bot ist
Inhalte für alles unverfügbar machen, was keinen Browser ausführen kannAnubis vor dem OriginEin Gate, durch das jeder Erstbesucher mitgeht
Wissen, was wirklich passiertDas eigene Access-Log, ausgewertetEin Nachmittag, einmalig

Sie stapeln sich, und das ist die vernünftige Konfiguration: robots.txt sagt, was ihr wollt, eines der anderen zwei setzt den Teil durch, der euch die Durchsetzung wert ist, und das Log sagt, ob irgendetwas davon gewirkt hat.

Was auf dieser Website läuft: robots.txt, und sonst nichts. Wir veröffentlichen Artikel, damit sie gelesen werden, auch von dem, was sie später zusammenfasst. Den Anubis-Stack haben wir überhaupt nur gebaut, um eine Zahl für die Alternative nennen zu können, und die Zahl sagt: das Werkzeug ist in Ordnung, der Schwierigkeitsregler ist die Gefahr.

Was das nicht sagen kann

Eine Website, eine Nische, ein Fenster von fünfzehn Tagen, 9.996 Anfragen. Eine Website mit echtem kommerziellen Inhalt zieht eine andere Klasse von Scrapern an, die Sorte, die sich nicht ankündigt und in keiner dieser Tabellen auftaucht, und gegen diese Population ist jede Zahl von oben irrelevant.

Die Anubis-Messungen kommen von einem Laptop gegen localhost: keine Netzlatenz, ein Client, und eine CPU, die schneller ist als das Median-Telefon. Nehmt die Schwierigkeitskurve als Form der Kosten, nicht als deren absoluten Wert.

Und das Loch, das sich mit Logs gar nicht schließen lässt: robots.txt abzurufen ist nicht, es zu befolgen, und es nicht abzurufen ist nicht, es zu ignorieren. Alles in der ersten Tabelle ist eine Messung von Anfragen, nicht von Einverständnis.