Scarnox · Blog

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 :

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 :

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

Prochaines étapes

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.