Meilleur proxy pour le scraping web avec Python 2026 : du vrai code
Les meilleurs proxys pour le scraping web avec Python en 2026. Des exemples de code pour requests, Scrapy et Playwright — avec des benchmarks de prestataires et des stratégies de rotation qui fonctionnent vraiment.
Réponse rapide
Pour le scraping en Python, le choix du proxy est indissociable du code : rotation, réessais et backoff, réutilisation des sessions et délais d'expiration comptent autant que le pool. Testez avec votre réel schéma de requêtes et respectez les conditions de chaque cible. Si vous avez besoin de visites de site plutôt que de données extraites, Traffic Creator les fournit sans aucun code de proxy.
L'essentiel
- Ce qui compte : la rotation, les réessais, la réutilisation des sessions et les délais d'expiration comptent autant que le pool que vous achetez.
- Comment benchmark : benchmark avec votre réel schéma de requêtes, pas avec un échantillon de pages faciles.
- Conditions : respectez les conditions de chaque cible ; un scraper qui fonctionne n'est pas automatiquement un scraper autorisé.
- Besoin de visites seulement : pour des visites de site plutôt que des données, Traffic Creator n'exige aucun code de proxy.
Trouver le bon proxy pour le scraping en Python, c'est accorder le prestataire au niveau de protection de votre cible — et savoir le configurer correctement dans le code. Un proxy parfaitement adapté au scraping de prix e-commerce échouera aussitôt contre LinkedIn.

Ce guide couvre les meilleurs prestataires de proxys pour le scraping en Python en 2026, avec des exemples de code fonctionnels pour les trois bibliothèques Python les plus courantes : requests, Scrapy et Playwright.
Configuration de proxy en Python : les bases#
Chaque bibliothèque HTTP Python accepte les proxys dans un format similaire. La structure d'URL du proxy est :
http://username:password@proxy_host:port
Pour les proxys résidentiels rotatifs (où chaque requête reçoit automatiquement une nouvelle IP), l'hôte est la passerelle rotative du prestataire. Vous ne gérez pas les IP individuelles — l'infrastructure du prestataire les fait tourner à chaque requête.
Vue d'ensemble des prestataires, par cas d'usage#
| Prestataire | Meilleur cas d'usage Python | $/Go | Palier de difficulté |
|---|---|---|---|
| DataImpulse | Scraping en volume, cibles non protégées | ~1 $ | Palier 1 |
| ProxyScrape | Mixte, non protégé/modéré | ~2–4 $ | Palier 1–2 |
| GeoNode | Scraping résidentiel en production | ~3–5 $ | Palier 2 |
| IPRoyal | Résidentiel orienté UE | ~7–10 $ | Palier 2 |
| Bright Data | Cibles entreprise + API gérée | ~10,89 $ | Palier 3 |
Exemples de code par bibliothèque#
1. La bibliothèque requests de Python
requests est la bibliothèque HTTP Python la plus répandue. La configuration du proxy tient en un unique dictionnaire transmis à chaque requête.
Configuration basique d'un proxy rotatif (exemple GeoNode)
import requests
# GeoNode rotating residential proxy
# Replace with your actual username/password from the GeoNode dashboard
PROXY_HOST = "rotating.geonode.com"
PROXY_PORT = "9000"
PROXY_USER = "YOUR_GEONODE_USERNAME"
PROXY_PASS = "YOUR_GEONODE_PASSWORD"
proxies = {
"http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
response = requests.get(
"https://httpbin.org/ip",
proxies=proxies,
headers=headers,
timeout=30,
)
print(response.json()) # shows the exit IP used
Rotation du User-Agent à chaque requête
Des User-Agents constants forment une empreinte détectable, même avec des IP résidentielles. Faites-les tourner :
import requests
import random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
]
def get_headers():
return {"User-Agent": random.choice(USER_AGENTS)}
def scrape_url(url, proxies):
try:
response = requests.get(
url,
proxies=proxies,
headers=get_headers(),
timeout=30,
)
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"Request failed: {e}")
return None
Logique de réessai pour les requêtes échouées
import requests
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def make_session_with_retry(proxies):
session = requests.Session()
session.proxies = proxies
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
return session
# Usage
session = make_session_with_retry(proxies)
response = session.get("https://example.com", timeout=30)
2. Scrapy
Scrapy est le framework de référence pour le scraping Python en production. Il gère la concurrence, les réessais et les pipelines — mais la configuration du proxy exige un middleware.
Middleware de proxy Scrapy (proxy rotatif)
Ajoutez dans votre settings.py :
# settings.py
DOWNLOADER_MIDDLEWARES = {
"scrapy.downloadermiddlewares.retry.RetryMiddleware": 90,
"myproject.middlewares.ProxyMiddleware": 100,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 110,
}
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 429]
# GeoNode credentials (set via environment variables in production)
PROXY_HOST = "rotating.geonode.com:9000"
PROXY_USER = "YOUR_GEONODE_USERNAME"
PROXY_PASS = "YOUR_GEONODE_PASSWORD"
Créez middlewares.py :
# middlewares.py
import base64
from scrapy import signals
class ProxyMiddleware:
def __init__(self, proxy_host, proxy_user, proxy_pass):
self.proxy = f"http://{proxy_host}"
credentials = f"{proxy_user}:{proxy_pass}"
self.proxy_auth = base64.b64encode(credentials.encode()).decode()
@classmethod
def from_crawler(cls, crawler):
return cls(
proxy_host=crawler.settings.get("PROXY_HOST"),
proxy_user=crawler.settings.get("PROXY_USER"),
proxy_pass=crawler.settings.get("PROXY_PASS"),
)
def process_request(self, request, spider):
request.meta["proxy"] = self.proxy
request.headers["Proxy-Authorization"] = f"Basic {self.proxy_auth}"
Araignée Scrapy avec proxy
# spiders/product_spider.py
import scrapy
class ProductSpider(scrapy.Spider):
name = "products"
start_urls = ["https://example-shop.com/products"]
custom_settings = {
"DOWNLOAD_DELAY": 1, # 1 second between requests
"RANDOMIZE_DOWNLOAD_DELAY": True, # actual delay: 0.5–1.5s
"CONCURRENT_REQUESTS_PER_DOMAIN": 5,
}
def parse(self, response):
for product in response.css(".product-card"):
yield {
"name": product.css(".product-name::text").get(),
"price": product.css(".product-price::text").get(),
"url": response.urljoin(product.css("a::attr(href)").get()),
}
next_page = response.css("a.next-page::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)
3. Playwright (cibles rendues en JavaScript)
Pour les cibles qui utilisent le rendu JavaScript — applications monopages, contenus chargés à retard, prix dynamiques — il faut un navigateur headless. Playwright s'en charge en Python.
Playwright basique avec proxy (GeoNode)
from playwright.sync_api import sync_playwright
PROXY_HOST = "rotating.geonode.com"
PROXY_PORT = "9000"
PROXY_USER = "YOUR_GEONODE_USERNAME"
PROXY_PASS = "YOUR_GEONODE_PASSWORD"
proxy_config = {
"server": f"http://{PROXY_HOST}:{PROXY_PORT}",
"username": PROXY_USER,
"password": PROXY_PASS,
}
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy=proxy_config,
)
context = browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
)
page = context.new_page()
page.goto("https://example.com", wait_until="networkidle")
content = page.content()
print(content[:500])
browser.close()
Playwright pour les cibles du palier 3 avec le Web Unlocker de Bright Data
Pour les cibles protégées au niveau entreprise, le Web Unlocker de Bright Data gère la résolution des CAPTCHA et la gestion des empreintes automatiquement. Vous envoyez une URL ; Bright Data renvoie le HTML rendu.
import requests
# Bright Data Web Unlocker endpoint
# Get your credentials from: https://get.brightdata.com/293896dumfgt
BRIGHTDATA_HOST = "brd.superproxy.io"
BRIGHTDATA_PORT = 22225
BRIGHTDATA_USER = "YOUR_BRIGHTDATA_USERNAME-zone-web_unlocker"
BRIGHTDATA_PASS = "YOUR_BRIGHTDATA_PASSWORD"
proxies = {
"http": f"http://{BRIGHTDATA_USER}:{BRIGHTDATA_PASS}@{BRIGHTDATA_HOST}:{BRIGHTDATA_PORT}",
"https": f"http://{BRIGHTDATA_USER}:{BRIGHTDATA_PASS}@{BRIGHTDATA_HOST}:{BRIGHTDATA_PORT}",
}
# Bright Data handles all anti-detection automatically
response = requests.get(
"https://www.amazon.com/dp/B08N5WRWNW",
proxies=proxies,
verify=False, # Bright Data uses custom cert
timeout=60,
)
print(response.status_code) # 200 on Amazon with Web Unlocker
Référence de configuration des prestataires#
GeoNode (recommandé pour le palier 2)
# GeoNode rotating residential proxy
# Get credentials at: https://geonode.com/?ref=22282
PROXY_HOST = "rotating.geonode.com"
PROXY_PORT = "9000" # HTTP rotating
# PROXY_PORT = "9001" # SOCKS5 rotating
# PROXY_PORT = "9002" # HTTP sticky (session-based)
# Country-specific targeting (add to username):
# PROXY_USER = "username-country-US" # US exit nodes only
# PROXY_USER = "username-country-DE" # German exit nodes only
proxies = {
"http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
}
Spécifications de GeoNode pour le scraping Python :
- Plus de 10 M d'IP résidentielles, plus de 195 pays
- 3–5 $/Go, aucun engagement minimal
- Modes de session rotative et sticky
- Ciblage par pays et par ville
→ Découvrir le plan gratuit de GeoNode — sans carte bancaire.
IPRoyal (palier 2 orienté UE)
# IPRoyal rotating residential proxy
# Get credentials at: https://iproyal.com/?r=Traffic-Creator
PROXY_HOST = "geo.iproyal.com"
PROXY_PORT = "12321"
# Country targeting:
# PROXY_USER = "username_country-DE" # Germany
# PROXY_USER = "username_country-GB" # UK
proxies = {
"http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
}
Spécifications d'IPRoyal : forte densité de nœuds européens — idéal pour les cibles de scraping spécifiques à l'UE, à 7–10 $/Go.
DataImpulse (palier économique 1–2)
# DataImpulse budget residential proxy
# Get credentials at: https://dataimpulse.com/?aff=312345
PROXY_HOST = "gw.dataimpulse.com"
PROXY_PORT = "823"
proxies = {
"http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
}
Spécifications de DataImpulse : ~0,70–1,50 $/Go — l'option résidentielle la moins chère pour un scraping non protégé à moyennement protégé.
Bright Data Web Unlocker (palier 3)
# Bright Data Web Unlocker
# Get access at: https://get.brightdata.com/293896dumfgt
proxies = {
"http": "http://YOUR_USER-zone-web_unlocker:[email protected]:22225",
"https": "http://YOUR_USER-zone-web_unlocker:[email protected]:22225",
}
# For SERP scraping with structured output:
# Use Bright Data's SERP API instead — returns structured JSON
import json
serp_response = requests.get(
"https://www.google.com/search?q=python+web+scraping",
proxies=proxies,
verify=False,
timeout=60,
)
Choisir le bon prestataire pour votre scraper Python#
Arbre de décision
Que scrapez-vous ?
Unprotected sites (no bot protection)
→ DataImpulse (~$1/GB) or ProxyScrape (~$2–4/GB)
→ requests or Scrapy, rotating IPs
Moderately protected (rate limiting, IP reputation)
→ GeoNode (~$3–5/GB) for most targets
→ IPRoyal (~$7–10/GB) for EU-specific targets
→ requests/Scrapy with rotating residential IPs
Heavily protected (Google, Amazon, LinkedIn)
→ Bright Data Web Unlocker (~$10.89/GB + $3/1k requests)
→ requests with Bright Data proxy endpoint, or their SERP API
→ For browser automation on Tier 3: Bright Data's Scraping Browser
Réglages de concurrence par prestataire
Les proxys résidentiels gèrent la concurrence différemment des datacenters. Une concurrence trop agressive brûle la bande passante sans améliorer le débit.
Réglages Scrapy recommandés par prestataire :
# GeoNode (mid-market residential)
CONCURRENT_REQUESTS = 20
CONCURRENT_REQUESTS_PER_DOMAIN = 5
DOWNLOAD_DELAY = 0.5
RANDOMIZE_DOWNLOAD_DELAY = True
# DataImpulse (budget residential — lower concurrency)
CONCURRENT_REQUESTS = 10
CONCURRENT_REQUESTS_PER_DOMAIN = 3
DOWNLOAD_DELAY = 1
RANDOMIZE_DOWNLOAD_DELAY = True
# Bright Data Web Unlocker (managed anti-detection)
# Follow Bright Data's recommended concurrency per zone
CONCURRENT_REQUESTS = 10
DOWNLOAD_DELAY = 0
Erreurs de proxy Python courantes et corrections#
ConnectionError: HTTPSConnectionPool
Cause : la connexion au proxy a échoué — hôte, port ou identifiants erronés.
Correction : testez avec requests.get("https://httpbin.org/ip", proxies=proxies) avant de lancer votre scraper. Vérifiez hôte/port/identifiants depuis votre tableau de bord prestataire.
407 Proxy Authentication Required
Cause : identifiants mal transmis ou mal formés dans l'URL du proxy.
Correction : vérifiez que le nom d'utilisateur et le mot de passe ne contiennent pas de caractères spéciaux nécessitant un encodage d'URL. Encodez avec urllib.parse.quote(password, safe='') si le mot de passe comporte des symboles.
from urllib.parse import quote
encoded_pass = quote(PROXY_PASS, safe='')
proxy_url = f"http://{PROXY_USER}:{encoded_pass}@{PROXY_HOST}:{PROXY_PORT}"
503 Service Unavailable sur les cibles protégées
Cause : la cible a détecté votre requête comme un bot malgré l'usage d'IP résidentielles. Causes fréquentes : User-Agent constant, absence d'en-tête referer, en-tête accept-language manquant, rythme de requête trop rapide.
Correction :
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
}
Si cela ne règle pas le problème sur les cibles du palier 3, passez au Web Unlocker de Bright Data.
Requêtes renvoyant des CAPTCHA au lieu du contenu
Cause : le site cible sert des défis CAPTCHA à votre IP. Se produit sur les cibles du palier 3 lorsque les IP résidentielles ne tournent pas assez vite.
Correction : soit tourner plus vite (nouvelle IP à chaque requête via le point d'accès rotatif), soit utiliser le Web Unlocker de Bright Data, qui résout les CAPTCHA automatiquement.
Tester votre configuration de proxy#
Validez toujours avant de lancer un scraping complet :
import requests
def test_proxy(proxies):
# Test 1: Check your exit IP
try:
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(f"Exit IP: {r.json()['origin']}")
except Exception as e:
print(f"Failed: {e}")
return False
# Test 2: Confirm IP is residential (not datacenter)
try:
r = requests.get("https://ipinfo.io/json", proxies=proxies, timeout=10)
data = r.json()
print(f"IP type: {data.get('org', 'unknown')}")
print(f"Country: {data.get('country', 'unknown')}")
print(f"City: {data.get('city', 'unknown')}")
except Exception as e:
print(f"IPinfo check failed: {e}")
return True
test_proxy(proxies)
Une IP résidentielle affiche une organisation d'opérateur (par exemple « AS7922 Comcast Cable Communications »), pas un ASN de datacenter (par exemple « AS14061 DigitalOcean »).
Annuaire des prestataires#
| Prestataire | Meilleur cas d'usage Python | Lien d'inscription |
|---|---|---|
| GeoNode | Scraping résidentiel en production | S'inscrire |
| IPRoyal | Résidentiel orienté UE | S'inscrire |
| DataImpulse | Économique, volume élevé, non protégé | S'inscrire |
| ProxyScrape | Mixte, palier 1/2 | S'inscrire |
| Bright Data | Cibles entreprise + API gérée | S'inscrire |
Articles connexes#
- Webshare Review 2026: The Best Free Proxy Tier? Tested and Honest
- 10 Best Residential Proxies 2026: Tested and Ranked
- Best Proxy for Web Scraping in 2026: Ranked by Target Difficulty
- Bright Data Review 2026
- IPRoyal Review 2026
- Webshare Review 2026
- 10 Best Residential Proxies 2026
- Best Proxy for Web Scraping 2026 — Ranked by Target Difficulty
- GeoNode Review 2026: Tested at Production Scale
- Best Proxy Providers 2026 — Full Comparison Hub
- Cheapest Residential Proxies 2026
Questions fréquentes#
Quel proxy convient le mieux au scraping en Python ?
Le pool importe moins que le code qui l'entoure : stratégie de rotation, réessais et backoff, réutilisation des sessions et gestion des délais d'expiration. Benchmark avec votre réel schéma de requêtes.
Comment éviter d'être bloqué ?
Espacez les requêtes, réutilisez les sessions quand la cible attend une continuité, et respectez les conditions de chaque site. Un scraper qui fonctionne n'est pas automatiquement un scraper autorisé.
Que faire si j'ai besoin de visites plutôt que de données ?
Traffic Creator fournit des visites ciblées géographiquement et visibles dans GA4, sans code de proxy à écrire ni à maintenir.
Puis-je scraper avec un proxy gratuit ?
Les listes de proxys publics gratuits conviennent aux tests basiques mais ne se prêtent pas au scraping en production. Elles sont peu fiables, lentes et bloquées par la plupart des sites. Le palier gratuit de Webshare offre 1 Go/mois de bande passante datacenter légitime — le meilleur point de départ gratuit.
Quelle est la différence entre sessions rotatives et sessions sticky en Python ?
Une session rotative vous donne une nouvelle IP à chaque requête — idéal pour scraper le même domaine à haute fréquence. Une session sticky conserve la même IP pendant une durée configurable — idéal quand le site cible utilise des cookies de session (e-commerce avec état du panier, scraping connecté). Chez GeoNode et IPRoyal, on choisit le mode via le port du proxy ou un suffixe du nom d'utilisateur.
Faut-il Playwright ou puis-je utiliser requests ?
Utilisez requests ou Scrapy pour les cibles rendues côté serveur (le HTML se trouve dans la réponse initiale). Utilisez Playwright ou Selenium quand le contenu recherché est chargé via JavaScript après le chargement de la page — vous verrez des conteneurs vides ou des espaces réservés dans la réponse requests si le rendu JavaScript est nécessaire.
Quelle est la bibliothèque de proxy Python la plus rapide pour le scraping à haut volume ?
aiohttp avec async/await est plus rapide que requests synchrone pour le scraping à forte concurrence. Scrapy gère l'asynchrone en interne. Pour la plupart des scrapers de production, Scrapy avec le bon réglage CONCURRENT_REQUESTS l'emporte sur des implémentations personnalisées de aiohttp en termes de compromis vitesse de développement/performances.
Une question sur cet article ?
Une erreur ou une offre qui a changé ? Envoyez-nous la source, nous la vérifions et corrigeons l'article.