coresmith.dev
← Toate articolele
Blog

Cum verifici ce vede de fapt un crawler

Browserul e instrumentul greșit. Uite metoda care funcționează — întrebi ca fiecare bot, apoi îți citești logurile — și cele trei feluri în care verificările astea mint, inclusiv cele două care au produs concluzii false în propriul nostru audit.

Publicat 4 min de citit

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:

  1. curl pe fiecare agent, pe tot sitemapul. Îți spune dacă în general conținutul există pentru un crawler.
  2. 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.
  3. 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.

Începe cu discuția despre scop. Nu costă nimic și de obicei e un singur apel.