# 429 Too Many Requests quando fai scraping: cosa significa e come risolverlo

> Cosa significa HTTP 429 Too Many Requests per un scraper, come leggere Retry-After e codice Python per backoff con jitter. Rallenta; non evadere.

- URL: https://crawlrelay.com/it/docs/errors/429-too-many-requests/
- Ultimo aggiornamento: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Codice di stato HTTP (4xx, errore client): il messaggio esatto in ogni strumento, le cause probabili in ordine e la soluzione che funziona.

**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

| Attributo | Valore |
| --- | --- |
| 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 con `Retry-After: 30`
- **Scrapy:** gestito da `RetryMiddleware`, visto che 429 è nel `RETRY_HTTP_CODES` di default
- **curl:** `HTTP/2 429` seguito da `retry-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?

1. Registra il valore `Retry-After` e i qualsiasi header di rate-limit al primo 429.
2. Misura la tua reale frequenza di richieste per host, non la frequenza totale.
3. Verifica se il limite segue IP, cookie o chiave API: cambia una cosa alla volta.
4. Leggi la documentazione API o robots.txt del sito; una riga `Crawl-delay` indica il ritmo richiesto.

*Testa l'URL che fallisce con curl (porta HTTP, verbose)*

```bash
# 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:PASSWORD@gw.crawlrelay.com: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_URL
```

## Come 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_DOMAIN` e `AUTOTHROTTLE_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-Since` o `If-None-Match`, e salta le pagine non modificate.
- **Usa l'API ufficiale** quando disponibile; i suoi limiti sono di solito documentati.

*Python: riprova con Retry-After, backoff esponenziale e jitter*

```python
import random
import time

import requests

PROXY = "http://USERNAME:PASSWORD@gw.crawlrelay.com: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](https://crawlrelay.com/it/docs/concurrency/) 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](https://crawlrelay.com/it/docs/errors/403-forbidden/) · [503 Service Unavailable](https://crawlrelay.com/it/docs/errors/503-service-unavailable/) · [Concurrency guide](https://crawlrelay.com/it/docs/concurrency/).

## 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

- [401 Unauthorized vs 407](https://crawlrelay.com/it/docs/errors/401-unauthorized/)
- [403 Forbidden](https://crawlrelay.com/it/docs/errors/403-forbidden/)
- [407 Proxy Authentication Required](https://crawlrelay.com/it/docs/errors/407-proxy-authentication-required/)
- [429 Too Many Requests](https://crawlrelay.com/it/docs/errors/429-too-many-requests/)
- [502 Bad Gateway](https://crawlrelay.com/it/docs/errors/502-bad-gateway/)
- [503 Service Unavailable](https://crawlrelay.com/it/docs/errors/503-service-unavailable/)
- [504 Gateway Timeout](https://crawlrelay.com/it/docs/errors/504-gateway-timeout/)
- [Cannot connect to proxy (ProxyError)](https://crawlrelay.com/it/docs/errors/cannot-connect-to-proxy/)
- [Connection reset by peer (ECONNRESET)](https://crawlrelay.com/it/docs/errors/connection-reset/)
- [ERR_PROXY_CONNECTION_FAILED](https://crawlrelay.com/it/docs/errors/err-proxy-connection-failed/)
- [ERR_TUNNEL_CONNECTION_FAILED](https://crawlrelay.com/it/docs/errors/err-tunnel-connection-failed/)
- [Read timed out (ReadTimeout)](https://crawlrelay.com/it/docs/errors/read-timeout/)
- [SOCKS5 proxy errors](https://crawlrelay.com/it/docs/errors/socks5-proxy-errors/)
- [SSL: CERTIFICATE_VERIFY_FAILED](https://crawlrelay.com/it/docs/errors/ssl-certificate-verify-failed/)
- [SSL: WRONG_VERSION_NUMBER](https://crawlrelay.com/it/docs/errors/ssl-wrong-version-number/)

**Proxy residenziali con documentazione che copre i casi di errore** Proxy residenziali CrawlRelay da 0,50 USD/GB, traffico che non scade mai. [Vedi i prezzi](https://crawlrelay.com/it/pricing/) · [Avvio rapido](https://crawlrelay.com/it/docs/)

---

CrawlRelay: CrawlRelay è un servizio di proxy residenziali rotanti e proxy mobili 4G/5G primo per sviluppatori: traffico pay-as-you-go senza scadenza da 0,50 USD/GB, pagato in crypto, senza caricamento documenti. Senza KYC — niente documento, selfie o altri documenti. Paga in crypto.
