Proxys rotatifs pour le scraping : mise en place et pièges
Un proxy rotatif change l'adresse IP d'où part votre trafic, soit à chaque requête, soit après un intervalle défini. C'est l'un des outils les plus courants du web scraping, et l'un des plus mal utilisés. Trop peu de rotation, et une seule adresse se fait limiter en débit. Trop de rotation, et le trafic ne ressemble en rien à celui d'un visiteur. Ce guide explique les deux modèles de rotation, montre une configuration Python fonctionnelle avec des nouvelles tentatives pour les proxys morts, et explique comment un champ proxy s'intègre à la résolution de captchas.
Rotation contre sessions persistantes
Un service de proxys rotatifs distribue ses adresses de deux façons :
- Rotation par requête. Chaque requête reçoit une nouvelle adresse de sortie. Cela convient aux gros crawls de nombreuses pages sans lien entre elles, où aucune page n'a besoin de la précédente.
- Sessions persistantes. Une même adresse est conservée pendant un temps défini, souvent quelques minutes, ou jusqu'à ce que vous la libériez. Cela convient à tout ce qui a un état : une connexion, un panier d'achat, une liste paginée où les cookies comptent.
Un vrai visiteur garde une même adresse pendant toute sa visite. Les sessions persistantes reproduisent ce comportement, elles sont donc généralement le meilleur choix par défaut lorsqu'un site utilise des cookies ou des sessions. Utilisez la rotation par requête pour un crawl sans état.
Un pool rotatif basique en Python
L'exemple ci-dessous gère un pool d'URL de proxys, les parcourt en rotation, et passe au suivant lorsqu'un proxy échoue. Gardez les identifiants dans des variables d'environnement, jamais dans le code source.
import itertools
import os
import requests
# Les URL des proxys viennent de l'environnement, par exemple :
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # échec de l'authentification au proxy
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # proxy mort ou lent : essayer le suivant
raise RuntimeError(f"all attempts failed for {url}: {last_error}")
Deux détails comptent ici. D'abord, un proxy mort doit être retenté sur une autre adresse, et non sur la même. Ensuite, une requête qui échoue avec une erreur d'authentification doit s'arrêter et être signalée, plutôt que d'épuiser tout le pool.
Suivre la santé des proxys
Un simple round robin continue d'envoyer du trafic vers un proxy qui a commencé à échouer. Suivez un score simple pour chaque adresse : comptez les échecs récents, et retirez une adresse du pool pendant une période de repos dès qu'elle dépasse un seuil. Réintégrez-la plus tard et surveillez-la à nouveau. Votre scraper consacre alors ses requêtes à la partie saine du pool.
Journalisez le proxy utilisé avec chaque résultat. Lorsqu'un site commence à renvoyer des blocages, vous voudrez savoir si une seule adresse, une seule région ou l'ensemble du pool en est responsable.
Rythmer le pool
La rotation répartit la charge entre plusieurs adresses, mais chaque adresse a toujours sa propre limite de débit. Fixez un délai par adresse, ainsi qu'un plafond global du nombre de requêtes par seconde sur l'ensemble du pool. La rotation n'est pas une autorisation d'envoyer plus de trafic. C'est un moyen de maintenir le trafic provenant d'une adresse dans des limites raisonnables.
Erreurs fréquentes
La plupart des problèmes de rotation viennent de quelques mauvaises habitudes. Changer d'adresse au milieu d'une connexion ou d'un processus de paiement casse la session et rend le site méfiant. Une réponse 429 est une limitation de débit imposée par le site, et non un proxy défaillant ; changer d'adresse et réessayer tout de suite ne fait qu'étendre le problème. Changer d'adresse à chaque requête tout en conservant les mêmes cookies est aussi incohérent, car les cookies ont été émis pour un autre visiteur. Enfin, un pool qui n'est jamais vérifié se remplit silencieusement d'adresses mortes, et votre taux d'erreur grimpe sans cause évidente. Vérifiez le pool selon un calendrier et retirez ce qui ne fonctionne plus.
Proxys et résolution de captchas
Certaines tâches de captcha peuvent utiliser le proxy de votre scraper. Vous le transmettez dans le champ facultatif proxy, sous la forme http://user:pass@host:port, et la résolution se fait depuis le même chemin réseau que votre requête de page. Les tâches sans proxy n'utilisent pas ce champ. Le choix dépend de savoir si le site lie le captcha à l'adresse réseau, et ce compromis est expliqué dans résolution de captcha avec ou sans proxy.
Deux points pratiques :
- Utilisez le même proxy pour la requête de page et pour la résolution du captcha lorsque le site vérifie l'adresse. Mélanger les adresses peut faire échouer le jeton.
- Les jetons expirent rapidement. Demandez le jeton juste avant d'envoyer le formulaire, pas longtemps avant. Voir expiration du jeton de captcha.
Le type de captcha actuellement disponible chez Scarnox est PopularCaptcha. Le guide Python PopularCaptcha montre la requête et la manière de soumettre le jeton renvoyé.
Choisir vos proxys
Le type d'adresse que vous faites tourner compte autant que la rotation elle-même. Les adresses de datacenter sont rapides et peu coûteuses par requête, mais souvent mal notées. Les adresses résidentielles sont mieux notées et plus lentes. Le guide proxys résidentiels ou de datacenter les compare en détail, et ses conseils s'appliquent au pool que vous construisez ici.
Scraper de manière responsable
- Lisez le
robots.txtet les conditions d'utilisation des sites que vous scrapez. - Utilisez les proxys pour répartir une charge légitime, et non pour contourner une restriction mise en place par le propriétaire.
- N'utilisez que des services de proxys dont les adresses sont obtenues avec consentement. Faire transiter le trafic par des appareils appartenant à des personnes qui n'ont pas accepté n'est pas acceptable.
- Gardez les identifiants hors du code et des journaux.
Prochaines étapes
- Proxys résidentiels ou de datacenter
- Scraper sans se faire bloquer
- Résolution de captcha avec ou sans proxy
- Nouvelles tentatives et gestion des erreurs en production
Commencez avec un crédit d'essai gratuit, sans carte bancaire : créez un compte et testez le flux PopularCaptcha avec votre propre proxy. Pour les tarifs actuels, consultez la page tarifs.