Intégration de proxy Playwright : Navigateur, Contexte et Rotation
Playwright est le seul grand framework de navigateur où les proxys authentifiés fonctionnent simplement — les identifiants sont des configurations de premier ordre. L'avantage réside dans les contextes : un navigateur, une IP de sortie différente par tâche. Voici le schéma complet.
Playwright est le seul grand framework d'automatisation de navigateur où un proxy authentifié est un citoyen de premier ordre : le nom d'utilisateur et le mot de passe sont des champs de configuration simples, pas de hacks d'extension, pas de dialogues d'authentification, pas de bibliothèques d'encapsulation. Cela rend la configuration de base du proxy Playwright une tâche de cinq lignes en Node ou Python. Le véritable avantage se situe un niveau plus bas — les proxys par contexte permettent à un seul processus de navigateur de gérer de nombreuses sessions isolées, chacune avec sa propre IP de sortie, ce qui est l'architecture de rotation la moins chère offerte par tout framework. Ce guide couvre les deux niveaux, les pièges SOCKS5 et localhost, ce que le proxying fait à votre facture de bande passante, et où la furtivité se termine réellement.
Proxy Playwright au lancement du navigateur
Passez un objet proxy à launch() et chaque page du navigateur passe par celui-ci. Notez la forme : l'URL du serveur ne contient pas d'identifiants — ils vont dans des champs username et password séparés, ce qui permet à Playwright d'éviter le problème de la fenêtre d'authentification qui afflige Selenium et Puppeteer :
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER',
password: 'PASS',
},
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.textContent('body')); // proxy exit IP
await browser.close();
})();
L'API Python le reflète exactement :
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gate.quantumproxies.io:PORT",
"username": "USER",
"password": "PASS",
})
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body"))
browser.close()
Si vos identifiants se trouvent dans une chaîne standard http://user:pass@host:port, divisez-la avec la classe URL (new URL() en Node, urllib.parse en Python) plutôt que par manipulation de chaîne — les mots de passe avec des caractères spéciaux survivent ainsi. Une mise en garde pour les testeurs : use.proxy dans playwright.config.ts couvre les tests, mais il y a des rapports de longue date sur les paramètres de proxy au niveau de la configuration étant ignorés dans des configurations mixtes, donc pour les scripts de scraping, définissez toujours le proxy sur launch() ou directement sur le contexte.
Proxys par contexte : rotation sans nouveaux navigateurs
Un BrowserContext est un navigateur isolé dans le navigateur : cookies, stockage et cache séparés, partageant seulement le processus. Les contextes acceptent leur propre option proxy, et en créer un prend des millisecondes contre des secondes pour un lancement complet — donc le schéma de rotation est un navigateur, un contexte par tâche :
const { chromium } = require('playwright');
const PROXY = {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER',
password: 'PASS',
};
(async () => {
const browser = await chromium.launch();
const urls = ['https://example.com/a', 'https://example.com/b'];
for (const url of urls) {
const context = await browser.newContext({ proxy: PROXY });
const page = await context.newPage();
try {
await page.goto(url, { timeout: 30000 });
// ...extract...
} finally {
await context.close(); // frees cookies, cache, session
}
}
await browser.close();
})();
Pointé sur une passerelle rotative, chaque contexte sort d'une IP différente dans un pool résidentiel de plus de 90 millions sans gestion de liste — c'est ce que font les proxys rotatifs côté serveur. Lorsqu'une tâche nécessite la même IP sur plusieurs pages (connexion plus paiement), demandez une session persistante via les paramètres de nom d'utilisateur et la sortie se maintient pour la fenêtre de session. Les contextes isolent également les échecs : une sortie bannie meurt avec son contexte au lieu d'empoisonner tout le navigateur.
Le même schéma vous offre le ciblage géographique gratuitement. Parce que le proxy est une option de contexte, un navigateur peut contenir simultanément un contexte américain, un contexte allemand et un contexte japonais — chacun voyant des prix localisés, des résultats de recherche et des bannières de consentement depuis une IP de sortie locale. Pour le travail de comparaison de prix et de vérification d'annonces, cela remplace trois régions cloud par trois lignes de configuration.

SOCKS5, règles de contournement et le piège localhost
- SOCKS5 fonctionne, l'authentification SOCKS5 non. Chromium ne prend pas en charge les identifiants SOCKS, donc
server: 'socks5://...'ne se connecte qu'à des points de terminaison non authentifiés. Avec des proxys SOCKS5 authentifiés, soit passez au port HTTP du même portail, soit mettez l'IP de votre machine sur liste blanche pour qu'aucun identifiant ne soit nécessaire. - Contourner les hôtes avec
bypass: '*.internal.example.com, localhost'— le trafic vers ces hôtes va directement. Utile lorsque votre script parle également à des services internes qui ne doivent pas transiter par le proxy. - Localhost est spécial. Chromium contourne les proxys pour les adresses de boucle par défaut, donc tester contre un serveur mock local semble 'ignorer' votre proxy. C'est le navigateur, pas Playwright — testez contre un point de terminaison externe comme httpbin.org/ip à la place.
- Liste de vérification pour 'proxy ne fonctionne pas' : identifiants dans les champs (pas dans l'URL du serveur), schéma présent sur la valeur du serveur, et la sortie vérifiée en chargeant une page d'écho IP avant de blâmer le site cible.
Réduisez la bande passante avant de passer à l'échelle
Un navigateur de rendu télécharge tout — images, polices, analyses, scripts publicitaires — et via un trafic résidentiel mesuré, vous payez pour tout cela. Bloquer les types de ressources non essentielles réduit régulièrement le transfert par page de moitié ou plus, et le routage de Playwright en fait une ligne de code sur le contexte. Plus de schémas dans notre guide pour réduire les coûts de bande passante des proxys :
await context.route('**/*', (route) => {
const type = route.request().resourceType();
if (type === 'image' || type === 'font' || type === 'media') {
return route.abort();
}
return route.continue();
});
Mesurez l'effet plutôt que de le supposer : abonnez-vous aux événements de réponse du contexte, additionnez les tailles de transfert pour un échantillon de pages avec et sans la route, et vous obtenez votre véritable coût par page en Go — le nombre qui décide si un crawl d'un million de pages est une erreur d'arrondi ou une ligne budgétaire.
Limites de furtivité : ce qu'un proxy ne peut pas corriger
Soyez honnête sur le plafond. Une sortie résidentielle résout la réputation IP — le premier et plus grand filtre — mais Playwright présente toujours des indices d'automatisation au-dessus de la couche réseau : bizarreries de rendu sans tête, artefacts CDP, et surfaces d'empreintes digitales que les fournisseurs anti-bot sondent directement. Les plugins furtifs corrigent certains signaux et sont en retard sur les mises à jour des détecteurs sur d'autres ; c'est une course aux armements que vous héritez, pas un paramètre que vous activez. La division pragmatique : exécutez Playwright via des proxys résidentiels pour la longue traîne de sites normaux, et routez les domaines réellement hostiles via une Scraper API qui gère les empreintes digitales, le rendu et les réessais comme son travail principal et renvoie HTML, markdown ou JSON structuré. Votre code Playwright continue de faire ce pour quoi il est unique — les flux d'interaction — tandis que les tâches de récupération et d'analyse passent à l'API. Le même calcul s'applique à Puppeteer et Selenium ; aucun changement de framework ne résout un problème d'empreinte digitale.

Questions fréquemment posées
Comment définir un proxy dans Playwright Python ?
Passez un dictionnaire proxy à launch() : p.chromium.launch(proxy={"server": "http://host:port", "username": "USER", "password": "PASS"}). Le même dictionnaire fonctionne sur browser.new_context() pour le routage par contexte. Les identifiants vont toujours dans les champs séparés, jamais à l'intérieur de l'URL du serveur.
Playwright peut-il utiliser un proxy différent par contexte ?
Oui — passez une option proxy à chaque appel newContext(). Les contextes ne partagent rien sauf le processus du navigateur, donc deux contextes avec des proxys différents se comportent comme deux navigateurs non liés pour les sites cibles. C'est le schéma de rotation standard : un lancement, puis un nouveau contexte par tâche ou par identité.
Playwright prend-il en charge l'authentification proxy SOCKS5 ?
Non. Playwright passe SOCKS5 au navigateur, et Chromium n'a pas de mécanisme pour les identifiants SOCKS, donc les points de terminaison SOCKS5 authentifiés échouent. Utilisez le port HTTP(S) du même portail proxy avec des champs de nom d'utilisateur et de mot de passe, ou authentifiez par liste blanche IP et conservez le schéma SOCKS5.
Quel est le format correct du proxy Playwright ?
Un objet avec un champ server (scheme://host:port — http, https ou socks5) plus des champs username, password et bypass optionnels. Ne mettez pas les identifiants à l'intérieur de l'URL du serveur ; Playwright les attend séparément, et les mots de passe avec des caractères spéciaux ne survivent que dans les champs dédiés.
Pourquoi mon proxy Playwright ne fonctionne-t-il pas sur localhost ?
Chromium contourne les proxys pour les adresses de boucle par défaut, donc les requêtes vers localhost ou 127.0.0.1 vont directement et semblent ignorer votre configuration. Vérifiez le proxy contre une URL externe telle que httpbin.org/ip. Dans les configurations de test, préférez également définir le proxy au launch() plutôt que de compter sur les options de fichier de configuration.
L'histoire du proxy de Playwright est la plus propre de l'écosystème : identifiants en tant que configuration, contextes en tant qu'unité de rotation, routage en tant que valve de bande passante. Obtenez la qualité IP correcte en dessous et le framework s'efface en arrière-plan — ce qui est exactement ce que devrait faire une bonne infrastructure.