Kurz gesagt
ChatGPT liest beim Abruf einer Seite nach den bisher veröffentlichten Messungen nur das HTML, das Ihr Server ausliefert. Was erst JavaScript im Browser erzeugt, fehlt dort. Ob das Ihre Website betrifft, zeigen drei Prüfungen: Steht Ihr Kernsatz im Roh-HTML, welcher Text steht nur im gerenderten DOM, und lassen robots.txt und Firewall den Crawler durch?
Das Wichtigste in Kürze
- Eine Protokollauswertung vom September 2026 fand bei 37.045 Seitenabrufen von ChatGPT-User kein einziges Skript (eine einzige Nachrichtenseite).
- OpenAI und Perplexity sagen in ihren Crawler-Dokumentationen nichts zu JavaScript. Zu OAI-SearchBot und GPTBot gibt es seit September 2026 Gegenberichte.
- Zählen Sie einen Kernsatz im Roh-HTML: Eine 0 heißt, dass er dort fehlt oder der Abruf gescheitert ist. Unter Windows stolpert Select-String über Umlaute.
- Rendering, robots.txt und Firewall sehen von außen gleich aus. Ein Abruf mit Crawler-Kennung und die robots.txt trennen sie; IP-Sperren zeigt nur das Protokoll.
- Auf 16 Seiten von datafalke.de stand am 09.11.2026 der ganze Text im Roh-HTML, und die Kennung von GPTBot bekam dieselbe Antwort wie ein Browser.
Welche KI-Systeme führen JavaScript aus?
Googlebot und Applebot stellen Seiten mit JavaScript dar. Die Crawler von OpenAI, Anthropic und Perplexity führten es in den Messungen bis September 2026 fast nie aus; ChatGPT-User holte in einer Auswertung von 37.045 Seitenabrufen kein einziges Skript. OpenAI und Perplexity äußern sich in ihren Crawler-Dokumentationen nicht dazu.
Ein Crawler ist ein Programm, das Seiten automatisch abruft. Rendern heißt hier: Er führt die Skripte einer Seite aus und liest das Ergebnis. Die Belege dazu sind dünn und verschieden belastbar. Die Tabelle nennt deshalb je System die Art der Quelle und ihr Datum. Die Zahlen in der Spalte „Quelle“ sind die Nummern der Quellenliste am Ende des Beitrags.
| System | JavaScript | Beleg: Art und Datum | Quelle |
|---|---|---|---|
| ChatGPT-User (Abruf bei einer Frage) | nein | Messung, 17.12.2024; Protokolle einer Nachrichtenseite bis 24.09.2026: 37.045 Seitenabrufe, 0 Skripte | 1, 2 |
| OAI-SearchBot, GPTBot | meist nein | Messung, 17.12.2024; Protokolle bis 24.09.2026: OAI-SearchBot lud 1 von 1.738 Seiten wie ein Browser; Bericht eines Website-Betreibers vom 30.09.2026: beide rendern seine Seiten seit dem 25.09.2026, IP-Adressen geprüft | 1, 2 |
| ClaudeBot | nein | Messung, 17.12.2024; Protokolle bis 24.09.2026: 915 Seitenabrufe, 0 Skripte | 1, 2 |
| Claude-User (Abruf bei einer Frage) | ungeklärt | Protokolle bis 24.09.2026: 10.028 Seitenabrufe, 0 Skripte; Entwicklerdokumentation von Anthropic zum Werkzeug web fetch: keine per JavaScript dargestellten Seiten; Übersicht, Stand 03.11.2026: nicht gemessen; Crawler-Dokumentation: keine Angabe | 2, 3, 4, 5 |
| PerplexityBot | meist nein | Messung, 17.12.2024; Protokolle bis 24.09.2026: 3.193 Seitenabrufe, 0 Skripte; Test vom Oktober 2025: ein per JavaScript eingefügter Preis stand in einer Antwort | 1, 2, 3 |
| Googlebot, Übersicht mit KI (AI Overviews), KI-Modus (AI Mode) | ja | Dokumentation von Google, 04.03.2026: Chromium rendert die Seite, teils mit Verzögerung; die KI-Funktionen setzen eine indexierte Seite voraus (10.12.2025) | 6, 7 |
| Gemini beim Abruf einer Adresse | ungeklärt | Messung, 17.12.2024: Gemini nutzt die Infrastruktur von Googlebot; Test vom 25.09.2026 an einer Seite: nur der Text aus dem HTML | 1, 2 |
| Applebot | ja, im Browser | Dokumentation von Apple, 04.09.2026; Protokolle bis 24.09.2026: 4.838 Seitenabrufe, 3.133 Skripte | 2, 8 |
| Bingbot | kann es, selten beobachtet | Ankündigung von Bing, 09.10.2019: Rendering mit Edge; Protokolle bis 24.09.2026: Skripte bei etwa einer von 800 Seiten | 2, 9 |
Die Protokolle (Server-Logs) stammen von einer einzigen Nachrichtenseite. Gezählt wurde dort die Kennung, also der Name, mit dem sich ein Programm beim Server vorstellt, und die Auswertung kommt von einem Anbieter solcher Werkzeuge (Forge AI Bot Log, 24.09.2026). Die Messung von 2024 hat die Cloud-Plattform Vercel mit MERJ veröffentlicht, Microsoft Copilot fehlte darin, weil es keine eigene Kennung nutzt (Vercel und MERJ). Die Übersicht stammt von searchVIU, einem Anbieter von SEO-Werkzeugen (searchVIU, 03.11.2026). Eine neuere Messung in vergleichbarer Größe haben wir nicht gefunden. In den Crawler-Dokumentationen von OpenAI und Perplexity kommt JavaScript nicht vor. Eine Aussage von OpenAI zu den Berichten seit September 2026 haben wir nicht gefunden.
Warum das zählt: Was erst im Browser entsteht, fehlt für Systeme ohne JavaScript. Auf der Nachrichtenseite rief ChatGPT-User eine Seite mit Spritpreisen in 30 Tagen 157-mal ab, Claude-User 80-mal. Beide sahen keinen Preis, weil Skripte die Preise einfügten. Googlebot stellt Seiten mit JavaScript dar, deshalb fällt die Lücke in der Google-Suche oft nicht auf. Wie Google damit umgeht, erklärt unser Leitfaden technisches SEO im Abschnitt Sieht Google Inhalte, die erst JavaScript erzeugt?
Agenten, die einen echten Browser steuern, führen Skripte aus. Im Protokoll sehen sie oft aus wie normale Besucher mit Chrome (Forge AI Bot Log). Für solche Agenten gilt diese Anleitung nicht.
Erledigt, wenn Sie wissen, welche dieser Systeme für Ihre Kunden zählen.
Steht Ihr Kernsatz im Roh-HTML?
Zählen Sie einen Kernsatz Ihrer Seite im Roh-HTML, also in dem Text, den der Server ausliefert, bevor JavaScript läuft. Unter macOS und Linux geht das mit curl und grep, unter Windows mit curl.exe und Select-String. Eine 1 oder höher heißt: Der Satz steht im HTML. Eine 0 heißt: Er steht dort nicht, oder der Abruf ist gescheitert.
Warum: Ein Crawler ohne JavaScript bekommt genau dieses Roh-HTML. Ihr Browser zeigt die fertige Seite, nachdem alle Skripte gelaufen sind. Deshalb sehen Sie eine Lücke beim Surfen nicht. Die Prüfung hat drei Schritte: zuerst dieser Abruf, dann der Vergleich mit dem Browser, zuletzt die Frage nach der Ursache.
So gehen Sie vor:
- Kopieren Sie aus dem Browser einen Satz, den Ihre Kunden lesen sollen, etwa Ihre Leistung mit dem Ort. Nehmen Sie möglichst einen Teil ohne Umlaute.
- Setzen Sie Adresse und Satz in den Befehl für Ihr System ein.
- Lesen Sie die Ausgabe:
1oder mehr heißt, der Satz steht im Roh-HTML.grepzählt Zeilen, nicht Treffer. Bei0prüfen Sie zuerst, ob der Abruf geklappt hat (dritter Schritt der Prüfung).
curl -sL https://www.example.de/leistung/ | grep -c "Ihr Kernsatz"(curl.exe -sL https://www.example.de/leistung/ | Select-String -SimpleMatch "Ihr Kernsatz").Count
(Invoke-WebRequest -UseBasicParsing -Uri https://www.example.de/leistung/).Content.Contains("Ihr Kernsatz")Die erste Zeile in PowerShell gibt eine Zahl aus, die zweite True oder False. Windows 10 und 11 bringen curl mit (curl-Projekt). Schreiben Sie dort curl.exe, denn curl allein steht in PowerShell 5.1 für Invoke-WebRequest (Microsoft zu Invoke-WebRequest). Dessen Schalter -UseBasicParsing ist seit einem Sicherheitsupdate vom 09.12.2025 nötig, sonst fragt PowerShell bei jedem Abruf nach, ob Skriptcode der Seite laufen darf.
Typische Fehler:
- Umlaute unter Windows. Mit
curl.exeundSelect-Stringfand die Suche in unserem Test am 09.11.2026 nichts, sobald der Satz einen Umlaut enthielt: Die Konsole liest die Antwort mit einem älteren Zeichensatz. Die Zeile mitInvoke-WebRequestfand den Text. Wollen Sie beicurl.exebleiben, setzen Sie vorher[Console]::OutputEncoding = [Text.Encoding]::UTF8. - Zeilenumbruch im Quelltext. Steht der Satz im HTML auf zwei Zeilen verteilt, findet
grepihn nicht. Nehmen Sie drei oder vier Wörter oder das Skript im nächsten Abschnitt. - Text nur in Daten. Steht der Satz nur in einem Datenblock, etwa in JSON für die Anwendung, zählt
grepihn mit, obwohl er ohne JavaScript nicht auf der Seite steht. Vercel und MERJ halten für möglich, dass KI-Modelle solche Daten trotzdem verwerten. Verlassen Sie sich nicht darauf.
Beispiel: An einer eigenen Probeseite mit vollständig clientseitigem Aufbau ergab grep -c eine 0, an der statischen Fassung derselben Seite eine 1.
Erledigt, wenn Sie für jede wichtige Seite wissen, ob ihr Kernsatz im Roh-HTML steht.
Welcher Text steht nur im gerenderten DOM?
Text, der nur im gerenderten DOM steht, erzeugt erst JavaScript im Browser. Das DOM ist der Aufbau der Seite, nachdem alle Skripte gelaufen sind. Vergleichen Sie es mit dem Roh-HTML: Die Differenz zeigt die Textblöcke, die ein Crawler ohne JavaScript nicht bekommt. Chrome und Edge geben das DOM mit dem Schalter --dump-dom aus.
Unser Skript vergleicht beide Fassungen für die ganze Seite und listet jeden Textblock, der nur im DOM steht. Der Schalter --dump-dom gibt die Seite aus, nachdem Chrome die Skripte ausgeführt hat (Chrome-Dokumentation). Mit --virtual-time-budget bekommen nachgeladene Inhalte acht Sekunden virtuelle Zeit.
So gehen Sie vor: Speichern Sie das Skript als roh-gegen-dom.py. Sie brauchen Python 3 und Chrome oder Edge. Rufen Sie es unter Windows mit python, unter macOS und Linux mit python3 auf, gefolgt von Adresse und Kernsatz. Unsere Codebeispiele stehen unter der Lizenz MIT-0.
#!/usr/bin/env python3
"""Vergleicht den Text im ausgelieferten HTML mit dem Text nach dem Ausführen von JavaScript.
Aufruf: python3 roh-gegen-dom.py https://www.example.de/seite/ "ein Satz aus Ihrer Seite"
Braucht Python 3 und Chrome oder Edge. Lizenz: MIT-0 (datafalke.de).
"""
import html.parser
import shutil
import subprocess
import sys
import tempfile
import urllib.error
import urllib.request
BROWSER = [
r"C:\Program Files\Google\Chrome\Application\chrome.exe",
r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
"google-chrome", "chromium", "chromium-browser",
]
KENNUNG = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
OHNE_TEXT = {"title", "script", "style", "template"}
BLOCK = {"p", "li", "h1", "h2", "h3", "h4", "h5", "h6", "td", "th", "div", "section", "main",
"article", "header", "footer", "nav", "aside", "form", "tr", "pre", "blockquote", "figcaption"}
class Text(html.parser.HTMLParser):
def __init__(self):
super().__init__()
self.aussen, self.bloecke, self.skripte, self.datenbloecke = 0, [[]], 0, 0
def handle_starttag(self, tag, attrs):
if tag == "script":
typ = dict(attrs).get("type") or ""
if typ in ("", "text/javascript", "application/javascript", "module"):
self.skripte += 1
else:
self.datenbloecke += 1
if tag in OHNE_TEXT:
self.aussen += 1
if tag in BLOCK:
self.bloecke.append([])
def handle_endtag(self, tag):
if tag in OHNE_TEXT and self.aussen:
self.aussen -= 1
def handle_data(self, daten):
if not self.aussen:
self.bloecke[-1].append(daten)
def normal(text):
return " ".join(text.replace("\u00ad", "").split())
def lies(quelltext):
text = Text()
text.feed(quelltext)
bloecke = [normal("".join(block)) for block in text.bloecke]
return [block for block in bloecke if block], text.skripte, text.datenbloecke
def roh(url):
anfrage = urllib.request.Request(url, headers={"User-Agent": KENNUNG})
try:
antwort = urllib.request.urlopen(anfrage, timeout=30)
except urllib.error.HTTPError as fehler:
antwort = fehler
zeichensatz = antwort.headers.get_content_charset() or "utf-8"
return antwort.getcode(), antwort.read().decode(zeichensatz, "replace")
def dom(url):
browser = next(filter(None, map(shutil.which, BROWSER)), None)
if browser is None:
sys.exit("Kein Chrome oder Edge gefunden: Pfad in BROWSER eintragen.")
profil = tempfile.mkdtemp()
try:
ergebnis = subprocess.run(
[browser, "--headless", f"--user-data-dir={profil}", "--virtual-time-budget=8000", "--dump-dom", url],
capture_output=True, timeout=120)
finally:
shutil.rmtree(profil, ignore_errors=True)
return ergebnis.stdout.decode("utf-8", "replace")
def main():
url = sys.argv[1]
satz = normal(sys.argv[2]) if len(sys.argv) > 2 else None
status, quelltext = roh(url)
roh_bloecke, skripte, datenbloecke = lies(quelltext)
dom_bloecke, _, _ = lies(dom(url))
roh_text, dom_text = " ".join(roh_bloecke), " ".join(dom_bloecke)
nur_im_dom = [block for block in dom_bloecke if block not in roh_text]
print("Status: ", status)
print("Skripte: ", skripte, "ausführbar,", datenbloecke, "Datenblock (etwa JSON-LD)")
print("Wörter: ", len(roh_text.split()), "im Roh-HTML,", len(dom_text.split()), "im DOM")
if satz:
print("Kernsatz: ", "Roh-HTML", "ja" if satz in roh_text else "nein",
"| DOM", "ja" if satz in dom_text else "nein")
print("Nur im DOM:", len(nur_im_dom), "Textblock" if len(nur_im_dom) == 1 else "Textblöcke")
for block in nur_im_dom[:5]:
print(" -", block[:90])
if __name__ == "__main__":
main()Was Sie erwarten dürfen: Die Tabelle zeigt die Ausgaben an fünf eigenen Probeseiten auf unserem Testrechner. Statisch heißt: fertige Dateien, serverseitig (SSR): der Server baut das HTML bei jedem Abruf, clientseitig (CSR): JavaScript baut die Seite im Browser (web.dev zu den Rendering-Arten). Auf echten Websites sind die Zahlen größer, das Muster bleibt.
| Seitenart | grep -c | Satz roh, DOM | Wörter roh, DOM | Nur DOM |
|---|---|---|---|---|
| statisch: fertiges HTML | 1 | ja, ja | 19, 19 | 0 |
| serverseitig (SSR) | 1 | ja, ja | 23, 23 | 0, bei wechselnden Angaben auch mehr |
| gemischt: Text vom Server, ein Absatz per Skript | 1 | ja, ja | 19, 27 | 1 |
| clientseitig (CSR): leeres Grundgerüst | 0 | nein, ja | 4, 23 | 3 |
| nur Daten: Satz in einem JSON-Block, Anzeige per Skript | 1 | nein, ja | 0, 5 | 1 |
Messung vom · curl 8.21.0, GNU grep 3.0, Python 3.12, Chrome 156, Abrufe von fünf eigenen Probeseiten mit Python und curl, Ausgabe des Vergleichsskripts
So lesen Sie die Zeilen:
- Statisch: Der Text ist für jeden Crawler lesbar.
- Serverseitig: Der Text ist für jeden Crawler lesbar, Skripte machen die Seite nur bedienbar.
- Gemischt: Der nachgeladene Absatz fehlt ohne JavaScript.
- Clientseitig: Der Text fehlt ohne JavaScript; die 4 Wörter sind ein Hinweis im
noscript-Element. - Nur Daten:
grepzählt den Satz, auf der Seite steht er erst nach dem Skript.
Statisch und serverseitig sehen für einen Crawler gleich aus: Beide bestehen die Prüfung. Baut der Server die Seite bei jedem Abruf neu, kann ein Block mit wechselnden Angaben wie einer Uhrzeit als „nur im DOM“ erscheinen, weil das Skript die Seite zweimal abruft. Das ist kein Fehler im Rendering. So sah die Ausgabe für die gemischte Probeseite aus:
Status: 200
Skripte: 1 ausführbar, 0 Datenblock (etwa JSON-LD)
Wörter: 19 im Roh-HTML, 27 im DOM
Kernsatz: Roh-HTML ja | DOM ja
Nur im DOM: 1 Textblock
- Wartungsverträge gibt es für Anlagen bis 100 kWp.Ohne Python zählen Sie den Kernsatz im DOM direkt. Geben Sie einen eigenen Profilordner an, damit ein geöffnetes Chrome nicht stört:
google-chrome --headless --user-data-dir=/tmp/df-probe --dump-dom https://www.example.de/leistung/ | grep -c "Ihr Kernsatz"
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --user-data-dir=/tmp/df-probe --dump-dom https://www.example.de/leistung/ | grep -c "Ihr Kernsatz"$chrome = "C:\Program Files\Google\Chrome\Application\chrome.exe"
Start-Process $chrome -ArgumentList "--headless", "--user-data-dir=$env:TEMP\df-probe", "--dump-dom", "https://www.example.de/leistung/" -NoNewWindow -Wait -RedirectStandardOutput dom.html
(Select-String -Path dom.html -SimpleMatch "Ihr Kernsatz" -Encoding utf8).CountUnter Windows schreiben Sie das DOM zuerst in eine Datei, denn in unserem Test am 09.11.2026 blieb die direkte Weitergabe mit | leer.
Typischer Fehler: Im Reiter „Elements“ der Entwicklertools steht das DOM, also die Seite nach den Skripten. Den Quelltext, den der Server geschickt hat, zeigt die Ansicht „Seitenquelltext“ (Strg+U, am Mac Befehl+Wahl+U). Diese Kurzprobe ohne Terminal beschreibt unser Ratgeber zur Sichtbarkeit in ChatGPT.
Erledigt, wenn die Zeile „Nur im DOM“ für Ihre wichtigsten Seiten 0 zeigt oder nur Texte nennt, die Ihren Kunden nichts sagen.
Liegt es am Rendering, an der robots.txt oder an der Firewall?
Ob Rendering, robots.txt oder Firewall dahintersteckt, trennen zwei Abrufe mit verschiedener Kennung und ein Blick in die robots.txt. Eine Firewall verrät sich durch einen anderen Status oder weniger Inhalt beim Abruf mit Crawler-Kennung. Eine Sperre in der robots.txt sehen Sie nur in der Datei selbst, denn curl beachtet sie nicht. Sperren nach IP-Adresse zeigen nur die Protokolle Ihres Servers oder CDN.
Rufen Sie die Seite einmal normal und einmal mit der Kennung eines Crawlers ab, und lesen Sie dann die robots.txt:
curl -s -o /dev/null -w "%{http_code} %{size_download}\n" https://www.example.de/leistung/
curl -s -o /dev/null -w "%{http_code} %{size_download}\n" -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" https://www.example.de/leistung/
curl -s https://www.example.de/robots.txt | grep -i -A1 "gptbot"curl.exe -s -o NUL -w "%{http_code} %{size_download}\n" https://www.example.de/leistung/
curl.exe -s -o NUL -w "%{http_code} %{size_download}\n" -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" https://www.example.de/leistung/
curl.exe -s https://www.example.de/robots.txt | Select-String -Pattern "gptbot" -Context 0,1Jede der beiden Abrufzeilen gibt Status und Größe der Antwort in Byte aus. Die Kennung im Beispiel nennt OpenAI für seinen Crawler GPTBot (Crawler-Dokumentation von OpenAI). Die Schalter -A und -w beschreibt das curl-Handbuch. Antwortet schon der erste Abruf mit 403, blockiert Ihr CDN vermutlich curl allgemein. Tragen Sie dann mit -A die Kennung eines Browsers ein.
| Ursache | Kernsatz beim normalen Abruf | Abruf mit Crawler-Kennung | Eintrag in der robots.txt |
|---|---|---|---|
| Text entsteht erst per JavaScript | 0 | gleicher Status, gleiche Größe wie der normale Abruf | keiner |
| Sperre in der robots.txt | 1 oder mehr | gleicher Status, gleiche Größe | Disallow unter der Crawler-Kennung oder unter User-agent: * |
| Firewall oder CDN sperrt nach Kennung | 1 oder mehr | 403 oder eine viel kleinere Prüfseite mit Status 200; Kernsatz 0 | keiner |
| Sperre nach IP-Adresse | 1 oder mehr | gleicher Status, gleiche Größe; die Sperre bleibt bei diesem Abruf unsichtbar | keiner |
Auf unserer Probeseite mit Sperre nach Kennung lieferte der normale Abruf 200 318, der Abruf mit der Kennung von GPTBot 403 97. Die Probeseite mit einer Sperre in der robots.txt antwortete auf beide Abrufe mit 200 318. Der Abruf mit Kennung zeigt die Sperre also nicht, die Datei schon.
Warum das zählt: Von außen sieht jede dieser Ursachen gleich aus, denn KI-Dienste haben Ihren Text nicht. Behoben werden sie an verschiedenen Stellen: im Code der Website, in der robots.txt oder in den Einstellungen von Firewall und CDN (dem Netz, das Ihre Seiten ausliefert). Welche Kennungen es gibt und was Sie erlauben sollten, steht in unserem Beitrag KI-Crawler und robots.txt. Wie Sie Firewall und CDN prüfen, beschreibt dort der Abschnitt zu Firewall und CDN.
Typischer Fehler: Aus Status 200 mit der Kennung von GPTBot wird geschlossen, dass GPTBot die Seite lesen darf. Die robots.txt prüft curl nicht.
Erledigt, wenn für jede Seite ohne Kernsatz feststeht, welche Ursache vorliegt.
Was tun Sie, wenn wichtiger Text nur im DOM steht?
Bringen Sie den Text in das HTML, das der Server ausliefert: als statische Seite, serverseitig gerendert oder beim Bau vorab erzeugt. Google empfiehlt diese Wege und bezeichnet Ersatzseiten nur für Crawler als Notbehelf. Microsoft rät davon ab, wichtige Inhalte hinter clientseitigem Rendering zu verbergen. Interaktive Elemente dürfen bleiben, solange der Text auch ohne sie im HTML steht.
- Rendering ändern. Bei Anwendungen, die im Browser entstehen, helfen serverseitiges Rendering oder das Vorab-Erzeugen der Seiten beim Bau. Google hält das für sinnvoll, weil es Websites schneller macht und nicht alle Bots JavaScript ausführen (Google, JavaScript-Grundlagen). Welche Bauweise zu Ihrer Website passt, vergleicht unser Beitrag Statische Website oder WordPress.
- Nachgeladene Teile ins HTML holen. Preise, Leistungen, Öffnungszeiten und Antworten auf häufige Fragen gehören in das erste HTML. Muss ein Widget bleiben, nennen Sie das Wichtigste daneben als Text. Microsoft schreibt, dass Inhalte, die sich nicht zuverlässig darstellen lassen, womöglich weder indexiert noch als Quelle für Antworten genutzt werden (Bing-Richtlinien).
- Keine Ersatzseiten nur für Crawler. Eine eigene Fassung für erkannte Bots nennt Google Dynamic Rendering. Google bezeichnet das als Notbehelf, der zusätzliche Komplexität schafft, und empfiehlt die Wege aus Nummer 1 (Google, Dynamic Rendering).
- Erneut prüfen. Wiederholen Sie die drei Schritte der Prüfung für jede geänderte Seite.
Bei den Websites, die wir bauen, steht der Text deshalb von Anfang an im HTML.
Typischer Fehler: Die Startseite wird umgestellt, während Preise und Leistungen auf Unterseiten weiter per Skript laden.
Erledigt, wenn die Zeile „Nur im DOM“ auf den geänderten Seiten keine wichtigen Inhalte mehr nennt.
Was zeigt diese Prüfung nicht?
Diese Prüfung zeigt, was ein Abruf ohne JavaScript von Ihrem Rechner aus bekommt. Sie zeigt nicht, ob ein KI-Dienst Ihre Seite tatsächlich abruft und ob er Sie nennt. Den echten Zugang der Crawler sehen Sie nur in den Protokollen Ihres Servers oder CDN, Nennungen messen Sie mit festen Fragen an KI-Assistenten.
- Sperren nach IP-Adresse oder Land. Ihr Abruf mit Crawler-Kennung kommt aus Ihrem eigenen Netz. Echte Crawler erkennen Sie an der IP-Adresse des Betreibers. Wie Sie Abrufe zählen, zeigt unser Ratgeber KI-Traffic messen.
- Der Zeitpunkt. Crawler können sich ändern, ohne dass es jemand ankündigt. Darauf deuten die Berichte vom September 2026 hin. Wiederholen Sie die Prüfung nach jedem Relaunch und jedes halbe Jahr.
- Die Wirkung. Steht Ihr Text im HTML, ist eine Hürde weg. Ob KI-Antworten Sie deshalb häufiger nennen, zeigt diese Prüfung nicht. Das messen Sie mit festen Fragen, wie es unser Ratgeber KI-Sichtbarkeit messen beschreibt.
Erledigt, wenn Ihr Prüfbericht nennt, was er nicht abdeckt.
Aus der Praxis: Was die Prüfung auf datafalke.de ergab
Am 09.11.2026 haben wir 16 Seiten von datafalke.de mit dem Vergleichsskript von oben und einem zusätzlichen Abruf mit der Kennung von GPTBot geprüft. Alle 16 Seiten antworteten mit Status 200. Keine enthielt ein ausführbares Skript, das einzige Script-Element je Seite trägt strukturierte Daten im Format JSON-LD. Im DOM standen gleich viele Wörter wie im Roh-HTML, und kein Textblock kam erst im Browser dazu. Das Ergebnis entspricht der Bauweise: datafalke.de ist eine statische Website (Technik im Kolophon).
| Kennzahl | Ergebnis |
|---|---|
| Status bei normalem Abruf und mit der Kennung von GPTBot | 200 auf allen 16 Seiten |
| ausführbare Skripte je Seite | 0 |
| Script-Elemente mit JSON-LD je Seite | 1 |
| Wörter im Roh-HTML | 2.064 bis 4.473, im DOM je gleich viele |
| Textblöcke, die nur im DOM stehen | 0 |
| Antwort mit der Kennung von GPTBot gegenüber normaler Antwort | Byte für Byte gleich, 77.984 bis 118.120 Byte je Seite |
Messung vom · Python 3.12 und Chrome 156, 16 Seiten, nur GET-Abrufe; Vergleich von Roh-HTML und DOM, Abruf mit der Kennung von GPTBot
Die Fehlbilder in den Tabellen oben stammen alle von einer eigenen Minimalseite auf unserem Testrechner. Fremde Websites haben wir nicht geprüft. Die Befehle für Windows liefen in PowerShell 5.1 unter Windows 11, die Terminal-Befehle in Git Bash mit curl und GNU grep. Unter macOS und Linux haben wir sie nicht selbst ausgeführt.
Zum Nachmachen an einer unserer Seiten:
curl -sL https://datafalke.de/wissen/in-chatgpt-gefunden-werden/ | grep -c "Genauso liefern wir"Damit ist nur belegt, dass unser Text ohne JavaScript lesbar ist und die Kennung von GPTBot nicht gesperrt ist. Ob KI-Antworten uns deshalb nennen, sagt das nicht. Wie wir das messen werden, beschreibt unsere Methode zur KI-Messung; ein Messprotokoll gibt es noch nicht.