Guide Python · 2 min de lecture

Comment faire tourner des proxies en Python (requests et aiohttp)

La rotation est la différence entre un scraper qui se fait bannir une IP et un autre qui répartit la charge sur plusieurs. Voici un rotateur fonctionnel pour les requêtes synchrones et async aiohttp, avec des vérifications de santé et un retrait automatique des sorties mortes.

Ce que la rotation résout réellement

Les sites limitent le taux et interdisent par IP. Si chaque requête provient d'une seule adresse, vous atteignez rapidement la limite et un seul bannissement stoppe tout le travail. La rotation répartit les requêtes sur un pool de sorties, de sorte que la charge par IP reste en dessous du seuil et qu'une sortie morte ou bloquée ne vous coûte qu'une nouvelle tentative, pas l'exécution. Deux conceptions couvrent presque tout : round-robin (faire défiler le pool dans l'ordre, prévisible et équitable) et random (choisir par requête, simple et sans état).

Le pool lui-même peut provenir de deux endroits. Vous pouvez lister plusieurs points de terminaison et ports s4m et faire une rotation entre eux, ou, pour des tests rapides à faible enjeu, tirer des entrées en direct de la liste publique de proxies gratuits — filtrées par pays, protocole et anonymat, bien que ces proxies tiers soient à utiliser à vos propres risques et meurent souvent. La rotation en production devrait s'appuyer sur des proxies de datacenter authentifiés de s4m (SOCKS5 sur 1080, HTTP sur 3128, USER:PASS), qui restent en ligne et sont mesurés, donc l'extension du pool est peu coûteuse. Cela s'appuie directement sur le scraping avec des requêtes.

Un rotateur pour les requêtes et aiohttp

Un pool qui utilise le round-robin, réessaie en cas d'échec et retire les sorties qui échouent constamment. Versions synchrones et asynchrones. Remplacez USER:PASS.

python
import asyncio, itertools, random
import requests, aiohttp
from aiohttp_socks import ProxyConnector  # pip install aiohttp-socks

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",
    f"http://{USER}:{PASS}@{HOST}:3128",
    # add more endpoints/ports here to widen the pool
]

# ---------- Synchronous: requests + round-robin + retirement ----------
class Rotator:
    def __init__(self, pool):
        self.alive = list(pool)
        self.fails = {p: 0 for p in pool}
        self._cycle = itertools.cycle(self.alive)

    def pick(self):
        return next(self._cycle)

    def retire(self, proxy):
        self.fails[proxy] += 1
        if self.fails[proxy] >= 3 and proxy in self.alive:
            self.alive.remove(proxy)
            self._cycle = itertools.cycle(self.alive or POOL)

def get(url, rot, retries=4):
    for _ in range(retries):
        proxy = rot.pick()
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy},
                             timeout=(5, 20))
            r.raise_for_status()
            return r
        except requests.RequestException:
            rot.retire(proxy)
    raise SystemExit("pool exhausted")

rot = Rotator(POOL)
print(get("https://api.ipify.org", rot).text)

# ---------- Async: aiohttp, one connector per proxy ----------
async def fetch(url, proxy):
    connector = ProxyConnector.from_url(proxy)
    async with aiohttp.ClientSession(connector=connector) as s:
        async with s.get(url, timeout=aiohttp.ClientTimeout(total=25)) as r:
            return await r.text()

async def main():
    tasks = [fetch("https://api.ipify.org", random.choice(POOL))
             for _ in range(5)]
    for ip in await asyncio.gather(*tasks, return_exceptions=True):
        print(ip)

asyncio.run(main())

Choix de conception qui comptent

Les réglages qui décident si la rotation aide ou ajoute simplement du changement.

Round-robin vs aléatoire

Le round-robin répartit la charge de manière uniforme et est facile à comprendre ; le random est sans état et simple. Les deux surpassent une sortie fixe unique — choisissez le round-robin lorsque la distribution uniforme est importante.

Retirer les sorties mortes

Comptez les échecs consécutifs par proxy et abandonnez une sortie après quelques échecs, afin que le pool se répare au lieu de réessayer un cadavre indéfiniment.

Vérification de santé avant utilisation

Vérifiez périodiquement un point de terminaison IP-echo à travers chaque proxy et conservez uniquement ceux qui répondent. Essentiel lorsque le pool inclut des entrées de liste gratuite volatiles.

Reculez, ne sprintez pas

La rotation n'est pas une licence pour inonder. Ajoutez des délais par hôte et un retour exponentiel afin de rester sous les limites plutôt que de les combattre sur de nombreuses IP.

Sessions persistantes et limites honnêtes

Rotation is not always what you want. Some flows — a login, a cart, a multi-step form — need the same IP for the whole session, or the site sees a user teleporting between addresses and blocks it. That is a sticky session: rotate between jobs, stay fixed within one. When a workflow needs one guaranteed-stable address, add a dedicated personal IP instead of rotating.

Soyez honnête sur le plafond. Les proxies s4m sont de centre de données, donc les faire tourner aide avec les limites de taux et même la charge mais ne déguisera pas les adresses IP de centre de données d'un système anti-bot qui bloque toute la plage. La rotation ne fait également rien concernant les empreintes de navigateur ou les modèles de requêtes. Utilisez-le comme une couche : associez-le avec des en-têtes réalistes, un ralentissement, et le respect des règles de chaque site. Pour les pièces asynchrones, vous aurez besoin de aiohttp-socks pour le support SOCKS5 ; validez les sorties avec les outils et automatisez la gestion des identifiants via l'API.

FAQ

Questions, réponses

Comment faire tourner des proxies avec des requêtes ?

Gardez une liste d'URLs de proxy et choisissez-en un par demande — round-robin ou aléatoire — en le passant comme argument proxies. Retirez une sortie après quelques échecs consécutifs afin que le pool se répare de lui-même. L'exemple ci-dessus montre un rotateur complet.

Comment faire tourner des proxies avec aiohttp ?

aiohttp définit le proxy par requête pour HTTP, mais pour SOCKS5, vous construisez un ProxyConnector (à partir d'aiohttp-socks) par proxy et créez une session avec. Répartissez les tâches sur le pool avec asyncio.gather.

Quand ne devrais-je PAS faire tourner les proxies ?

Lorsqu'un flux de travail nécessite une identité cohérente — connexions, paniers, formulaires multi-étapes. Changer d'IP en cours de session semble suspect et est bloqué. Utilisez une session collante ou une IP dédiée pour ces flux.

Les proxies de datacenter tournants éviteront-ils tous les blocages ?

Non. La rotation répartit la charge et évite les limites de taux par IP, mais les plages de centres de données peuvent toujours être signalées en gros par des systèmes anti-bot agressifs, et la rotation ne change pas votre empreinte ou comportement de navigateur.

Faites tourner à travers de vraies sorties

Élargissez votre pool avec des proxys SOCKS5 et HTTP de centre de données authentifiés sur proxy.s4m.online, facturés à l'utilisation pour un coût de mise à l'échelle faible. Ajoutez une IP dédiée pour les étapes de session persistante.

Les gens ont trouvé cette page en recherchant

Vraies phrases de recherche auxquelles cette page répond — les liens ouvrent la page qui les couvre en profondeur.