Amit a crawler valójában lát: szervernaplók és a JavaScript nélküli nézet
Egy pontszám azt mondja meg, mit találna egy crawler egy weboldalon. Hogy egyáltalán jár-e ott valaki, és mit visz el valójában, azt két régi eszköz mutatja meg: a saját szervernaplók és egy JavaScript nélküli lekérés.
Egy pontszám állítás egy weboldalról. Azt mondja: ha egy crawler erre jár, tiszta HTML-t, megengedő robots.txt-t és érthető jelölést talál. Azt viszont nem tudja megmondani, hogy egyáltalán jár-e erre valaki, és hogy az a valaki mit visz el valójában. Erre két eszköz van, amelyek régebbiek bármilyen MI-vitánál, és mégis alig használja őket valaki: a saját szervernaplók, és az oldal olyan lekérése, amelynél nem fut JavaScript.
Ez a bejegyzés azt írja le, hogyan kombináljuk a kettőt. Útmutató, nem tanulmány. A parancsok egy hétköznapi Nginx-szerveren futnak, és semmi olyat nem igényelnek, ami ne lenne eleve telepítve.
Miért a JavaScript itt a döntő határ
A modern weboldalak gyakran csak egy üres burkot szolgálnak ki, és a tényleges tartalmat csak a böngészőben rakják össze JavaScripttel. Az embereknek ez nem jelent különbséget. A ChatGPT és a Claude mögötti crawlereknek viszont minden különbséget ez jelent.
A legmegbízhatóbb mérés erről a Verceltől és a MERJ-től származik, 2024 decemberéből. A Vercel hálózatán zajló crawlerforgalmat elemezték; egyetlen hónap alatt ez 569 millió GPTBot- és 370 millió ClaudeBot-lekérést jelentett. Az eredmény egyértelmű volt: egyik nagy MI-crawler sem futtatott JavaScriptet, sem az OpenAI három botja, sem a ClaudeBot. Figyelemre méltó a mögötte álló részlet. A GPTBot a lekérései mintegy 11,5 százalékában töltött le JavaScript-fájlokat, a ClaudeBot csaknem 24 százalékában, de egyikük sem futtatta őket. A kivétel a Gemini, amely a Google crawling-infrastruktúrájára épül, és ezért renderel.
A tanulmány csaknem kétéves, és a crawlerek változnak. Nem találtunk újabb mérést, amely ellentmondana neki, de éppen ezért érdemes nem mások számaira hagyatkozni, hanem a saját oldalt magunk ellenőrizni.
Első lépés: az oldal lekérése úgy, ahogy egy crawler látja
A legegyszerűbb teszt egy curl-lekérés. A curl nem futtat JavaScriptet, pontosan azt a HTML-t hozza le, amelyet a szerver kiszolgál. Hogy a szerver úgy viselkedjen, mint a valódi bottal szemben, megadjuk a GPTBot user agentjét:
curl -s -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.2; +https://openai.com/gptbot" \
https://example.com/az-oldalam > raw.html
Ezután egy olyan mondatot keresünk ebben a fájlban, amely az oldal fő tartalmában szerepel, lehetőleg a szöveg közepéről, nem a címből:
grep -c "egy mondat a cikk közepéről" raw.html
A nulla azt jelenti: ez a szöveg a GPTBot és a ClaudeBot számára nem létezik. Csak a böngészőben jön létre.
Durvább összehasonlításhoz ugyanazt az oldalt egyszer headless böngészővel is renderelhetjük, és összevethetjük a szöveg mennyiségét:
chromium --headless --dump-dom https://example.com/az-oldalam > rendered.html
sed 's/<[^>]*>//g' raw.html | wc -w
sed 's/<[^>]*>//g' rendered.html | wc -w
A számolás pontatlan, az inline szkripteket és stílusmegadásokat is beleszámolja. De ha az első szám 300, a második 3000, akkor már nincs szükség pontosságra.
Második lépés: a naplókban megnézni, ki jön valójában
A curl-teszt azt mutatja meg, mit látna egy crawler. A naplók azt, hogy ott járt-e, mely oldalakat kérte, és mit kapott. Először kiszűrjük azokat a sorokat, amelyek user agentje ismert MI-crawlerhez tartozik. A parancs a rotált és tömörített naplókat is beolvassa:
zcat -f /var/log/nginx/access.log* \
| grep -E 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|CCBot' \
> ai-bots.log
Egy név hiányzik erről a listáról: a Google-Extended. Ez nem önálló crawler, csak egy vezérlőszó a robots.txt számára. A Google továbbra is Googlebotként crawlol, ezért a Google-Extended soha nem jelenik meg a naplókban.
Hány lekérés jut egy-egy botra:
grep -oE 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|CCBot' ai-bots.log \
| sort | uniq -c | sort -rn
És mely útvonalakat kérték le, milyen státuszkóddal és válaszmérettel. A példa az Nginx alapértelmezett combined formátumát feltételezi:
awk -F'"' '{split($2,r," "); split($3,s," "); print s[1], s[2], r[2]}' ai-bots.log \
| sort | uniq -c | sort -rn | head -30
Az oszlopok: darabszám, státuszkód, kiszolgált bájtok és útvonal. Sok 404-es azt jelenti, hogy a crawlerek régi vagy hibás URL-eket kérnek le, gyakran egy elavult sitemapből. A sok .js-fájl-lekérés semmit nem mond arról, hogy a bot futtatja-e őket. Ezt a Vercel-tanulmány megmutatta.
Harmadik lépés: a valódi botok megkülönböztetése az álruhásoktól
A user agent önbevallás. Bárki nevezheti magát GPTBotnak, pontosan annyi ideig tart, amíg begépeljük a fenti curl-parancsot. Az első lépés saját tesztjei is ezekben a naplókban kötnek ki. Aki számokat akar közzétenni, ki kell szűrnie őket.
Az OpenAI JSON-fájlokban teszi közzé crawlerei IP-tartományait, a GPTBotét az openai.com/gptbot.json címen, a többi botét külön fájlokban. Egy rövid Python-szkript ellenőrzi, mely címek tartoznak valóban hozzájuk a naplóinkban:
curl -s https://openai.com/gptbot.json -o gptbot.json
grep 'GPTBot' ai-bots.log | awk '{print $1}' | sort -u > gptbot-ips.txt
import ipaddress, json
networks = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix"))
for p in json.load(open("gptbot.json"))["prefixes"]]
for line in open("gptbot-ips.txt"):
ip = ipaddress.ip_address(line.strip())
genuine = any(ip in n for n in networks)
print(ip, "valodi" if genuine else "NINCS a kozzetett tartomanyokban")
Nem minden szolgáltató könnyíti meg ennyire a dolgot. A közzétett tartományok nélküli crawlereknél marad a fordított DNS-feloldás, vagy ha az is hiányzik, csak az őszinte megállapítás, hogy az eredet nem ellenőrizhető.
Amit a kombináció megmutat, és egyik rész sem önmagában
A két módszer csak együtt válik beszédessé. A naplók elárulják, mely oldalakat kéri le valójában a GPTBot, és hány bájtot kap értük. A curl-teszt elárulja, mennyi tartalom van ezekben a bájtokban. Ha egy bot havonta hússzor lekér egy termékoldalt, minden alkalommal 4 kilobájtot kap, és a curl-teszt pontosan ennél az oldalnál üres burkot mutat, akkor a diagnózis egyértelmű: a crawler szívesen látott vendég, rendszeresen jön, és minden alkalommal üres kézzel távozik.
Ezt kívülről egyetlen pontszám sem tudja megállapítani, a miénk sem. Egy elemzőeszköz látja az oldalt, de nem látja a szervert. Ellenőrizni tudja, hogy a robots.txt beengedi-e a GPTBotot. Hogy a GPTBot aztán tényleg jön-e, az csak a naplókban áll.
A kézenfekvő ellenvetés
Ellenvethetjük, hogy mindez a legtöbb üzemeltetőnek túl sok munka. Aki weboldalépítő rendszeren van, nem fér hozzá az Nginx-naplókhoz, aki pedig hozzáfér, nem akar awk-kal bajlódni. Ez igaz. Az első lépés, a curl-teszt, azonban nem igényel szerverhozzáférést, és egy percig tart. Már önmagában megválaszolja a legfontosabb kérdést: ott van-e egyáltalán a tartalom JavaScript nélkül. A naplók azoknak szólnak, akik tudni akarják, egyeznek-e a crawlerekről alkotott feltevéseik a valósággal. A mieink például azt mutatták, hogy három hét alatt 1252 MI-bot-lekérésből egyetlen egy sem a llms.txt-re irányult, bármit ígér is a GEO-marketing erről a fájlról.
A mögötte álló tapasztalat egyszerű. Aközött, amit az ember a weboldaláról hisz, és aközött, ami a naplókban áll, többnyire egy meglepetés rejlik. Érdemes magunknak megtalálni, mielőtt egy nyelvi modell csendben megtalálja helyettünk.
— Andreas Kurt Peter Reuter