Configurer Selenium : connecter des proxies SOCKS5/HTTP à Chrome et Firefox
Ce guide explique comment connecter les proxies HTTP et SOCKS5 de Socks5Proxy avec Selenium 4 pour Chrome et Firefox, et comment utiliser l'autorisation par IP car Chrome ne prend pas en charge les mots de passe proxy dans les arguments.
Pourquoi l'authentification proxy est-elle difficile avec Selenium ?
Chrome accepte l'adresse du proxy via l'argument --proxy-server, mais ne prend pas en charge le nom d'utilisateur et le mot de passe dans cette adresse. Si vous vous connectez à un proxy nécessitant une authentification, le navigateur affiche une fenêtre de connexion, difficile à remplir avec Selenium.
La solution la plus propre est l'autorisation par IP. Enregistrez l'IPv4 du serveur ou du PC exécutant Selenium dans le tableau de bord, et le proxy acceptera les connexions de cette IP sans nom d'utilisateur ni mot de passe. Dans Chrome, il suffit d'entrer ip:port. Vous pouvez enregistrer jusqu'à 10 IP pour une utilisation sur plusieurs serveurs.
L'exemple utilise l'IP 198.51.100.23, port HTTP 8000 et port SOCKS5 1080.
pip install seleniumComment connecter un proxy HTTP à Chrome ?
Après avoir enregistré l'autorisation IP, ajoutez l'adresse avec l'argument --proxy-server dans ChromeOptions. Selenium 4.6 et supérieur utilise Selenium Manager pour télécharger automatiquement le bon chromedriver, sans installation manuelle nécessaire.
Les mêmes arguments s'appliquent également en mode headless. Pour vérifier la connexion, ouvrez une adresse de vérification d'IP et assurez-vous que l'IP affichée est celle du proxy.
from selenium import webdriver
from selenium.webdriver.common.by import By
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000") # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")
driver = webdriver.Chrome(options=opts)
try:
driver.get("https://api.ipify.org")
print(driver.find_element(By.TAG_NAME, "body").text) # should print the proxy IP
finally:
driver.quit()Comment utiliser un proxy SOCKS5 dans Chrome ?
Il suffit de mettre l'adresse socks5:// dans --proxy-server. Chrome utilise le proxy pour la résolution DNS avec SOCKS5, mais dans certains environnements, la résolution DNS locale peut persister. Bloquer la résolution locale avec --host-resolver-rules est une méthode couramment utilisée.
SOCKS5 utilise aussi l'autorisation par IP (Chrome ne prend pas en charge l'authentification SOCKS par identifiant/mot de passe).
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')
driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()Comment se connecter avec Firefox ?
Firefox spécifie le proxy via les préférences. Définissez network.proxy.type à 1 (manuel) et entrez l'adresse et le port HTTP ou SOCKS. Pour SOCKS5, définissez network.proxy.socks_version à 5 et network.proxy.socks_remote_dns à True pour que le proxy résolve les noms.
Firefox ne permet pas non plus de spécifier le mot de passe du proxy via les options de lancement, donc l'autorisation IP est la solution la plus simple.
from selenium import webdriver
opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)
driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()Comment ouvrir plusieurs navigateurs avec des IP différentes simultanément ?
Exécutez des navigateurs séparés avec différentes adresses proxy. Ce code récupère une liste ip:port via l'API et lance 3 navigateurs sur des IP distinctes. Ajustez le nombre selon la mémoire serveur disponible.
Pour les tâches qui nécessitent une utilisation prolongée du navigateur, comme une session de connexion, il est préférable de fixer une IP par navigateur et de ne pas la changer jusqu'à la fin de la tâche.
import requests
from selenium import webdriver
KEY = "YOUR_API_KEY"
lines = requests.get(
"https://socks5proxy.io/api/v1/proxies/download",
params={"format": "ip:port", "protocol": "http"},
headers={"Authorization": "Bearer " + KEY},
timeout=30,
).text.split()
drivers = []
for line in lines[:3]:
opts = webdriver.ChromeOptions()
opts.add_argument("--headless=new")
opts.add_argument("--proxy-server=http://" + line)
drivers.append(webdriver.Chrome(options=opts))
for d in drivers:
d.get("https://api.ipify.org")
print(d.page_source)
d.quit()Que faire si l'authentification par identifiant/mot de passe est obligatoire ?
Si vous ne pouvez pas utiliser l'autorisation IP, par exemple dans un environnement où l'IP sortante change fréquemment, il existe deux méthodes. La première consiste à utiliser une bibliothèque proxy intermédiaire comme selenium-wire pour injecter les informations d'authentification. La seconde consiste à configurer un proxy local sans authentification sur le même serveur, permettant à Chrome de se connecter localement tandis que le proxy local se connecte à Socks5Proxy avec le nom d'utilisateur et le mot de passe.
Les deux méthodes ajoutent un élément de configuration à gérer. Si possible, utilisez l'autorisation par IP depuis un serveur à IP fixe pour une solution plus simple et rapide.
Quels paramètres pour adapter l'environnement navigateur à un pays ?
Pour adapter Chrome au pays de l'IP, modifiez l'argument --lang et le paramètre Accept-Language pour que les pages s'ouvrent dans la langue du pays. Pour les sites où le fuseau horaire est important, vous pouvez également l'ajuster avec la commande CDP Emulation.setTimezoneOverride.
Définissez la taille de fenêtre avec --window-size, et utilisez les paramètres mobiles pour émuler un appareil. Ces configurations par pays permettent des tests cohérents à l'international.
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")
driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()Ces paramètres s'appliquent-ils à Selenium Grid ou aux navigateurs distants ?
Oui. ChromeOptions et FirefoxOptions fonctionnent également en exécution distante. En ajoutant les mêmes options à webdriver.Remote, le navigateur sur le nœud Grid se connecte via ce proxy. L'IP à enregistrer pour l'autorisation par IP est celle du nœud Grid où le navigateur est réellement exécuté, et non celle de l'ordinateur exécutant le code.
Si vous avez plusieurs nœuds, enregistrez toutes leurs adresses IP. Vous pouvez enregistrer jusqu'à 10 adresses IP. Si vos nœuds cloud changent fréquemment, il est plus pratique de leur attribuer une IP fixe pour une gestion simplifiée.
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000") # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()Que vérifier si la connexion ne fonctionne pas ?
ERR_PROXY_CONNECTION_FAILED est souvent dû à une adresse ou un port incorrect. Assurez-vous de ne pas utiliser le port SOCKS5 avec une adresse HTTP. Si ERR_TUNNEL_CONNECTION_FAILED apparaît ou si une fenêtre d'authentification s'affiche, l'IP enregistrée pour l'autorisation IP ne correspond pas à l'IP sortante. Utilisez cURL sur le serveur pour ouvrir api.ipify.org sans proxy et enregistrez l'IP obtenue.
Les IP des serveurs cloud peuvent changer au redémarrage. Utilisez des IP fixes ou mettez à jour la liste autorisée dans votre dashboard en conséquence.