Alcuni link in questa pagina sono link di affiliazione: se ti registri tramite questi link, il sito riceve una commissione senza costi aggiuntivi per te. Prezzi e consigli non cambiano.

La domanda è arrivata sotto il nostro articolo sull’analytics, e nell’ordine giusto: robots.txt, Cloudflare, Anubis. Se ne discute come di alternative. Non lo sono. Uno pubblica una preferenza, uno applica una decisione al bordo, uno fa pagare al client la pagina. Scegliere tra loro significa decidere quale di queste tre cose si vuole davvero.

Abbiamo quindici giorni di access log di un sito andato online in ottobre, 9.996 righe, e uno stack Anubis usa e getta su un portatile. Tutto ciò che qui sotto ha un numero viene da una di queste due fonti. Dove non abbiamo numeri nostri, è scritto.

Prima di tutto: chi lo chiede, poi

Prima di scegliere uno strumento, guardate quanto vale il protocollo gentile sul vostro log. Su 9.996 richieste, 334 erano per robots.txt. Ecco chi le ha mandate, a fronte di quanto ciascuno ha preso:

CrawlerRichiesteRichieste di robots.txtURL distinti
ClaudeBot48478330
Googlebot54117333
GoogleOther5200327
GPTBot3910387
meta-externalagent3220315
AhrefsBot20221129
bingbot1641867
OAI-SearchBot1083561
Amazonbot96394
PerplexityBot63921
YandexBot49338
Applebot30522

I due zeri in mezzo alla tabella sono la parte interessante, e non significano quello che sembrano a prima vista.

GPTBot non ha richiesto il nostro robots.txt nemmeno una volta su 391 richieste. OAI-SearchBot l’ha richiesto 35 volte - e i due condividono intervalli di IP. Lo stesso in Meta: meta-externalagent, il crawler dei dati di addestramento, non ha mai chiesto il file, mentre facebookexternalhit, che recupera le anteprime dei link, l’ha chiesto otto volte. Google fa uguale: Googlebot 17 volte, GoogleOther nemmeno una, e girano sulla stessa infrastruttura.

La lettura onesta quindi non è «i crawler di addestramento ignorano robots.txt». È che la richiesta avviene altrove nella flotta del fornitore, e il crawler che vedete nel log sta a valle di una cache che non potete osservare. Con una conseguenza pratica: il vostro log non può dire se una regola di robots.txt sia mai stata vista, tanto meno rispettata. L’unico test del funzionamento di una regola è se i percorsi vietati smettono di essere richiesti.

Anthropic qui è l’eccezione nella direzione opposta. 78 richieste su 484 è un controllo di robots.txt ogni sei richieste di contenuto, e le prime due richieste che ClaudeBot ci ha mai fatto sono state /robots.txt e poi /, a un secondo di distanza.

robots.txt: una richiesta, con un sottile strato di diritto dietro

Costa niente. Meccanicamente non fa niente: un percorso vietato viene comunque servito a chiunque lo chieda.

Ciò che è cambiato di recente sono le carte dietro. L’articolo 53(1)(c) del regolamento sull’IA impone ai fornitori di modelli per finalità generali di predisporre una politica per individuare e rispettare le riserve di diritti espresse ai sensi dell’articolo 4(3) della direttiva sul diritto d’autore, «anche mediante tecnologie all’avanguardia». Il codice di buone pratiche allegato nomina una di quelle tecnologie in modo esplicito: i firmatari si impegnano a rispettare robots.txt secondo l’RFC 9309.

Leggete il perimetro prima di contarci. L’obbligo cade sui fornitori di modelli per finalità generali, e il codice è volontario e firmato. Uno scraper che non sia esso stesso fornitore di modelli ne sta fuori, e cosa valga come riserva di diritti efficace è ancora una questione per i tribunali. Le FAQ della Commissione elencano diversi altri meccanismi leggibili dalle macchine accanto a robots.txt.

Il valore pratico è reale ma stretto: un robots.txt con direttive AI esplicite costa poco, ed è l’artefatto da indicare se un giorno serve mostrare che una riserva è stata espressa. Una prova, non un muro.

Cloudflare: applicazione, se il DNS è già lì

Questa è la sezione senza numeri nostri, e preferiamo dirlo piuttosto che travestire la documentazione da misura. Il nostro blog non sta dietro Cloudflare, nulla di quanto segue l’abbiamo misurato noi.

Dalla documentazione di Cloudflare: AI Crawl Control mostra quali servizi AI vi scansionano, permette regole di allow o block per crawler, traccia il rispetto di robots.txt ed espone un’opzione pay per crawl in beta privata. La funzione managed robots.txt genera le direttive dalle politiche scelte e le antepone a quello che il vostro origin già serve. Entrambe sono documentate come disponibili su tutti i piani.

Il punto architetturale: è l’unica delle tre opzioni che blocca una richiesta prima che raggiunga il vostro server, e l’unica in cui l’elenco di chi è chi lo mantiene qualcun altro. Lo scambio è tutto lì. Ottenete applicazione senza gestire niente, e in cambio la decisione su cosa conti come crawler AI la prende una terza parte, davanti al vostro sito, per ogni visitatore.

Anubis: far pagare il client

Anubis è un reverse proxy che mette una prova di proof-of-work davanti all’origin. Nessuna dichiarazione di identità è coinvolta: un client che non riesce a eseguire il JavaScript della prova non ottiene la pagina, qualunque cosa dica il suo user-agent.

Abbiamo messo la v1.28.2 davanti a un origin nginx su un portatile e l’abbiamo sondata. Con la policy di default distribuita:

ClientRisposta
curl/8.18.0200, diretto all’origin, 53 byte
user-agent GPTBotpagina di rifiuto, 2.270 byte, servita con HTTP 200
user-agent ClaudeBotpagina di rifiuto, servita con HTTP 200
user-agent Googlebotpagina della prova, ~7,1 KB
user-agent Chrome desktoppagina della prova, ~7,1 KB

Tre cose da sapere prima di metterlo in produzione.

La pagina di rifiuto torna con HTTP 200, non 403. Se monitorate il sito per codice di stato, un crawler completamente bloccato somiglia a uno sano.

Un client non-browser semplice e onesto passa senza ostacoli. È voluto - così continuano a funzionare curl, i lettori di feed e il vostro monitoraggio - ma significa anche che Anubis non è un muro contro lo scraping in generale. Tutto ciò che non finge di essere un browser passa per default.

E la riga Googlebot è un artefatto di laboratorio che vale segnalare: Anubis verifica i motori di ricerca via DNS inverso, e per una richiesta che arriva da 127.0.0.1 non può riuscire. In un deployment reale quella riga sarebbe un passaggio, non una prova. La mostriamo perché è proprio il tipo di risultato che sembra una scoperta e non lo è.

Quanto costa la prova all’umano

È il numero che decide se Anubis si può usare su un sito con visitatori reali. Abbiamo risolto la prova con un Chromium headless misurando dalla navigazione al rendering della pagina di origin:

DifficoltàMedianaEsecuzioni
2 (default)0,08 s5
40,27 s5
6da 50 a 75 s2 su 3

Al default distribuito la barriera è invisibile. Due scatti più su è un minuto di pagina che gira, perché ogni livello moltiplica il lavoro per sedici. La terza esecuzione a difficoltà 6 non si è conclusa affatto entro il nostro timeout di 90 s, e questa è la forma onesta della coda: a quell’impostazione il costo non è solo alto, è abbastanza disperso perché una parte dei visitatori rinunci. Se girate quella manopola perché il default «sembra basso», non ve ne accorgerete: il vostro browser tiene il cookie di sblocco per una settimana. Paga ogni visitatore che arriva per la prima volta.

Due trappole di deployment, entrambe più costose della misura stessa.

La variabile d’ambiente DIFFICULTY non cambiava la prova. Nella v1.28.2 il log di avvio la riporta, la prova servita la ignora, e il numero che conta viene dal file di policy. L’abbiamo colto solo leggendo la difficoltà dal JSON incorporato nella pagina della prova.

Senza USE_REMOTE_ADDRESS=true, ogni singola richiesta restituiva HTTP 500, con [misconfiguration] X-Real-IP header is not set nel log. Anubis presume che qualcosa davanti a lui imposti quell’header. Se nessuno lo fa, si chiude su tutto il traffico, non solo sui bot.

Si può davvero dire chi è chi

Tutti tre gli approcci alla fine poggiano sull’identificazione, quindi abbiamo controllato quanto funziona oggi. Ogni richiesta di crawler dal nostro log, confrontata con l’elenco pubblicato dal fornitore o con il DNS inverso:

CrawlerRichiesteVerificateContro
ClaudeBot484484 / 484claude.com/crawling/bots.json
GPTBot391391 / 391openai.com/gptbot.json
OAI-SearchBot108108 / 108openai.com/searchbot.json
PerplexityBot6363 / 63perplexity.ai/perplexitybot.json
ChatGPT-User3937 / 39openai.com/chatgpt-user.json
Googlebot541541 / 541DNS inverso
GoogleOther520520 / 520DNS inverso
bingbot164164 / 164DNS inverso
Amazonbot9696 / 96DNS inverso
YandexBot4949 / 49DNS inverso
Applebot3030 / 30DNS inverso
meta-externalagent322322 / 322prefissi annunciati AS32934

Meglio di quanto suggerisca il folklore. I grandi crawler AI ora pubblicano elenchi di IP che si possono scaricare e controllare, e i nostri corrispondevano richiesta per richiesta.

Due eccezioni. ChatGPT-User ha inviato due richieste da indirizzi fuori dall’elenco pubblicato: è l’unico agente attivato da una persona nella tabella, e quello in cui uno scostamento preoccupa meno. E meta-externalagent non ha né DNS inverso né un elenco di crawler pubblicato che abbiamo trovato, quindi l’unico controllo disponibile è se l’indirizzo stia nei prefissi di rete annunciati da Meta. È un’affermazione molto più debole: dice che il pacchetto è arrivato dalla rete di quell’azienda, non che il crawler sia quello che dichiara.

Il passo, quando l’identità non è disponibile

Per tutto ciò che non si verifica né si identifica, il comportamento lo tradisce comunque. L’intervallo tra richieste consecutive dello stesso crawler, su quindici giorni:

CrawlerIntervallo medianoQuota di intervalli sotto 1 s
GPTBot1 s92,1%
meta-externalagent1 s88,2%
YandexBot1 s75,0%
ClaudeBot1 s52,0%
AhrefsBot29 s31,8%
Googlebot158 s8,0%
GoogleOther137 s0,8%

La separazione è netta, e non è questione di cortesia. Google ha prelevato più pagine di tutti (541 e 520 URL) e l’ha fatto con un intervallo mediano di oltre due minuti, perché il ritmo di scansione è un problema risolto su cui ha avuto decenni. I crawler di addestramento hanno preso il sito in una passata, veloci quanto il sito serviva.

L’uso pratico: su un sito tranquillo, un istogramma degli intervalli di arrivo separa una scansione da un pubblico senza leggere un solo user-agent. Un picco concentrato in un unico intervallo sotto il secondo è una macchina. Gli umani producono raffiche serrate - ripristino di schede, prefetch - ma non le tengono per 390 richieste.

Quindi cosa scegliere

Se voleteUsatePrezzo
Dichiarare una preferenza e avere l’artefatto agli attirobots.txt con direttive AI espliciteNiente
Fermare le richieste prima che il server le veda, senza gestire nullaCloudflare AI Crawl ControlIl DNS passa da loro, e il loro elenco definisce chi è bot
Rendere il contenuto indisponibile a tutto ciò che non esegue un browserAnubis davanti all’originUna barriera che attraversa anche ogni umano al primo arrivo
Sapere cosa succede davveroIl vostro access log, analizzatoUn pomeriggio, una volta sola

Si impilano, e quella è la configurazione sensata: robots.txt dice cosa volete, uno degli altri due applica la parte che vi interessa abbastanza da applicare, e il log dice se qualcosa ha funzionato.

Cosa gira su questo sito: robots.txt, e nient’altro. Pubblichiamo articoli perché siano letti, anche da ciò che poi li riassume. Lo stack Anubis l’abbiamo costruito proprio per poter mettere un numero sull’alternativa, e il numero dice che lo strumento va bene e che il pericolo è la manopola della difficoltà.

Cosa questo non può dire

Un sito, una nicchia, una finestra di quindici giorni, 9.996 richieste. Un sito con contenuto commerciale reale attira un’altra classe di scraper, quella che non si annuncia e non compare in nessuna di queste tabelle, e contro quella popolazione ogni numero qui sopra è irrilevante.

Le misure di Anubis vengono da un portatile contro localhost: nessuna latenza di rete, un client, e una CPU più veloce del telefono mediano. Prendete la curva di difficoltà come la forma del costo, non come il suo valore assoluto.

E il buco che con i log non si chiude affatto: richiedere robots.txt non è rispettarlo, e non richiederlo non è ignorarlo. Tutto nella prima tabella è una misura di richieste, non di consenso.