L'URL du proxy#
Chaque bibliothèque HTTP Python prend un proxy comme URL. Avec Proxy Cyber, l'URL contient vos informations d'identification et le paramètres de ciblage dans le nom d'utilisateur ; le nom d'hôte est la passerelle et le port choisit le protocole.
# Rotating: a new United States household on every new connection
http://USER-cc-us:PASS@res.proxy-cyber.com:9000
# Sticky: one Berlin household held for 30 minutes under the id "job42"
http://USER-cc-de-city-berlin-sid-job42-ttl-30m:PASS@res.proxy-cyber.com:9000
# SOCKS5 with remote DNS (socks5h), same parameters
socks5h://USER-cc-us:PASS@res.proxy-cyber.com:9001demandes#
La réutilisation des connexions et l'attribution des adresses IP sont des contrôles différents. Une session client réutilise les sockets ; seule la passerelle attribuée détermine le comportement de rotation et de session persistante. Utilisez les paramètres de session fournis avec votre service et vérifiez la sortie sur plusieurs requêtes. La fermeture d'un socket ou l'envoi de Connection: close ne garantit pas une IP différente.
import requests
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
proxies = {"http": PROXY, "https": PROXY}
# One request, one exit
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=30)
print(r.text)
# A sticky flow: same exit for every request of this session
sticky = "http://USER-cc-de-city-berlin-sid-cart42-ttl-15m:PASS@res.proxy-cyber.com:9000"
s = requests.Session()
s.proxies = {"http": sticky, "https": sticky}
s.get("https://example.com/product/1", timeout=30)
s.post("https://example.com/cart", json={"id": 1}, timeout=30)httpx#
httpx prend un seul proxy= argument (anciennes versions : proxies=). Il prend en charge HTTP/2 vers la destination via le tunnel CONNECT et fonctionne de la même manière en code asynchrone.
import httpx
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
with httpx.Client(proxy=PROXY, timeout=30) as client:
print(client.get("https://api.ipify.org").text)
# async, one sticky exit per task
import asyncio
async def fetch(sid: str, url: str) -> str:
proxy = f"http://USER-cc-us-sid-{sid}-ttl-10m:PASS@res.proxy-cyber.com:9000"
async with httpx.AsyncClient(proxy=proxy, timeout=30) as client:
return (await client.get(url)).text
asyncio.run(fetch("task1", "https://api.ipify.org"))aiohttp#
aiohttp prend le proxy par requête ou par session et parle nativement des proxys HTTP ; SOCKS5 a besoin du aiohttp-socks connecteur.
import aiohttp, asyncio
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
async def main():
async with aiohttp.ClientSession() as session:
async with session.get("https://api.ipify.org", proxy=PROXY, timeout=aiohttp.ClientTimeout(total=30)) as r:
print(await r.text())
asyncio.run(main())Rotation, maintien en vie et tentatives#
- Une nouvelle connexion TCP est une nouvelle connexion de transport, et non la preuve d'une nouvelle sortie. Le mode de rotation attribué à la passerelle décide de la manière dont cette connexion est acheminée.
- Utilisez un identifiant de session distinct pour chaque flux de travail indépendant, lorsque la passerelle attribuée le prend en charge. Confirmez la durée autorisée et les paramètres de localisation dans les détails de votre connexion. Un appareil résidentiel peut se déconnecter avant la durée demandée ; une session persistante n'est pas une garantie de la même IP pendant des jours. Pour une adresse fixe, comparez un produit statique dédié.
- Classez la réponse avant de réessayer. Un 403 peut indiquer une règle d'accès qu'une autre IP ne résoudra pas. Pour 429, respectez Retry-After et réduisez le taux de requêtes ; utilisez une interruption limitée en cas de connexion temporaire ou de pannes de serveur. Réessayez les opérations de changement d'état uniquement lorsque vous pouvez empêcher les actions en double.
- Définissez des délais d'attente selon le type de sortie : 15 s en connexion et 45 s en lecture pour le résidentiel, plus pour le mobile.
Économiser des gigaoctets#
Le trafic résidentiel est facturé au Go dans les deux sens. Demandez des réponses compressées (Accept-Encoding: gzip, br est activé par défaut dans ces bibliothèques), préférez les points de terminaison JSON au HTML et ne téléchargez jamais d'images, de polices ou de médias à moins qu'il ne s'agisse de données. Une page de 350 Ko est bon marché ; une page de 4 Mo avec des ressources ne l'est pas.
Les questions que les gens posent#
Pourquoi est-ce que je continue à recevoir la même adresse IP avec les requêtes ?
Les adresses IP répétées peuvent résulter d’un regroupement de connexions, d’une session persistante active ou du pool disponible. Comparez le mode de routage attribué et testez plusieurs requêtes avec des horodatages. Une request.Session gère les connexions et les cookies ; il ne sélectionne pas lui-même la sortie du proxy.
Ai-je besoin d’un proxy différent pour les sites HTTPS ?
Non. La même URL de proxy http:// gère les destinations HTTPS via un tunnel CONNECT ; TLS s'exécute de bout en bout entre votre code et le site.
Puis-je utiliser le même code pour les proxys mobiles ?
Oui : remplacez res.proxy-cyber.com par mob.proxy-cyber.com. Les ports, les informations d'identification et les paramètres sont identiques.