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:
| Crawler | Anfragen | robots.txt-Abrufe | Eindeutige URLs |
|---|---|---|---|
| ClaudeBot | 484 | 78 | 330 |
| Googlebot | 541 | 17 | 333 |
| GoogleOther | 520 | 0 | 327 |
| GPTBot | 391 | 0 | 387 |
| meta-externalagent | 322 | 0 | 315 |
| AhrefsBot | 202 | 21 | 129 |
| bingbot | 164 | 18 | 67 |
| OAI-SearchBot | 108 | 35 | 61 |
| Amazonbot | 96 | 3 | 94 |
| PerplexityBot | 63 | 9 | 21 |
| YandexBot | 49 | 3 | 38 |
| Applebot | 30 | 5 | 22 |
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:
| Client | Antwort |
|---|---|
curl/8.18.0 | 200, direkt zum Origin durch, 53 Bytes |
| GPTBot-User-Agent | Ablehnungsseite, 2.270 Bytes, mit HTTP 200 ausgeliefert |
| ClaudeBot-User-Agent | Ablehnungsseite, mit HTTP 200 ausgeliefert |
| Googlebot-User-Agent | Challenge-Seite, ~7,1 KB |
| Desktop-Chrome-User-Agent | Challenge-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:
| Schwierigkeit | Median | Läufe |
|---|---|---|
| 2 (Standard) | 0,08 s | 5 |
| 4 | 0,27 s | 5 |
| 6 | 50 bis 75 s | 2 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:
| Crawler | Anfragen | Verifiziert | Gegen |
|---|---|---|---|
| ClaudeBot | 484 | 484 / 484 | claude.com/crawling/bots.json |
| GPTBot | 391 | 391 / 391 | openai.com/gptbot.json |
| OAI-SearchBot | 108 | 108 / 108 | openai.com/searchbot.json |
| PerplexityBot | 63 | 63 / 63 | perplexity.ai/perplexitybot.json |
| ChatGPT-User | 39 | 37 / 39 | openai.com/chatgpt-user.json |
| Googlebot | 541 | 541 / 541 | Reverse DNS |
| GoogleOther | 520 | 520 / 520 | Reverse DNS |
| bingbot | 164 | 164 / 164 | Reverse DNS |
| Amazonbot | 96 | 96 / 96 | Reverse DNS |
| YandexBot | 49 | 49 / 49 | Reverse DNS |
| Applebot | 30 | 30 / 30 | Reverse DNS |
| meta-externalagent | 322 | 322 / 322 | angekü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:
| Crawler | Median-Abstand | Anteil Abstände unter 1 s |
|---|---|---|
| GPTBot | 1 s | 92,1% |
| meta-externalagent | 1 s | 88,2% |
| YandexBot | 1 s | 75,0% |
| ClaudeBot | 1 s | 52,0% |
| AhrefsBot | 29 s | 31,8% |
| Googlebot | 158 s | 8,0% |
| GoogleOther | 137 s | 0,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 wollt | Nehmt | Preis |
|---|---|---|
| Eine Präferenz erklären und das Artefakt vorweisen können | robots.txt mit ausdrücklichen KI-Direktiven | Nichts |
| Anfragen stoppen, bevor der Server sie sieht, ohne etwas zu betreiben | Cloudflare AI Crawl Control | Euer DNS läuft über die, und deren Liste definiert, wer Bot ist |
| Inhalte für alles unverfügbar machen, was keinen Browser ausführen kann | Anubis vor dem Origin | Ein Gate, durch das jeder Erstbesucher mitgeht |
| Wissen, was wirklich passiert | Das eigene Access-Log, ausgewertet | Ein 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.