Dacă deschizi site-ul într-un browser, afli ce vede un browser. Aia e altă întrebare decât ce vede un crawler, iar pe un site modern cele două răspunsuri pot fi complet diferite.
Uite metoda pe care o folosim și — mai util — felurile în care minte.
Întreabă ca botul, nu ca tine
Toată verificarea e o cerere cu User-Agent-ul potrivit și o numărătoare de
cuvinte:
check() {
curl -sS -A "$2" --max-time 15 "$1" | python3 -c "
import sys, re
h = sys.stdin.read()
b = re.search(r'<body[^>]*>(.*)</body>', h, re.S)
if not b: print(0); raise SystemExit
t = re.sub(r'<script.*?</script>|<style.*?</style>|<noscript.*?</noscript>', '', b.group(1), flags=re.S)
print(len(re.sub(r'<[^>]+>', ' ', t).split()))"
}
for ua in \
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
"Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" \
"GPTBot/1.0 (+https://openai.com/gptbot)" \
"OAI-SearchBot/1.0" \
"ClaudeBot/1.0" \
"PerplexityBot/1.0" \
"Applebot/0.1"
do
printf "%-24s %s cuvinte\n" "${ua:0:22}" "$(check https://example.com/ "$ua")"
done
Două lucruri fac verificarea asta să merite rulată, nu presupusă.
Rul-o pe fiecare adresă din sitemap, nu pe pagina principală. Un site poate randa prima pagină pe server și lăsa goală fiecare pagină de adâncime. Alea sunt exact paginile care ar fi rankuit.
Compară între agenți. Dacă Googlebot primește conținut și GPTBot primește
zero, ai undeva o regulă — în robots.txt, într-un CDN, într-un produs de
protecție anti-bot — care decide în locul tău ce motoare au voie să te citească.
Decizia aia merită luată intenționat, nu moștenită.
Apoi citește-ți propriile loguri
Verificarea cu curl îți spune ce ar primi un crawler. Logul de acces îți
spune ce s-a întâmplat de fapt, și e singura dovadă din tot exercițiul ăsta pe
care n-o poate contesta nimeni.
Dacă cererile îți sunt logate cu antete, grupează-le pe user-agent și pe zi:
const BOT = /(Googlebot|bingbot|GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|PerplexityBot|Google-Extended|Applebot|YandexBot|Amazonbot|DuckDuckBot)/i;
for (const line of readLines(logFile)) {
const entry = parse(line);
const hit = BOT.exec(entry.headers['user-agent'] ?? '');
if (hit) counts[hit[1]][entry.day]++;
}
Patru luni de așa ceva ne-au spus mai mult decât orice unealtă. O mostră, din săptămâna în care am pus prerandarea pe un site care servea crawlerelor un corp gol:
| crawler | înainte | după |
|---|---|---|
| Googlebot | 1–5 cereri pe zi | 167, apoi 451 |
| GPTBot | 1–3 pe zi | 208 într-o singură zi |
| YandexBot | 0 | 84 |
Două lucruri din datele alea nu se vedeau nicăieri altundeva. Patru crawlere care
nu apăruseră niciodată — PerplexityBot, Applebot, DuckDuckBot, Amazonbot — au
început într-o săptămână. Și ChatGPT-User, agentul care deschide o pagină în
timp ce cineva așteaptă un răspuns în ChatGPT, a trecut de la niciodată la 33 de
cereri într-o zi.
Numără și pagini distincte, nu doar cereri. O mie de accesări pe pagina principală și o mie împrăștiate pe șaizeci de pagini înseamnă lucruri opuse.
Trei feluri în care verificările astea mint
Asta e partea care merită păstrată. Fiecare dintre ele a produs o concluzie falsă în propriul nostru audit, înainte s-o prindem.
curl fără User-Agent nu e un crawler
Am raportat că sitemap.xml al unui client întoarce 403. Chiar întorcea — lui
curl cu agentul lui implicit. Protecția anti-bot a site-ului blochează clienții
necunoscuți, iar curl/8.5.0 e un client necunoscut.
Același fișier, cerut cum trebuie:
curl 403
Chrome 200
Googlebot 200
bingbot 200
Nu exista nicio problemă de SEO. Defectul era în instrument. Nu rula niciodată o
verificare de crawler fără -A, iar când un rezultat pare alarmant, mai rulează-l
o dată ca Chrome și ca Googlebot înainte să-l crezi.
Operatorul site:, citit printr-un scraper, nu e dovadă
Am folosit interogări site: luate de pe un motor de căutare ca să concluzionăm
că trei site-uri de client nu sunt indexate. Două erau.
Motoarele servesc pagini degradate clienților automați. Într-o rulare, pagina de
rezultate pentru site:createli.md era plină de rezultate de pe forumul de suport
al unui operator de telefonie german. Și numărul raportat era zgomot: site: pe
un domeniu fără nicio potrivire a întors „circa 2 160 000 de rezultate".
Ce e de încredere, în ordine: Search Console, adică motorul spunându-ți
direct; o căutare restricționată la domeniu printr-un API real de căutare; și o
interogare simplă de brand, care măcar confirmă că ceva e indexat. Un număr
de rezultate site: extras dintr-o pagină HTML nu confirmă nimic.
Jumătate din „crawlerele AI" din loguri nu sunt crawlere AI
Gruparea a patru luni de loguri pe user-agent a produs un tabel în care
PerplexityBot ceruse /.env.production, /.env.bak și /.git/HEAD; Applebot
ceruse /backend/.env; OAI-SearchBot /credentials.yaml; iar YandexBot
/wp-config.php.bak.
Perplexity cel adevărat nu scanează după fișiere de mediu. Sunt scanere care poartă numele unui bot, fiindcă agenții de bot sunt deseori scutiți de limitele de rată.
Două consecințe. Statisticile tale de crawler sunt umflate dacă nu verifici — prin DNS invers, sau față de intervalele de IP publicate de fiecare furnizor. Și fiecare dintre căile alea merită verificată pe propriul site:
for p in /.env /.env.production /.git/config /credentials.yaml /wp-config.php.bak; do
printf "%-26s %s\n" "$p" "$(curl -sS -o /dev/null -w '%{http_code}' "https://example.com$p")"
done
Orice altceva decât 403 sau 404 e o constatare. Pe un site, fiecare dintre ele a întors 200, fiindcă rezerva de SPA servea pagina principală pentru orice adresă necunoscută — ceea ce e, separat, și o mulțime nemărginită de soft 404.
Ce concluzionezi
Ordinea care rezistă la verificare:
curlpe fiecare agent, pe tot sitemapul. Îți spune dacă în general conținutul există pentru un crawler.- Propriul log de acces, grupat pe agent și pe zi. Îți spune cine a venit cu adevărat și ce a luat. Cea mai tare dovadă disponibilă, și e a ta.
- Search Console. Îți spune ce a decis motorul după aceea. La întrebarea aia nu răspunde nimic altceva.
Și o disciplină sub toate trei: când un rezultat te surprinde, suspectează instrumentul înainte de site. De două ori într-un singur audit, constatarea surprinzătoare a fost propria noastră măsurătoare.