Playwright ist eines der leistungsstärksten Werkzeuge zur Automatisierung von Browsern, Headless-Tests und Datenparsing. Aber ohne richtig konfigurierte Proxys wird Ihr Skript schnell eine IP-Sperre erhalten: Websites haben gelernt, automatisierte Anfragen zu erkennen und zu blockieren. In diesem Leitfaden werden wir alle Möglichkeiten zur Verbindung von Proxys in Playwright durchgehen – von der grundlegenden Konfiguration bis zur IP-Rotation und der Umgehung von Cloudflare.
Warum Proxys in Playwright und wann man nicht darauf verzichten kann
Playwright startet einen echten Browser (Chromium, Firefox oder WebKit) im Hintergrund – das ist Headless. Aus Sicht der Website sehen Sie aus wie ein normaler Benutzer, aber nur bis zu einem bestimmten Punkt. Sobald von einer IP aus Hunderte von Anfragen pro Stunde gesendet werden, reagieren die Schutzalgorithmen sofort: CAPTCHA, temporäre Sperre, vollständige Sperre.
Hier sind konkrete Szenarien, in denen Proxys unerlässlich sind:
- Datenparsing von Marktplätzen – Wildberries, Ozon, Avito, Yandex.Market blockieren Skripte bereits nach 50–100 Anfragen von einer IP.
- Überwachung von Wettbewerberpreisen – Wenn Sie alle 15 Minuten eine Überprüfung durchführen, werden Sie ohne IP-Wechsel innerhalb weniger Stunden gesperrt.
- Geolokationstests – Sie müssen überprüfen, wie die Website für Benutzer aus Deutschland, den USA oder Kasachstan aussieht.
- Formularausfüllung und Kontoerstellung – Plattformen binden Konten an IPs und blockieren massenhafte Registrierungen.
- SEO-Überwachung – Das Sammeln von Positionen aus Google und Yandex erfordert ständigen IP-Wechsel, sonst zeigt die Suchmaschine CAPTCHA an.
- A/B-Funktionstests – Einige Funktionen sind nur für Benutzer aus bestimmten Ländern oder Regionen verfügbar.
Es ist wichtig zu verstehen: Playwright macht Sie nicht anonym. Ohne Proxys gehen alle Anfragen von Ihrer echten IP-Adresse aus. Das Hinzufügen eines Proxys ist der erste und wichtigste Schritt zu einem stabilen Betrieb jedes automatisierten Skripts.
💡 Wichtig zu wissen
Playwright unterstützt Proxys auf der Ebene des gesamten Browsers, eines einzelnen Kontexts (BrowserContext) und sogar einer einzelnen Seite. Dies bietet Flexibilität: Verschiedene Seiten können gleichzeitig über verschiedene IPs arbeiten.
Welchen Proxy-Typ für Headless-Automatisierung wählen
Nicht alle Proxys sind gleich gut für Playwright geeignet. Die Wahl hängt von der Aufgabe ab: Was parsen Sie, wie aggressiv ist der Schutz der Website und welches Volumen an Anfragen planen Sie.
| Proxy-Typ | Vertrauensniveau | Geschwindigkeit | Geeignet für |
|---|---|---|---|
| Rechenzentrum | Niedrig | Sehr hoch | Parsing ohne strengen Schutz, Tests |
| Residential | Hoch | Mittel | Websites mit Cloudflare, Marktplätze, soziale Netzwerke |
| Mobile | Maximal | Mittel | Facebook, TikTok, Instagram, strenge Anti-Bots |
| SOCKS5 | Hängt von der Quelle ab | Hoch | Universelles Protokoll, wird von Playwright unterstützt |
Für die meisten Parsing-Aufgaben ist die optimale Wahl Residential-Proxys mit Rotation. Sie haben echte IPs von Haushaltsnutzern, daher erkennen Websites sie nicht als Rechenzentrum und blockieren sie nicht automatisch. Für Websites mit aggressivem Schutz (Cloudflare Bot Management, Akamai) ist es besser, mobile Proxys zu verwenden – deren IPs gehören Mobilfunkanbietern, was maximales Vertrauen erweckt.
Playwright unterstützt die Protokolle http, https und socks5. Wichtig: SOCKS5 unterstützt in einigen Versionen keine Authentifizierung über username:password direkt – mehr dazu im Abschnitt über Fehler.
Grundlegende Proxy-Einrichtung in Playwright (JavaScript und Python)
Playwright ermöglicht es, Proxys beim Start des Browsers über den Parameter proxy anzugeben. Dies ist der einfachste Weg – alle Anfragen des Browsers werden über den angegebenen Proxy-Server geleitet.
JavaScript / Node.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://proxy.example.com:8080'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
const content = await page.textContent('body');
console.log(content); // zeigt die IP des Proxy-Servers an
await browser.close();
})();
Python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://proxy.example.com:8080"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body")) # zeigt die IP des Proxys an
browser.close()
Für SOCKS5 ändern Sie einfach das Schema in der Serveradresse:
# Python – SOCKS5 Proxy
browser = p.chromium.launch(
proxy={
"server": "socks5://proxy.example.com:1080"
}
)
Um schnell zu überprüfen, ob der Proxy funktioniert, öffnen Sie https://httpbin.org/ip oder https://api.ipify.org – die Antwort sollte die IP des Proxy-Servers und nicht Ihre echte IP sein.
Proxy mit Authentifizierung per Benutzername und Passwort
Die meisten kommerziellen Proxy-Anbieter verwenden die Authentifizierung per Benutzername und Passwort – das ist gängige Praxis. Playwright unterstützt dies über die Felder username und password im Proxy-Objekt.
JavaScript
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyprovider.com:7777',
username: 'your_login',
password: 'your_password'
}
});
Python
browser = p.chromium.launch(
proxy={
"server": "http://gate.proxyprovider.com:7777",
"username": "your_login",
"password": "your_password"
}
)
Sie können auch Benutzername und Passwort direkt in die URL des Proxy-Servers einfügen – das ist praktisch, wenn Sie die Zeichenfolge dynamisch erstellen:
# Authentifizierung in der URL (Python)
proxy_url = f"http://{login}:{password}@gate.proxyprovider.com:7777"
browser = p.chromium.launch(
proxy={"server": proxy_url}
)
⚠️ Achtung
Speichern Sie Benutzername und Passwort des Proxys nicht direkt im Code! Verwenden Sie Umgebungsvariablen (os.environ in Python oder process.env in Node.js) oder eine .env-Datei mit der dotenv-Bibliothek.
Sichere Speicherung über .env (Python)
import os
from dotenv import load_dotenv
from playwright.sync_api import sync_playwright
load_dotenv()
PROXY_SERVER = os.getenv("PROXY_SERVER")
PROXY_LOGIN = os.getenv("PROXY_LOGIN")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": PROXY_SERVER,
"username": PROXY_LOGIN,
"password": PROXY_PASSWORD
}
)
# ...
Proxy-Rotation: IP-Wechsel für jede Anfrage
Ein Proxy allein schützt nicht vor einer Sperre bei hohem Anfragevolumen. Für ernsthaftes Parsing ist eine IP-Rotation erforderlich – automatischer Wechsel des Proxy-Servers in bestimmten Intervallen oder für jede neue Anfrage.
Es gibt zwei Ansätze zur Rotation in Playwright:
Ansatz 1: Rotierender Proxy-Endpunkt
Die meisten Anbieter von Residential-Proxys stellen eine einzige Gateway-Adresse zur Verfügung, die bei jeder Verbindung automatisch die IP wechselt. Sie müssen keine Rotationslogik schreiben – sie ist auf der Seite des Anbieters integriert.
# Ein Endpunkt – neue IP bei jeder Verbindung des Browsers
browser = p.chromium.launch(
proxy={
"server": "http://rotating.proxyprovider.com:8888",
"username": "your_login",
"password": "your_password"
}
)
Ansatz 2: Manuelle Rotation über eine Liste von Proxys
Wenn Sie eine Liste statischer Proxys haben, können Sie die Rotation manuell implementieren – indem Sie für jede Iteration einen neuen Browser oder Kontext erstellen:
import random
from playwright.sync_api import sync_playwright
PROXY_LIST = [
{"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy3.example.com:8080", "username": "user", "password": "pass"},
]
URLS_TO_SCRAPE = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3",
]
with sync_playwright() as p:
for url in URLS_TO_SCRAPE:
proxy = random.choice(PROXY_LIST) # zufälliger Proxy
browser = p.chromium.launch(proxy=proxy)
page = browser.new_page()
page.goto(url)
# ... Daten parsen ...
browser.close() # Browser schließen, IP wechseln
Ansatz 3: Rotation über BrowserContext (ohne den Browser neu zu starten)
with sync_playwright() as p:
browser = p.chromium.launch() # Browser ohne Proxy
for i, url in enumerate(URLS_TO_SCRAPE):
proxy = PROXY_LIST[i % len(PROXY_LIST)] # im Kreis
# Neuer Kontext mit neuem Proxy – schneller als den Browser neu zu starten
context = browser.new_context(proxy=proxy)
page = context.new_page()
page.goto(url)
# ... Parsing ...
context.close() # Kontext schließen, nicht den Browser
browser.close()
Der dritte Ansatz ist der leistungsfähigste für massives Parsing. Das Neustarten des Browsers dauert 2–4 Sekunden, während das Erstellen eines neuen Kontexts weniger als 100 Millisekunden dauert.
Proxys auf Kontext- und Seitenebene
Playwright unterstützt eine flexible Architektur: Ein Browser kann mehrere isolierte Kontexte haben, jeder mit seinem eigenen Proxy. Dies ermöglicht es, parallel mit mehreren IPs innerhalb eines Prozesses zu arbeiten.
Mehrere Kontexte mit unterschiedlichen Proxys (paralleles Parsing)
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Kontext 1 – Proxy aus Deutschland
const context_de = await browser.newContext({
proxy: {
server: 'http://de-proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
// Kontext 2 – Proxy aus den USA
const context_us = await browser.newContext({
proxy: {
server: 'http://us-proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
const page_de = await context_de.newPage();
const page_us = await context_us.newPage();
// Paralleler Start
await Promise.all([
page_de.goto('https://example.com'),
page_us.goto('https://example.com')
]);
// Beide Seiten sehen unterschiedliche IPs
console.log('DE IP:', await page_de.textContent('body'));
console.log('US IP:', await page_us.textContent('body'));
await browser.close();
})();
Dieser Ansatz eignet sich hervorragend für Geolokationstests: Sie überprüfen gleichzeitig, wie die Website für Benutzer aus verschiedenen Ländern angezeigt wird, ohne mehrere Browserinstanzen zu starten.
💡 Leistungstipp
Für maximale Parallelität verwenden Sie asyncio in Python oder Promise.all in Node.js. Ein Browser kann 10–20 parallele Kontexte ohne signifikante Belastung des Speichers halten.
Umgehung von Anti-Bot-Schutz: Cloudflare, Akamai, DataDome
Proxys sind nur ein Teil der Lösung. Moderne Anti-Bot-Systeme analysieren gleichzeitig Dutzende von Signalen: Browser-Fingerabdruck, Mausverhalten, Geschwindigkeit beim Ausfüllen von Formularen, HTTP-Header und vieles mehr. Selbst mit einem guten Proxy können Sie gesperrt werden, wenn Sie diese Faktoren nicht berücksichtigen.
1. Tarnung des Headless-Modus
Playwright im Headless-Modus hat charakteristische Merkmale, die leicht erkannt werden können: spezifische Werte von navigator.webdriver, keine Plugins, nicht standardmäßige Bildschirmgrößen. Verwenden Sie die Bibliothek playwright-stealth zur Tarnung:
# Python: Installation
# pip install playwright-stealth
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://residential.proxyprovider.com:8888",
"username": "user",
"password": "pass"
}
)
page = browser.new_page()
stealth_sync(page) # Tarnung anwenden
page.goto("https://bot.sannysoft.com") # Test zur Bot-Erkennung
browser.close()
2. Realistischer User-Agent und Viewport
context = browser.new_context(
proxy={
"server": "http://proxy.example.com:8080",
"username": "user",
"password": "pass"
},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="de-DE",
timezone_id="Europe/Berlin" # muss mit der Geolokation des Proxys übereinstimmen!
)
3. Nachahmung menschlichen Verhaltens
import time
import random
# Zufällige Verzögerungen zwischen Aktionen
def human_delay(min_ms=500, max_ms=2000):
time.sleep(random.randint(min_ms, max_ms) / 1000)
page.goto("https://example.com")
human_delay()
# Sanfter Scrollen statt sofortigem
page.evaluate("window.scrollBy({top: 500, behavior: 'smooth'})")
human_delay(300, 800)
# Mausbewegung vor dem Klicken
page.mouse.move(100, 200)
human_delay(100, 300)
page.mouse.move(300, 400)
human_delay(100, 200)
page.click("button#submit")
4. Übereinstimmung der Zeitzone mit der Geolokation des Proxys
Dies wird oft ignoriert, aber Anti-Bot-Systeme überprüfen die Übereinstimmung: Wenn Ihr Proxy aus Moskau stammt und der Browser die Zeitzone UTC-8 (Los Angeles) anzeigt – ist das ein rotes Signal. Stellen Sie immer timezone_id gemäß der Geolokation des verwendeten Proxys ein.
Typische Fehler und wie man sie behebt
Bei der Arbeit mit Proxys in Playwright stoßen Entwickler regelmäßig auf dieselben Probleme. Lassen Sie uns jedes Problem mit einer konkreten Lösung durchgehen.
Fehler 1: ERR_PROXY_CONNECTION_FAILED
Ursache: Falsche Adresse oder Port des Proxys, Proxy nicht verfügbar, falsche Anmeldeinformationen.
Lösung: Überprüfen Sie die Verfügbarkeit des Proxys über curl, bevor Sie Playwright starten:
# Überprüfung des Proxys über curl
curl -x http://user:[email protected]:8080 https://api.ipify.org
Fehler 2: SOCKS5 akzeptiert keine Authentifizierung
Ursache: Playwright (Chromium) hat eine eingeschränkte Unterstützung für SOCKS5 mit Authentifizierung über username/password.
Lösung: Verwenden Sie HTTP-Proxys mit Authentifizierung oder richten Sie einen lokalen SOCKS5-Tunnel über ssh -D ohne Passwort ein.
Fehler 3: Proxy funktioniert, aber die Website blockiert trotzdem
Ursache: Es werden Rechenzentrums-Proxys verwendet, die auf schwarzen Listen stehen; der Headless-Modus ist nicht maskiert; zu hohe Anfragefrequenz.
Lösung: Wechseln Sie zu Residential- oder mobilen Proxys, fügen Sie playwright-stealth hinzu, erhöhen Sie die Verzögerungen zwischen den Anfragen.
Fehler 4: Leckage der echten IP (DNS-Leck)
Ursache: DNS-Anfragen können den Proxy umgehen.
Lösung: Playwright leitet standardmäßig DNS über den Proxy, wenn ein HTTP-Proxy verwendet wird. Aber zur Überprüfung verwenden Sie https://dnsleaktest.com im Headless-Browser.
Fehler 5: Langsame Arbeit mit Proxys
Ursache: Residential-Proxys sind langsamer als Rechenzentrums-Proxys; große Entfernung zum Proxy-Server.
Lösung: Wählen Sie Proxys in geografisch nahen Standorten. Für Aufgaben ohne strenge Anforderungen an die Anonymität verwenden Sie Rechenzentrums-Proxys – sie sind erheblich schneller.
| Fehler | Schnelle Lösung |
|---|---|
| ERR_PROXY_CONNECTION_FAILED | Überprüfen Sie curl, Benutzername/Passwort, Verfügbarkeit des Ports |
| 407 Proxy Auth Required | Fügen Sie Benutzername und Passwort zur Proxy-Konfiguration hinzu |
| Website zeigt CAPTCHA an | Wechseln Sie den Proxy-Typ zu Residential, fügen Sie Stealth hinzu |
| IP ändert sich nicht bei Rotation | Schließen Sie den Kontext/Browser zwischen den Anfragen |
| Verbindungszeitüberschreitung | Erhöhen Sie den Timeout in goto(), wählen Sie einen näheren Proxy |
Fazit und Empfehlungen
Die Einrichtung von Proxys in Playwright ist keine einmalige Aufgabe, sondern Teil der Architektur Ihres Automatisierungswerkzeugs. Der richtig gewählte Proxy-Typ, eine durchdachte IP-Rotation und die Tarnung des Headless-Modus sorgen zusammen für einen stabilen Betrieb, selbst auf Websites mit aggressivem Anti-Bot-Schutz.
Lassen Sie uns die Auswahl des Proxy-Typs für spezifische Aufgaben zusammenfassen:
- Parsing öffentlicher Daten ohne strengen Schutz – schnelle Rechenzentrums-Proxys sind geeignet.
- Marktplätze (Wildberries, Ozon), Nachrichtenaggregatoren – benötigen Residential-Proxys mit Rotation.
- Soziale Netzwerke (Instagram, Facebook, TikTok) und Websites mit Cloudflare – nur mobile oder Residential-Proxys.
- Geolokationstests – jeder Proxy-Typ im benötigten Land, Hauptsache die Zeitzone stimmt überein.
- Massenparsing mit hoher Frequenz – rotierende Residential-Proxys mit Gateway-Endpunkt.
Wenn Sie ein Parsing- oder automatisiertes Testsystem auf Playwright aufbauen und eine stabile Funktion ohne Sperren benötigen, empfehlen wir, Residential-Proxys in Betracht zu ziehen – sie bieten ein hohes Maß an Vertrauen seitens der Websites und unterstützen die IP-Rotation über einen einzigen Endpunkt, was die Integration mit Playwright auf wenige Codezeilen vereinfacht.