Captcha nel web scraping: perché compaiono e cosa fare
Un captcha compare durante lo scraping quando un sito decide che una richiesta sembra automatizzata. I fattori più comuni sono troppe richieste in poco tempo, un indirizzo IP con cattiva reputazione, segnali del browser mancanti o un accesso a una pagina che il sito protegge più strettamente del resto. La risposta pratica ha tre passaggi, in quest'ordine: ridurre i fattori scatenanti, rilevare il captcha nel codice e risolvere quelli che non puoi evitare. Questa guida copre ciascun passaggio e rimanda alle guide dettagliate per il resto.
Perché i siti mostrano captcha agli scraper
Un sito ha poche possibilità di distinguere una persona da uno script nel momento in cui una pagina viene richiesta, quindi osserva gli schemi. Uno scraper spesso si distingue perché:
- invia richieste più veloci di quanto un essere umano possa cliccare;
- ripete lo stesso percorso senza pause;
- arriva da un indirizzo di datacenter anziché da una rete domestica;
- invia intestazioni che non corrispondono a un browser comune, oppure
- non conserva cookie né stato di sessione tra una richiesta e l'altra.
Basta anche uno solo di questi fattori. Il captcha è il modo del sito di chiedere un passaggio simile a quello umano prima di servire altre pagine. Ridurre lo schema di solito riduce i captcha, ed è più economico che risolverli.
Rileva il captcha nel codice
Prima di risolvere qualcosa, verifica se la pagina che hai ricevuto è davvero la pagina del captcha. Un test semplice cerca il markup del widget e legge la sitekey:
import re
import requests
SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')
def fetch(url: str) -> dict:
resp = requests.get(
url,
timeout=30,
headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
)
html = resp.text
if "h-captcha" in html or "g-recaptcha" in html:
match = SITEKEY_RE.search(html)
return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
return {"captcha": False, "sitekey": None, "html": html}
page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
print("captcha found, sitekey:", page["sitekey"])
Le stringhe h-captcha e g-recaptcha sono solo il markup che una pagina usa, quindi questo è un segnale, non una garanzia. Se manca la sitekey, vedi come trovare la sitekey di un captcha.
Risolvilo quando non puoi evitarlo
Quando sulla pagina c'è un widget PopularCaptcha e hai la sua sitekey, puoi richiedere un token all'API di Scarnox con una sola richiesta POST e inviarlo nel campo h-captcha-response. La funzione completa, con la gestione degli errori, è in risolvere un captcha da Python con una sola richiesta. Usa il token subito, perché scade dopo circa due minuti. I dettagli sulla tempistica sono in token captcha scaduto.
Il supporto attivo di Scarnox oggi è PopularCaptcha, in modalità proxyless e con il tuo proxy. reCAPTCHA v2 e v3, Cloudflare Turnstile, GeeTest, AWS WAF e Arkose sono in arrivo. Se il tuo bersaglio usa uno di questi, le guide sui captcha spiegano le opzioni generali, ma non costruire un flusso di produzione su una risoluzione che non è ancora attiva.
Un percorso decisionale per ogni pagina bloccata
Quando lo scraper incontra un captcha, un ordine decisionale semplice mantiene il lavoro corretto e il volume di richieste basso:
- Esiste una fonte dati alternativa? Se un'API, un feed o un'esportazione copre i campi che ti servono, passa a quella e smetti di richiedere quella pagina.
- **
robots.txtconsente il percorso?** Se no, saltalo. Non risolvere un captcha su una pagina da cui ti è stato chiesto di stare lontano. - Hai inviato troppo e troppo in fretta? Fai una pausa più lunga, abbassa la frequenza e ricontrolla più tardi. Molti captcha spariscono con un ritmo più lento.
- Il captcha è un tipo attivo? Se è PopularCaptcha, si applica la risoluzione di questa guida. Se è un tipo in arrivo, tieni il lavoro in pausa e monitora il rilascio.
- È una pagina che sei autorizzato ad automatizzare? Se la risposta non è chiara, chiedi al titolare del sito prima di proseguire.
Il quarto passaggio è quello più spesso saltato. Un solver è utile solo quando il tipo di captcha è supportato, e un lavoro che ritenta un tipo non supportato spreca tempo e richieste.
Gestisci il captcha in un job, non in un ciclo
Metti la risoluzione nel percorso di codice che ha bisogno del token, così il job può registrare ogni captcha, fermarsi quando una pagina continua a fallire e passare oltre. Un ciclo senza limiti che richiede di continuo una pagina captcha è il modo più rapido per far sì che il firewall di un sito blocchi definitivamente il tuo indirizzo.
Monitora ciò che fallisce
Tieni il conteggio delle pagine che restituiscono un captcha, raggruppate per URL e per ora del giorno. Un captcha che compare solo in una sezione di un sito, o solo dopo un certo numero di richieste, ti indica dove sta il fattore scatenante. Questa informazione è più utile di un solver più veloce, perché ti mostra cosa cambiare.
Cosa non fare
- Non ruotare tra molti indirizzi IP per evitare i limiti di un sito. È evasione, e trasforma una richiesta di rallentare in un braccio di ferro.
- Non fare scraping di pagine protette da login con credenziali che non sei autorizzato a usare.
- Non risolvere captcha per creare account, pubblicare spam o acquistare articoli a disponibilità limitata.
Scraping responsabile
- Leggi
robots.txte i termini di servizio del sito prima di iniziare. Rispetta i percorsi non consentiti e qualsiasi ritardo di scansione indicato. - Identifica il tuo bot in modo onesto nello User-Agent, con un modo per contattarti.
- Mantieni bassa la frequenza delle richieste. Un captcha è spesso il sito che ti chiede di rallentare.
- Fermati se il sito te lo chiede, e non aggirare un blocco che ti è stato detto di rispettare.
- Gestisci i dati personali secondo le norme sulla privacy che ti si applicano, e raccogli solo ciò che ti serve.