Sans KYC — pas d’ID, pas de selfie, pas de documents. Payer en crypto : BTC, USDT, USDC, ETH, SOL, LTC
Langue: Français
Commencez

Docs · Selenium 4 · Python

Selenium avec un proxy authentifié : un forwarder local qui fonctionne

Le paramètre proxy de Chrome ne prévoit pas de mot de passe. Un petit forwarder local sur 127.0.0.1 ajoute les identifiants, ainsi Selenium ne voit qu’un proxy local ouvert.

Dernière mise à jour: · 4 min de lecture

Réponse rapide

Comment utiliser un proxy avec nom d’utilisateur et mot de passe dans Selenium ?

Lancez un petit forwarder local qui ajoute l’en-tête Proxy-Authorization, et configurez Chrome pour l’utiliser avec --proxy-server=http://127.0.0.1:8899. Chrome ignore les identifiants dans ce paramètre, et Selenium n’a pas d’option portable pour les mots de passe proxy. Les proxies résidentiels CrawlRelay fonctionnent ainsi sur gw.crawlrelay.com:7777, depuis 0,50 $US/GB. Paiement en crypto, sans KYC.

Installation rapide de Selenium

Pourquoi un forwarderLe paramètre --proxy-server de Chrome n’accepte ni nom d’utilisateur ni mot de passe
ForwarderÉcoute sur 127.0.0.1:8899, ajoute Proxy-Authorization, relaie vers gw.crawlrelay.com:7777
Option Chrome--proxy-server=http://127.0.0.1:8899
RotationChaque nouveau tunnel CONNECT crée une connexion nouvelle, donc généralement une nouvelle sortie ; ajoutez un ID de session pour une IP unique
Alternative plus simplePlaywright prend directement le nom d'utilisateur et le mot de passe

Comment fonctionne le proxy local ?

Il accepte la requête proxy du navigateur, insère un en-tête avec vos identifiants, puis copie les données dans les deux sens. Pour un site HTTPS, le navigateur envoie CONNECT host:443, la passerelle répond 200 Connection established, et TLS s’exécute de bout en bout entre Chrome et le site. Le proxy local ne voit jamais le contenu de la page en clair.

Cette version minimale gère les sites HTTPS, où chaque connexion porte un tunnel CONNECT. Cela couvre presque tous les sites web aujourd’hui. Gardez-le lié à 127.0.0.1 pour qu’aucune autre machine ne puisse utiliser vos identifiants.

forwarder.py (Python 3.8+, uniquement bibliothèque standard)
import asyncio
import base64
import os

UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())


async def pipe(reader, writer):
    try:
        while True:
            data = await reader.read(65536)
            if not data:
                break
            writer.write(data)
            await writer.drain()
    except ConnectionError:
        pass
    finally:
        writer.close()


async def handle(client_reader, client_writer):
    try:
        head = await client_reader.readuntil(b"\r\n\r\n")  # request line and headers from the browser
    except asyncio.IncompleteReadError:
        client_writer.close()
        return
    lines = head.split(b"\r\n")
    lines.insert(1, AUTH)  # add the credentials right after the request line
    up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
    up_writer.write(b"\r\n".join(lines))
    await up_writer.drain()
    await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))


async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 8899)
    async with server:
        await server.serve_forever()


if __name__ == "__main__":
    asyncio.run(main())

Comment configurer Selenium pour utiliser le proxy local ?

Démarrez forwarder.py dans un terminal, puis lancez votre script Selenium avec l’adresse proxy locale. Selenium Manager, intégré à Selenium 4.6 et versions supérieures, télécharge automatiquement un ChromeDriver compatible, donc rien d’autre à installer.

selenium_example.py
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899")  # the local forwarder
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
try:
    driver.set_page_load_timeout(60)
    driver.get("https://api.ipify.org")
    print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

Comment obtenir une IP par session Selenium, ou une IP nouvelle par page ?

Le proxy local envoie l’identifiant que vous lui donnez, donc le comportement de la session dépend de cet identifiant :

  • Rotation par connexion : omettez la partie session (USERNAME-country-us). Chrome ouvre plusieurs connexions par page, donc une page peut charger via plusieurs sorties.
  • Une IP par session Selenium : définissez CRAWLRELAY_USER à USERNAME-country-us-session-run42-ttl-30 avant de démarrer le proxy local. Chaque connexion utilise alors la même IP pendant 30 minutes maximum ; l’IP peut changer plus tôt.
  • Plusieurs sessions en parallèle : lancez un proxy local par session sur des ports locaux différents, par exemple 8899 et 8900, et donnez à chaque WebDriver son port dédié.

Qu’en est-il de selenium-wire ou des extensions navigateur ?

selenium-wire, un package populaire qui ajoutait l’authentification proxy en interceptant le trafic, a été archivé par son auteur en janvier 2024 et ne reçoit plus de mises à jour. Une extension navigateur répondant à la demande d’authentification proxy fonctionne aussi, mais doit être empaquetée et chargée dans chaque profil. Le proxy local ci-dessus est sans dépendances et marche avec n’importe quel navigateur piloté par Selenium. Pour les nouveaux projets, Playwright est encore plus simple : il prend directement le nom d’utilisateur et le mot de passe du proxy.

Selenium et proxies : questions

Pourquoi Chrome affiche-t-il une fenêtre de connexion avec mon proxy dans Selenium ?

Parce que le proxy demande des identifiants et que Chrome n’en avait pas : son option --proxy-server ne prend qu’un hôte et un port. En mode headless, le même problème apparaît sous ERR_TUNNEL_CONNECTION_FAILED. Utilisez un proxy local qui ajoute les identifiants, ou passez à Playwright, qui accepte un nom d’utilisateur et un mot de passe.

Le proxy local ralentit-il mon scraping ?

Pas vraiment. Il copie les données entre deux sockets locales et une distante, sans rien déchiffrer. Le temps de chargement d’une page dépend de la sortie proxy résidentiel et du site cible, pas du proxy local qui tourne sur la même machine.

Puis-je utiliser Firefox à la place de Chrome avec Selenium ?

Oui. Configurez les préférences proxy de Firefox via FirefoxOptions : network.proxy.type à 1, et network.proxy.http et network.proxy.ssl à 127.0.0.1 avec le port 8899. Gardez le proxy local devant : Firefox demande les identifiants proxy dans une boîte de dialogue que Selenium ne peut pas remplir de façon fiable non plus.

Mon mot de passe est-il sécurisé dans le proxy local ?

Il reste sur votre machine tant que le proxy local écoute sur 127.0.0.1, comme dans l’exemple. Lisez-le depuis des variables d’environnement, ne le commettez jamais dans un dépôt, et utilisez un sous-utilisateur dédié avec un plafond de trafic pour chaque scraper afin qu’un mot de passe divulgué ne puisse pas épuiser tout votre forfait.

Comment utiliser une sortie proxy résidentiel avec Selenium

1,50 $US pour 1 GB en test, 0,50 $US/GB à partir de 50 GB.

À partir de 0,50 $US/GB · sans KYC

Commencez