Kurze Antwort
Wie verwende ich einen authentifizierten Residential Proxy in Playwright?
Übergeben Sie ein proxy-Objekt mit server, username und password an launch() oder an new_context(): server ist http://gw.crawlrelay.com:7777, und die Zugangsdaten kommen in eigene Felder, niemals in die Server-URL. Mit CrawlRelay Residential-Proxys geben Sie das Land und eine Session-ID im Benutzernamen an, damit jeder Kontext seinen eigenen Exit erhält. Traffic kostet 0,50 $/GB ab 50 GB. Bezahlen Sie mit Krypto, ohne KYC.
Playwright Einrichtung auf einen Blick
| Proxy-Option | {"server": "http://gw.crawlrelay.com:7777", "username": ..., "password": ...} |
|---|---|
| Wo | launch(proxy=...) für den gesamten Browser oder new_context(proxy=...) pro Kontext |
| Port | HTTP-Port 7777; HTTPS-Seiten laufen über CONNECT |
| SOCKS5 | Chromium unterstützt keine SOCKS5-Authentifizierung: Nutzen Sie den HTTP-Port |
| Eine IP pro Kontext | -session-<id>-ttl-<minutes> im Benutzernamen des Kontexts |
| Typische Seitenkosten | Ca. 2 MB mit allen Ressourcen; wenige hundert KB, wenn Bilder, Schriften und Medien geblockt sind |
Wie gebe ich jedem Browser-Kontext sein eigenes Land oder seine eigene Session?
Erstellen Sie einen Kontext pro Land oder pro Sticky-Session. Kontexte sind im Vergleich zu Browsern günstig und jeder speichert eigene Cookies, Speicher und Proxy-Zugangsdaten. Stimmen Sie die Locale des Kontexts auf das Exit-Land ab, damit die Seite einen konsistenten Besucher sieht.
from playwright.sync_api import sync_playwright
GATEWAY = "http://gw.crawlrelay.com:7777"
LOCALES = {"us": "en-US", "de": "de-DE", "jp": "ja-JP"}
with sync_playwright() as p:
browser = p.chromium.launch()
for country, locale in LOCALES.items():
context = browser.new_context(
proxy={"server": GATEWAY, "username": "USERNAME-country-%s" % country, "password": "PASSWORD"},
locale=locale,
)
page = context.new_page()
page.goto("https://api.ipify.org", wait_until="domcontentloaded")
print(country, page.inner_text("body"))
context.close()
browser.close()Wie setze ich den Residential Proxy in Playwright für Node.js und reduziere Traffic?
Die Option hat in Node.js dieselbe Form. Der Großteil des Gewichts einer gerenderten Seite sind Bilder, Schriften und Medien: Die Median-Seite wog 2.164 KB auf Mobile laut HTTP Archive Web Almanac 2025. Wenn Sie nur Text und Links benötigen, brechen Sie diese Anfragen in einem Routen-Handler ab.
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: {
server: "http://gw.crawlrelay.com:7777",
username: "USERNAME-country-us-session-pw1-ttl-30",
password: "PASSWORD",
},
});
const context = await browser.newContext();
// Images, fonts and media are most of a page's bytes
await context.route("**/*", (route) =>
["image", "font", "media"].includes(route.request().resourceType()) ? route.abort() : route.continue()
);
const page = await context.newPage();
const response = await page.goto("https://example.com/", { waitUntil: "domcontentloaded" });
console.log(response.status(), await page.title());
await browser.close();Wie führe ich viele Seiten parallel mit asyncio aus?
Verwenden Sie die Async-API mit einem festen Pool von Kontexten. Jeder Kontext hält eine Sticky-Session für seine Lebensdauer, so sieht eine Seite wenige stabile Besucher statt eine IP pro Anfrage. Recyceln Sie einen Kontext mit einer neuen Session-ID nach einer definierten Seitenzahl oder nach einem Fehler.
import asyncio
import uuid
from playwright.async_api import async_playwright
GATEWAY = "http://gw.crawlrelay.com:7777"
WORKERS = 4
async def worker(browser, queue):
session = uuid.uuid4().hex[:10]
context = await browser.new_context(proxy={
"server": GATEWAY,
"username": "USERNAME-country-us-session-%s-ttl-30" % session,
"password": "PASSWORD",
})
page = await context.new_page()
while not queue.empty():
url = await queue.get()
try:
response = await page.goto(url, wait_until="domcontentloaded", timeout=45000)
print(session, url, response.status if response else None)
except Exception as exc: # timeouts and network errors: log and move on
print(session, url, type(exc).__name__)
finally:
queue.task_done()
await context.close()
async def main(urls):
queue = asyncio.Queue()
for url in urls:
queue.put_nowait(url)
async with async_playwright() as p:
browser = await p.chromium.launch()
await asyncio.gather(*(worker(browser, queue) for _ in range(WORKERS)))
await browser.close()
asyncio.run(main(["https://example.com/", "https://example.org/"]))Warum erhalte ich ERR_TUNNEL_CONNECTION_FAILED oder ERR_PROXY_CONNECTION_FAILED?
- net::ERR_TUNNEL_CONNECTION_FAILED bedeutet, dass der Residential Proxy die CONNECT-Anfrage nicht akzeptiert hat. Meist standen die Zugangsdaten innerhalb von
serverstatt inusernameundpassword, sodass Chromium keine gesendet hat. Siehe den Tunnel-Fehler. - net::ERR_PROXY_CONNECTION_FAILED bedeutet, dass der Browser das Gateway nie erreicht hat: ein Tippfehler beim Host oder Port oder ein Netzwerk, das den Port blockiert. Siehe den Proxy-Verbindungsfehler.
- Timeout 30000ms überschritten bei
gotoheißt meist, dass Sie aufloadodernetworkidleauf einer Seite warten, die Tracker ständig nachlädt. Warten Sie aufdomcontentloadedund dann auf den benötigten Selector.
Was sollte ein Playwright-Scraper nicht tun?
Nutzen Sie Playwright, um öffentliche Seiten zu rendern, die JavaScript benötigen, nicht um Menschen zu imitieren. CrawlRelay's Acceptable Use Policy verbietet die Nutzung von Browsern über unser Gateway zum massenhaften Erstellen von Accounts, Übernehmen von Accounts, automatischen Lösen von CAPTCHA oder Umgehen von absichtlichen Blocks einer Seite. Wir dokumentieren keine Stealth-Plugins oder Fingerprinting-Spoofing. Wenn eine Seite Ihren Browser herausfordert, drosseln Sie das Tempo, prüfen Sie robots.txt und Bedingungen und fragen Sie ggf. um Zugang oder nutzen Sie die API der Seite.
Playwright und Residential-Proxys: Fragen
Kann ich für jeden Playwright-Kontext einen anderen Proxy verwenden?
Ja. Übergeben Sie proxy an browser.new_context() in Python oder browser.newContext() in Node.js. Jeder Kontext hat dann seinen eigenen Exit, Cookies und Speicher. Sehr alte Playwright-Versionen auf Windows erforderten beim Start auch einen Proxy; falls dieser Fehler auftaucht, starten Sie mit einem Platzhalter-Proxy und setzen den echten pro Kontext.
Unterstützt Playwright SOCKS5-Proxys mit Authentifizierung?
Nicht in Chromium, das keine SOCKS5-Authentifizierung mit Benutzername und Passwort unterstützt. Nutzen Sie den HTTP-Port des Gateways (7777): Er verarbeitet HTTPS-Seiten über CONNECT-Tunnel und unterstützt Benutzername und Passwort in jedem Browser-Engine, die Playwright steuert.
Wie überprüfe ich, welche IP und welches Land eine Playwright-Seite nutzt?
Öffnen Sie https://api.ipify.org im selben Kontext vor Ihrer Zielseite und lesen Sie den Body-Text, wie im ersten Beispiel. Beachten Sie, dass eine Sticky-Session diese IP nur hält, solange das Residential-Gerät online bleibt; protokollieren Sie die IP zu Beginn jedes Kontexts, um Änderungen zu erkennen.
Wie viel Traffic verbraucht eine Playwright-Seite über einen Proxy?
Alles wird berechnet: HTML, Skripte, Styles, Bilder, Schriften und API-Aufrufe. Eine volle Seite liegt im Median bei ca. 2 MB; das Blockieren von Bildern, Schriften und Medien reduziert das oft auf wenige hundert Kilobyte. Messen Sie Ihre echten Seiten, indem Sie die Antwortgrößen in einem response-Handler für 50 Seiten aufsummieren.
Sollte ich für Scraping headless oder headed Browser verwenden?
Headless ist die übliche Wahl für Server und verbraucht weniger Ressourcen. Verwenden Sie einen headed Browser nur, um zu debuggen, was eine Seite zeigt. Keiner ändert die Regeln: Rendern Sie öffentliche Seiten mit angemessenem Tempo und respektieren Sie robots.txt und die Nutzungsbedingungen der Seite.
Renden Sie öffentliche Seiten über Residential IPs
5,94 $ für 10 GB, 0,50 $/GB von 50 GB.