Risposta rapida
Cosa significa 429 Too Many Requests con un proxy?
429 Too Many Requests significa che il sito applica un limite di frequenza: hai inviato più richieste di quante ne accetta in una finestra temporale. La soluzione è inviare meno, non nascondersi di più. Con i proxy residenziali di CrawlRelay, rispetta l'intestazione Retry-After, limita la concorrenza per host e applica un backoff esponenziale con jitter casuale. Ruotare IP per superare i limiti pubblicati viola la maggior parte dei termini di utilizzo.
429 Too Many Requests a colpo d'occhio
| Errore | 429 Too Many Requests |
|---|---|
| Tipo | Codice di stato HTTP (4xx, errore client) |
| Inviato da | Il sito web target o il suo gateway API |
| Definito in | RFC 6585, section 4 (Retry-After: RFC 9110, section 10.2.3) |
| Riprovarlo? | Sì, dopo il ritardo Retry-After o un backoff esponenziale |
| Prima verifica | Leggi l'intestazione Retry-After e le tue richieste al secondo per host |
Cosa significa 429 Too Many Requests?
RFC 6585 ha introdotto il 429 per il rate limiting. Il server può aggiungere un'intestazione Retry-After, numero di secondi o una data HTTP, per indicare quando tornare. Le API spesso aggiungono anche proprie intestazioni come X-RateLimit-Remaining.
Un 429 è la risposta più garbata che un sito possa dare a uno scraper. Dice che il contenuto è disponibile, solo non al tuo ritmo attuale. I siti che vedono ignorati i loro 429 di solito passano a 403, CAPTCHA o blocchi permanenti.
Com'è a 429 in Python, curl, Node.js e browser?
Lo stesso errore si presenta in modo diverso in ogni strumento. Questi sono i messaggi da cercare nei log:
- Python requests / httpx:
status_code == 429, spesso conRetry-After: 30 - Scrapy: gestito da
RetryMiddleware, visto che 429 è nelRETRY_HTTP_CODESdi default - curl:
HTTP/2 429seguito daretry-after:negli header di risposta - API: un corpo JSON come
{"error": "rate_limited"}
Cosa causa a 429?
Probabilmente prima:
- Troppa concorrenza per host. Cinquanta worker paralleli su un dominio sembrano un attacco alla maggior parte dei siti.
- Nessuna pausa tra le richieste, o una pausa fissa che allinea molti worker nello stesso istante.
- Retry senza backoff. Uno storm di retry dopo il primo 429 moltiplica il carico.
- Limiti condivisi. Alcuni siti contano le richieste per account, per chiave API o per cookie di sessione, non per IP.
- Endpoint pesanti. URL di ricerca o filtro spesso hanno limiti più rigidi delle pagine statiche.
Come diagnostico a 429 passo dopo passo?
- Registra il valore
Retry-Aftere i qualsiasi header di rate-limit al primo 429. - Misura la tua reale frequenza di richieste per host, non la frequenza totale.
- Verifica se il limite segue IP, cookie o chiave API: cambia una cosa alla volta.
- Leggi la documentazione API o robots.txt del sito; una riga
Crawl-delayindica il ritmo richiesto.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLCome risolvo a 429?
- Rispetta Retry-After. Aspetta almeno il tempo richiesto dal server.
- Limita la concorrenza per host, non solo globale. Scrapy ha
CONCURRENT_REQUESTS_PER_DOMAINeAUTOTHROTTLE_ENABLED. - Backoff esponenziale con jitter: 1 s, 2 s, 4 s e così via, più una frazione casuale, con un limite massimo.
- Preleva meno. Metti in cache le risposte, invia
If-Modified-SinceoIf-None-Match, e salta le pagine non modificate. - Usa l'API ufficiale quando disponibile; i suoi limiti sono di solito documentati.
import random
import time
import requests
PROXY = "http://USERNAME:[email protected]:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}
def fetch(url, attempts=5, timeout=(10, 30)):
for attempt in range(attempts):
try:
r = requests.get(url, proxies=PROXIES, timeout=timeout)
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
r = None # dropped exit, reset or timeout: a new connection gets a new exit
if r is not None and r.status_code not in RETRY_STATUSES:
return r
retry_after = r.headers.get("Retry-After", "") if r is not None else ""
if retry_after.isdigit():
wait = int(retry_after)
else:
wait = min(60, 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))Devo riprovare dopo a 429?
Sì, un 429 va ritentato, più tardi. Aspetta il ritardo Retry-After se il server lo indica; altrimenti usa backoff esponenziale con jitter e un limite massimo. Conta i 429 consecutivi per host e riduci la concorrenza di quell'host quando cresce il conteggio. La funzione Python sotto fa la parte base.
Come si applica 429 Too Many Requests a CrawlRelay?
Un 429 che arriva tramite CrawlRelay riporta gli header e il corpo del target: il limite è del sito, e il controllo della frequenza per host è tuo compito. Usa sessioni sticky quando un sito conta le richieste per sessione, così il tuo ritmo resta misurabile, e vedi la guida alla concorrenza per i numeri da cui partire.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS tramite CONNECT) e porta 7778 (SOCKS5). Formato username: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Correlato: 403 Forbidden · 503 Service Unavailable · Concurrency guide.
429 Too Many Requests: domande frequenti dagli sviluppatori
Devo ruotare gli IP per evitare errori 429?
No. Un 429 è la richiesta del sito di rallentare. Distribuire la stessa frequenza su più IP per restare sotto un limite per IP è evasione, e la maggior parte dei termini vieta questa pratica. La rotazione serve per distribuire il carico e per la localizzazione, non per superare un limite pubblicato. Abbassa la frequenza e metti in cache quello che puoi.
Quanto tempo devo aspettare dopo un 429?
Aspetta il numero di secondi indicato nell'intestazione Retry-After, o fino alla data indicata. Senza quell'intestazione, parti da uno o due secondi e raddoppia il ritardo dopo ogni nuovo 429, con un extra casuale e un limite di circa un minuto. Riprendi a frequenze inferiori, non a quelle che hanno causato il 429.
Perché ricevo 429 con poche richieste al minuto?
Il limite può essere per account, cookie o chiave API invece che per IP, o l'endpoint può essere pesante, come una pagina di ricerca. Alcuni siti impostano limiti bassi per clienti classificati come bot. Controlla gli header di risposta e la documentazione API, e chiedi accesso se ti serve di più.
Altri errori proxy in questo riferimento
Codici di stato HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Errori del browser e client
Errori di connessione e TLS
Proxy residenziali con documentazione che copre i casi di errore
Proxy residenziali CrawlRelay da 0,50 USD/GB, traffico che non scade mai.