AI SEO · 7 min leestijd
Bots herkennen in je serverlog: 1.462 patronen, en waar ze tekortschieten
Je wil in je logs echte bots scheiden van bezoekers zonder te gokken. Deze pagina gebruikt CrawlerDetect-patronen voor betere botherkenning.
Meer dan de helft van al het verkeer op het web komt inmiddels van machines: 57,5% tegen 42,5%, gemeten door Cloudflare in mei 2026. Op jouw site is dat percentage anders, en je weet niet welk. Je analytics tellen het niet mee, want een crawler voert geen JavaScript uit.
Het enige bestand waar het wél in staat is je access log. Daar staat bij elk verzoek de user-agent, en daarin noemen bijna alle bots zichzelf gewoon bij naam. Je hebt alleen een lijst nodig van welke namen dat zijn.
De lijst die er al is
CrawlerDetect is zo’n lijst. Het is een PHP-class die kijkt of een user-agent bij een bot hoort, met een MIT-licentie en 2.391 sterren op GitHub. Op het moment van schrijven zitten er 1.462 patronen in, plus 52 uitzonderingen. De laatste update is van 30 juli 2026, dus de lijst wordt nog bijgehouden.
De werking is simpel. Eerst haalt hij de uitzonderingen uit de user-agent weg — browserversies en losse woorden die anders vals alarm geven. Wat overblijft legt hij naast die 1.462 patronen. Zit er een match in, dan is het een bot.
Ik heb de lijst langs de AI-crawlers van nu gehaald
Een lijst uit 2013 die bots herkent aan het woord “spider” is één ding. De vraag is of hij de agents van 2026 pakt. Ik heb de patronen op 11 augustus 2026 gedownload en er de officiële user-agent-strings van de grote AI-partijen langs gelegd.
| User-agent | Wat het is | Uitkomst |
|---|---|---|
GPTBot |
OpenAI, training | bot |
OAI-SearchBot |
OpenAI, zoekindex | bot |
ChatGPT-User |
OpenAI, haalt een pagina op voor een gebruiker | bot |
ClaudeBot |
Anthropic, crawler | bot |
Claude-User |
Anthropic, voor een gebruiker | bot |
PerplexityBot |
Perplexity, crawler | bot |
Perplexity-User |
Perplexity, voor een gebruiker | mens |
CCBot |
Common Crawl | bot |
Bytespider |
ByteDance | bot |
Amazonbot |
Amazon | bot |
Applebot |
Apple | bot |
meta-externalagent |
Meta | bot, maar niet op zijn naam |
MistralAI-User |
Mistral, voor een gebruiker | bot, maar niet op zijn naam |
| Chrome op een MacBook | een mens | mens |
Dertien van de veertien goed, dus. Drie regels verdienen uitleg.
Perplexity-User telt als bezoeker
De lijst pakt de meeste AI-crawlers via het woord bot, crawl of spider in hun naam. De agents die geen van die drie in hun naam hebben staan er los in: ChatGPT-User en Claude-User zijn allebei met de hand toegevoegd. Perplexity-User niet. Zijn user-agent bevat geen enkel woord uit de lijst, dus komt hij bij je mensen terecht.
Perplexity beschrijft die agent zelf zo: hij bezoekt een pagina wanneer een gebruiker een vraag stelt, om het antwoord te onderbouwen en de pagina erbij te linken. Dat is geen scraper op de achtergrond — dat is verkeer met iemand erachter, en het is de reden dat je hem juist apart wil kunnen tellen.
Mistral en Meta zijn het tweede geval, en dat is subtieler. Allebei worden ze herkend, maar niet aan hun naam. MistralAI-User matcht op het woord “robots” in de bron-URL die hij meestuurt, docs.mistral.ai/robots. meta-externalagent matcht op “crawler” in zíjn bron-URL. Verandert een van die twee die link, dan zijn ze stilletjes weg uit je telling. Een match op iets wat toevallig meelift is geen match waar je een maandrapport op bouwt.
Wat ik zou doen
Tel eerst, beslis daarna. Haal je access log van vorige maand op en draai er dit doorheen. Dan weet je wat er speelt in plaats van dat je erover leest.
import re, sys, collections
BOTS = r"gptbot|oai-searchbot|chatgpt-user|claudebot|claude-user|perplexity-user|perplexitybot|googlebot|bingbot|bytespider|ccbot|amazonbot|applebot|meta-externalagent|mistralai-user"
t = collections.Counter()
for regel in open(sys.argv[1], errors="ignore"):
ua = regel.split('"')[5] if regel.count('"') > 5 else ""
m = re.search(BOTS, ua, re.I)
t[m.group(0).lower() if m else "mens (of onbekend)"] += 1
for naam, n in t.most_common():
print(f"{n:8d} {naam}")
Opslaan als telbots.py en draaien met python3 telbots.py access.log. Werkt op een standaard nginx- of Apache-logregel, waar de user-agent het zesde veld tussen aanhalingstekens is.
Houd je eigen lijstje bij naast de bibliotheek. Elke maand komt er een AI-partij bij en elke bibliotheek loopt daarop achter. Vijftien namen in een regex die jij zelf beheert is sneller bijgewerkt dan een pull request in een repo van iemand anders.
Zet de agents in een aparte kolom, niet achter een blokkade. Trainingscrawlers mag je weren als je dat wil. De agents die op dat moment voor een gebruiker zoeken zijn je bezoekers van morgen — die wil je zien, niet buiten de deur. Wil je weten of dat ook wat oplevert: in Search Console kun je zien of je site in AI-antwoorden opduikt.
Veelgestelde vragen
Moet ik PHP draaien om CrawlerDetect te gebruiken?
Nee. De class is PHP, maar de patronen staan als los JSON-bestand in de repo. Draai je WordPress, dan heb je PHP toch al en kun je hem via Composer installeren.
Kan ik niet gewoon filteren op het woord “bot”?
Dat pakt de meeste, maar je mist precies de interessante groep: de agents met -User in hun naam. En je krijgt vals alarm van elke user-agent waar toevallig “bot” in staat. Daar zijn die 52 uitzonderingen voor.
Ik heb Cloudflare ervoor, zie ik dan nog wel iets?
In je serverlog zie je alleen wat Cloudflare doorlaat. Wat daarvóór al is tegengehouden staat in het Cloudflare-dashboard, niet bij jou. Vergelijk de twee een keer naast elkaar; het verschil zegt meer dan elk van de twee apart.
Kan een bot liegen over zijn user-agent?
Ja, en dat gebeurt ook. Deze aanpak telt de bots die zichzelf netjes bekendmaken, en dat zijn de partijen die je juist wil volgen. Voor de rest heb je IP-controle nodig; de grote AI-partijen publiceren hun IP-reeksen daarvoor.
Bronnen
- CrawlerDetect op GitHub — patronen en licentie, cijfers opgehaald 11 augustus 2026
- crawlerdetect.io — de projectsite met een testveld voor je eigen user-agent
- Perplexity over PerplexityBot en Perplexity-User
- Mistral over MistralAI-User
Waarom je serverlog iets vertelt wat geen enkele tool je geeft
Analytics ziet alleen bezoekers die JavaScript uitvoeren. Bots doen dat niet. Alles wat crawlers op je site doen, gebeurt dus buiten je statistieken om — en juist dat is wat bepaalt of je gevonden wordt.
Drie vragen die je alleen in het log beantwoordt:
- Komt Googlebot überhaupt langs, en hoe vaak? Een site die niet gecrawld wordt kan niet ranken, en dat zie je nergens anders zo direct.
- Welke pagina’s haalt hij op? Als hij vooral je oude pagina’s blijft ophalen en je nieuwe overslaat, weet je waar je interne links tekortschieten.
- Welke AI-crawlers komen er? OAI-SearchBot, PerplexityBot en ClaudeBot laten zich hier zien, en nergens anders.
Wat je in de regels zoekt
Een logregel bevat het IP, de tijd, de opgevraagde URL, de statuscode en de user-agent. Die laatste twee doen het werk.
| Waar je op filtert | Wat het je zegt |
|---|---|
| user-agent bevat Googlebot | crawlfrequentie en welke URL’s |
| statuscode 404 bij een bot | je verspilt crawlbudget aan dode URL’s |
| statuscode 301 in een keten | elke extra stap kost crawlbudget |
| dezelfde URL tientallen keren per dag | meestal een parameter- of paginatieprobleem |
Belangrijk: een user-agent is een tekstveld dat iedereen kan invullen. Wie zeker wil weten dat het echt Googlebot was, controleert het IP via een omgekeerde DNS-lookup. Voor dagelijks gebruik is dat overdreven; voor het beoordelen van verdacht verkeer niet.
Waar patroonlijsten tekortschieten
Kant-en-klare botlijsten herkennen wat zich netjes bekendmaakt. Dat is precies het verkeer dat je het minst hoeft te wantrouwen. Wat ze missen:
- Bots die zich voordoen als een browser. Die staan in geen enkele lijst en zijn alleen te herkennen aan gedrag: te snel, te systematisch, geen afbeeldingen ophalen.
- Nieuwe crawlers. Elke maand komt er een AI-bedrijf bij. De lijst loopt per definitie achter.
- Verkeer via een proxy. Het IP zegt dan niets over de herkomst.
Praktische conclusie: gebruik een lijst om het bekende verkeer snel weg te filteren, en beoordeel wat overblijft op gedrag. Wat je met de uitkomst doet, staat in de AI robots.txt-tester.
