Base de connaissances

Comment utiliser des proxys résidentiels dans Selenium (proxys authentifiés compris)

Selenium pose l'hôte du proxy facilement mais n'a aucun moyen intégré de passer des identifiants. Comment gérer les proxys authentifiés avec Selenium Wire, une extension, ou CDP.

Chris Collins

Chris Collins

7 août 2026 · 9 min de lecture

Selenium est l’outil d’automatisation de navigateur le plus déployé qui soit, et pour scraper une cible chargée de JavaScript il fait le travail. Mais il a une lacune de longue date qui fait trébucher presque tout le monde la première fois qu’on ajoute un proxy résidentiel : poser l’hôte du proxy est trivial, et fournir un nom d’utilisateur et un mot de passe ne l’est pas, parce que Selenium n’a aucun moyen intégré de le faire. Pointez Chrome vers un proxy authentifié et il fait surgir une boîte de dialogue de connexion 407 native que Selenium ne peut pas remplir, et votre script se fige. Voici comment passer outre, de trois façons.

Ceci va aux côtés des autres guides navigateur, proxys résidentiels avec Playwright et avec Puppeteer, qui gèrent tous deux l’auth du proxy nativement. Si vous n’avez pas besoin d’un navigateur complet, les proxys en Python avec un client HTTP simple est encore plus simple.

Tout ci-dessous utilise le gateway résidentiel de Shifter : un point de terminaison, p.shifter.io:443, avec tout le ciblage encodé dans le nom d’utilisateur. Changez l’hôte et les identifiants pour un autre fournisseur ; la forme est la même.

Le modèle du gateway en un paragraphe

Le nom d’utilisateur du proxy porte votre authentification et votre ciblage. Vous ne changez pas de point de terminaison pour changer de pays ou de session, vous changez la chaîne du nom d’utilisateur :

customer-USERNAME-country-us-sid-abc123-ttl-600

country-us cible les États-Unis, sid fixe une session sticky, ttl maintient cette IP pendant N secondes. Omettez sid/ttl et chaque nouvelle connexion tourne. Le mot de passe est constant. Tout le problème dans Selenium est de faire parvenir ce nom d’utilisateur et ce mot de passe au proxy.

Le problème central

Poser l’hôte est la moitié facile. Vous passez --proxy-server dans les options de Chrome exactement comme ailleurs :

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://p.shifter.io:443') # hote seul
driver = webdriver.Chrome(options=options)

Cela marche pour un proxy en whitelist d’IP sans identifiants. Mais le gateway est authentifié par nom d’utilisateur et mot de passe, et Chromium ne lit pas les identifiants de ce flag, donc la première navigation cale sur une invite d’auth 407 que Selenium ne peut pas écarter. Il vous faut l’une des trois façons de répondre à ce défi.

Approche 1 : Selenium Wire (la facile)

Selenium Wire étend Selenium et accepte les identifiants du proxy directement, gérant l’auth pour vous. C’est l’option la moins friction et celle vers laquelle la plupart des scrapers Python se tournent.

from seleniumwire import webdriver # pip install selenium-wire
import os
user = os.environ['SHIFTER_USER'] + '-country-us' # ciblage dans le nom d'utilisateur
pw = os.environ['SHIFTER_PASS']
seleniumwire_options = {
'proxy': {
'http': f'http://{user}:{pw}@p.shifter.io:443',
'https': f'http://{user}:{pw}@p.shifter.io:443',
'no_proxy': 'localhost,127.0.0.1',
}
}
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
driver.get('https://api.ipify.org')
print(driver.page_source) # une IP résidentielle américaine
driver.quit()

Les identifiants, y compris les flags de ciblage dans le nom d’utilisateur, vont dans la config proxy et Selenium Wire gère le 407 de façon transparente. Il vous laisse aussi changer le proxy au runtime en réassignant driver.proxy, ce qui est pratique pour tourner sans relancer Chrome.

Approche 2 : une extension d’identifiants (Selenium pur, sans librairie supplémentaire)

Si vous voulez rester sur Selenium pur, la technique classique est de charger une petite extension Chrome qui répond au défi d’auth avec vos identifiants. Vous la construisez à la volée et la passez avec add_extension.

# manifest.json declare les permissions proxy + auth; background.js fournit les creds.
background_js = """
chrome.webRequest.onAuthRequired.addListener(
() => ({ authCredentials: { username: USER, password: PASS } }),
{ urls: ['<all_urls>'] },
['blocking']
);
""".replace('USER', repr(user)).replace('PASS', repr(pw))
# zippez manifest.json + background.js, puis:
options.add_extension('proxy_auth.zip')

Cela vous garde sans dépendance et marche dans n’importe quel binding de langage de Selenium, puisque l’extension fait le travail. La réserve : le motif bloquant onAuthRequired ci-dessus est une technique Manifest V2, et Chrome retire MV2 au profit de MV3, donc sur le Chrome actuel cette approche est plus fragile qu’avant. Si vous partez de zéro, préférez Selenium Wire ou la route CDP ci-dessous.

Approche 3 : CDP dans Selenium 4

Selenium 4 expose le Chrome DevTools Protocol, et vous pouvez répondre à l’auth du proxy via le domaine Fetch en gérant Fetch.authRequired et en continuant la requête avec les identifiants. C’est natif au Selenium moderne et ne nécessite aucun paquet supplémentaire, mais c’est pénible à câbler à la main, réimplémentant essentiellement ce que Selenium Wire enveloppe déjà. Tournez-vous vers lui quand vous voulez zéro dépendance tierce et êtes à l’aise avec CDP ; sinon Selenium Wire vous épargne la peine.

Faire tourner géo et sessions

Parce que le ciblage vit dans le nom d’utilisateur, une identité différente est un nom d’utilisateur différent, et dans Selenium le proxy est posé au niveau du navigateur. Cela signifie que la rotation se fait par driver, pas par onglet. Deux motifs pratiques : avec Selenium Wire, réassignez driver.proxy au runtime pour échanger le nom d’utilisateur entre unités de travail ; avec l’approche extension ou CDP, faites tourner un driver par identité et poolez-les. Dans tous les cas, donnez à chaque unité logique de travail son propre sid et tournez entre unités, pas en milieu de session (sticky vs rotatif couvre la distinction), et mappez le travail aux identités comme le décrit le billet sur la répartition de charge.

Réutilisez le driver, et bornez la concurrence

Lancer Chrome est coûteux, un driver frais par requête paie du temps de démarrage et de la mémoire réels à chaque fois, le surcoût que le guide de latence existe pour éliminer. Lancez un driver (ou un petit pool d’entre eux) et réutilisez-le entre les requêtes. Et comme chaque driver est un navigateur complet retenant de la mémoire réelle, vous ne pouvez pas en faire tourner des milliers, gardez un pool borné et bornez le travail en vol par hôte cible pour qu’un site fragile ne soit pas martelé pendant qu’un permissif est affamé. Plus de parallélisme au-delà de la tolérance d’une cible achète des blocages et des plantages par manque de mémoire, pas du débit (comment éviter de se faire bloquer).

Le navigateur n’est que la moitié du fait de ne pas se faire bloquer

Une IP résidentielle gère la moitié réseau du fait de paraître humain, mais Selenium pilote toujours un navigateur automatisé, et les sites font le fingerprint de cela aussi, navigator.webdriver, flags d’automatisation, et particularités du headless. Une IP propre avec une bonne réputation vous garde hors de beaucoup de défis, mais elle ne déguise pas un navigateur manifestement automatisé. Gardez le user-agent et le viewport réalistes, pilotez la page à un rythme humain, et souvenez-vous que les erreurs qui déclenchent la détection s’appliquent à la couche navigateur autant qu’à la couche IP. Les deux doivent s’aligner.

Vérifiez que vous êtes bien sur le proxy

Avant de benchmarker ou de déboguer quoi que ce soit d’autre, confirmez l’IP de sortie depuis l’intérieur du navigateur :

driver.get('http://ip-api.com/json')
print(driver.find_element('tag name', 'body').text) # attendez le pays ciblé

Votre propre IP signifie que le proxy n’est pas appliqué. Un blocage sur une boîte de dialogue de connexion signifie que l’étape d’auth (Selenium Wire, extension, ou CDP) manque ou est mal configurée. Un blocage général signifie que la sortie locale est bloquée. Les trois sont couverts dans le guide de diagnostic des timeouts.

FAQ

Pourquoi Selenium se fige-t-il sur un popup de connexion de proxy ? Chromium lève une boîte de dialogue d’authentification 407 native pour un proxy authentifié, et Selenium ne peut pas interagir avec les dialogues natifs du navigateur. Vous devez répondre au défi autrement : Selenium Wire, une extension d’identifiants, ou le Fetch.authRequired de CDP. Poser --proxy-server seul ne fournit que l’hôte, pas les identifiants.

Puis-je mettre user:pass@host dans --proxy-server ? Non. Chromium ne lit pas les identifiants depuis le flag --proxy-server. Fournissez l’hôte là et fournissez le nom d’utilisateur et le mot de passe par l’une des trois approches ci-dessus. Comme le gateway encode le ciblage dans le nom d’utilisateur, le nom d’utilisateur complet (avec -country-...) est ce que vous passez comme nom d’utilisateur du proxy.

Dois-je utiliser Selenium Wire ? Non, mais c’est le chemin le plus simple en Python. Les alternatives sans dépendance sont une extension d’identifiants (marche dans n’importe quel binding de langage, bien que le motif classique MV2 soit en retrait) ou CDP dans Selenium 4 (natif mais plus de travail de câblage).

Comment faire tourner les IP dans Selenium ? Variez le nom d’utilisateur du proxy, ce qui change l’identité à travers le même gateway. Dans Selenium Wire vous pouvez réassigner driver.proxy au runtime ; sinon faites tourner un driver par identité et poolez-les. Omettez le sid dans le nom d’utilisateur pour tourner à chaque nouvelle connexion.

Selenium, Playwright, ou Puppeteer ? Playwright et Puppeteer prennent tous deux les identifiants du proxy nativement, donc ils évitent toute cette danse ; Selenium a besoin d’un des contournements d’ici. Selenium reste un bon choix si c’est ce que votre stack utilise déjà ; si vous partez de zéro et voulez une auth de proxy sans douleur, les deux autres sont plus fluides.

En résumé

Selenium plus proxys résidentiels marche bien dès que vous résolvez la seule lacune qu’il a : il prendra l’hôte du proxy dans --proxy-server, mais il a besoin d’aide pour fournir les identifiants d’un proxy authentifié. Utilisez Selenium Wire pour le moins de friction, une extension d’identifiants si vous voulez rester sans dépendance, ou CDP dans Selenium 4 pour une route native. Puis faites tourner géo et sessions en variant le nom d’utilisateur, réutilisez un driver de longue vie, bornez votre concurrence parce que chacun est un vrai navigateur, et gardez l’empreinte du navigateur aussi humaine que l’IP.

Réussissez cela et Selenium gère les cibles interactives et chargées de JavaScript que les clients HTTP simples ne peuvent pas. Pointez-le vers le gateway résidentiel, et souvenez-vous que la qualité du pool décide à quelle fréquence vous êtes défié tout court (réputation d’IP). La page tarifs propose les forfaits au Go pour le tester contre vos propres cibles.

Prêt à commencer ?

Essayez les proxies résidentiels de Shifter, 205M+ IPs, 195+ pays, à partir de $0.75/GB.

Commencer