Réponse rapide
Que signifie 429 Too Many Requests avec un proxy ?
429 Too Many Requests signifie que le site vous limite en taux : vous avez envoyé plus de requêtes qu'il n’en accepte dans une fenêtre temporelle. La solution est d’en envoyer moins, pas de masquer plus. Avec les proxys résidentiels CrawlRelay, respectez l’en-tête Retry-After, limitez la concurrence par hôte, et appliquez un backoff exponentiel avec jitter aléatoire. Faire tourner les IPs pour dépasser une limite publiée viole la plupart des conditions d’utilisation.
429 Too Many Requests en un coup d'œil
| Erreur | 429 Too Many Requests |
|---|---|
| Type | Code d'état HTTP (4xx, erreur client) |
| Envoyé par | Le site ciblé ou sa passerelle API |
| Défini dans | RFC 6585, section 4 (Retry-After: RFC 9110, section 10.2.3) |
| Réessayer ? | Oui, après le délai Retry-After ou un backoff exponentiel |
| Vérification initiale | Lisez l'en-tête Retry-After et le nombre de requêtes par seconde par hôte |
Que signifie 429 Too Many Requests ?
La RFC 6585 a introduit le code 429 pour la limitation en taux. Le serveur peut ajouter un en-tête Retry-After, soit un nombre de secondes, soit une date HTTP, pour indiquer quand revenir. Les API ajoutent souvent leurs propres en-têtes comme X-RateLimit-Remaining.
Un 429 est la réponse la plus polie qu’un site puisse donner à un scraper. Il indique que le contenu est disponible, mais pas à votre cadence actuelle. Les sites voyant leurs 429 ignorés passent souvent aux 403, CAPTCHAs ou blocages permanents.
À quoi ressemble a 429 en Python, curl, Node.js et navigateurs ?
La même erreur s'affiche différemment selon chaque outil. Voici les messages à rechercher dans vos logs :
- Python requests / httpx :
status_code == 429, souvent avecRetry-After: 30 - Scrapy : géré par
RetryMiddleware, le 429 étant dans leRETRY_HTTP_CODESpar défaut - curl :
HTTP/2 429suivi deretry-after:dans les en-têtes de réponse - APIs : un corps JSON comme
{"error": "rate_limited"}
Quelles sont les causes de a 429 ?
Probablement en premier lieu :
- Trop de concurrence par hôte. Cinquante workers parallèles sur un même domaine ressemblent à une attaque pour la plupart des sites.
- Pas de délai entre les requêtes, ou un délai fixe qui aligne plusieurs workers au même instant.
- Reprises sans backoff. Une tempête de reprises juste après un premier 429 multiplie la charge.
- Limites partagées. Certains sites comptent les requêtes par compte, par clé API ou par cookie de session, pas par IP.
- Endpoints lourds. Les URLs de recherche et filtre ont souvent des limites plus strictes que les pages statiques.
Comment diagnostiquer a 429 étape par étape ?
- Enregistrez la valeur
Retry-Afteret tous les en-têtes de limitation lors du premier 429. - Mesurez votre vrai taux de requêtes par hôte, pas le taux global.
- Vérifiez si la limite se base sur l’IP, le cookie ou la clé API : changez un élément à la fois.
- Lisez la doc de l’API ou robots.txt ; une ligne
Crawl-delayindique la cadence demandée.
# 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_URLComment résoudre a 429 ?
- Respectez Retry-After. Attendez au moins le temps indiqué par le serveur.
- Limitez la concurrence par hôte, pas seulement globalement. Scrapy propose
CONCURRENT_REQUESTS_PER_DOMAINetAUTOTHROTTLE_ENABLED. - Backoff exponentiel avec jitter : 1 s, 2 s, 4 s, etc., plus une fraction aléatoire, plafonné.
- Réduisez la quantité. Mettez en cache, envoyez
If-Modified-SinceouIf-None-Match, et ignorez les pages inchangées. - Utilisez l’API officielle si le site en propose une ; ses limites sont généralement documentées.
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))Dois-je réessayer après a 429 ?
Oui, un 429 doit être retenté plus tard. Attendez le délai Retry-After si le serveur l’envoie ; sinon, appliquez un backoff exponentiel avec jitter et plafond. Comptez les 429 consécutifs par hôte et diminuez la concurrence de l’hôte à mesure qu’ils s’accumulent. La fonction Python ci-dessous gère la base.
Quelle est l'incidence de 429 Too Many Requests sur CrawlRelay ?
Un 429 reçu via CrawlRelay conserve les en-têtes et le corps du site cible : la limite est celle du site, et la gestion du rythme par hôte est votre responsabilité. Utilisez des sessions stables quand un site compte les requêtes par session, ainsi votre rythme reste mesurable ; consultez le guide de la concurrence pour des nombres de référence.
Passerelle : gw.crawlrelay.com, port 7777 (HTTP, HTTPS via CONNECT) et port 7778 (SOCKS5). Format du nom d'utilisateur : USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Voir aussi : 403 Forbidden · 503 Service Unavailable · Guide de la concurrence.
429 Too Many Requests : questions fréquentes des développeurs
Dois-je faire tourner les IPs pour éviter les erreurs 429 ?
Non. Un 429 est une demande du site pour ralentir. Répartir le même taux de requêtes sur plusieurs IP pour rester sous une limite par IP est une contournement, interdit par la plupart des conditions. La rotation sert à répartir la charge et gérer le lieu, pas à dépasser une limite publiée. Baissez votre taux et mettez en cache ce que vous pouvez.
Combien de temps dois-je attendre après un 429 ?
Attendez le nombre de secondes indiqué dans l’en-tête Retry-After, ou jusqu’à la date indiquée. Sans cet en-tête, commencez à 1 ou 2 secondes et doublez le délai après chaque nouveau 429, avec un supplément aléatoire et un plafond d’environ une minute. Reprenez à un rythme plus bas, pas à celui qui a causé le 429.
Pourquoi ai-je un 429 alors que je fais seulement quelques requêtes par minute ?
La limite peut être par compte, cookie ou clé API plutôt que par IP, ou l’endpoint peut être coûteux, comme une page de recherche. Certains sites imposent aussi des limites basses aux clients classés comme bots. Vérifiez les en-têtes de réponse et la doc API, et demandez l’accès au site si besoin.
Autres erreurs de proxy dans cette référence
Codes d'état HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Erreurs du navigateur et du client
Erreurs de connexion et TLS
Proxies résidentiels avec documentation couvrant les cas de défaillance
Proxies résidentiels CrawlRelay de 0,50 $US/GB, trafic sans expiration.