Szybka odpowiedź
Jak używać uwierzytelnionego proxy rezydencjalnego w Playwright?
Przekaż obiekt proxy z server, username i password do launch() lub do new_context(): server to http://gw.crawlrelay.com:7777, a dane logowania wpisz w osobne pola, nigdy w URL serwera. Przy CrawlRelay mobilnych proxy 4G umieść kraj i ID sesji w nazwie użytkownika, aby nadać każdemu kontekstowi własne wyjście. Ruch kosztuje 0,50 USD/GB od 50 GB. Płatność w kryptowalucie, bez KYC.
Szybka konfiguracja Playwright
| Opcja proxy | {"server": "http://gw.crawlrelay.com:7777", "username": ..., "password": ...} |
|---|---|
| Gdzie | launch(proxy=...) dla całej przeglądarki lub new_context(proxy=...) na kontekst |
| Port | Port HTTP 7777; strony HTTPS korzystają z CONNECT |
| SOCKS5 | Chromium nie obsługuje uwierzytelniania SOCKS5: użyj portu HTTP |
| Jeden IP na kontekst | -session-<id>-ttl-<minutes> w nazwie użytkownika kontekstu |
| Typowy koszt strony | Około 2 MB z każdym zasobem; kilkaset KB przy zablokowanych obrazach, czcionkach i mediach |
Jak nadać każdemu kontekstowi przeglądarki własny kraj lub sesję?
Utwórz jeden kontekst na kraj lub na sesję sticky. Konteksty są tanie w porównaniu do przeglądarek, a każdy przechowuje własne ciasteczka, magazyn i dane proxy rezydencjalnego. Dopasuj locale kontekstu do kraju wyjścia, aby witryna widziała spójnego użytkownika.
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()Jak ustawić proxy rezydencjalne w Playwright dla Node.js i ograniczyć ruch?
Opcja ma ten sam format w Node.js. Większość wagi renderowanej strony to obrazy, czcionki i media: mediana strony ważyła 2 164 KB na urządzeniach mobilnych według HTTP Archive Web Almanac 2025. Jeśli potrzebujesz tylko tekstu i linków, anuluj takie żądania w handlerze trasy.
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();Jak uruchomić wiele stron równolegle z asyncio?
Użyj asynchronicznego API z ustalonym pulą kontekstów. Każdy kontekst utrzymuje jedną sticky session przez cały czas życia, dzięki czemu strona widzi kilku stałych odwiedzających zamiast jednego IP na żądanie. Zmieniaj kontekst z nowym ID sesji po określonej liczbie stron lub po wystąpieniu błędu.
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/"]))Dlaczego pojawia się ERR_TUNNEL_CONNECTION_FAILED lub ERR_PROXY_CONNECTION_FAILED?
- net::ERR_TUNNEL_CONNECTION_FAILED oznacza, że proxy nie zaakceptowało żądania CONNECT. Najczęściej dane uwierzytelniające wpisano w
serverzamiast wusernameipassword, więc Chromium ich nie wysłało. Zobacz błąd tunelu]. - net::ERR_PROXY_CONNECTION_FAILED oznacza, że przeglądarka nigdy nie dotarła do bramy: literówka w hoście lub porcie albo sieć blokuje port. Zobacz błąd połączenia proxy].
- Przekroczono limit czasu 30000ms na
gotozwykle oznacza, że czekasz naloadlubnetworkidlena stronie, która ciągle ładuje trackery. Poczekaj nadomcontentloaded, a potem na potrzebny selektor.
Czego scraper Playwright nie powinien robić?
Używaj Playwright do renderowania publicznych stron wymagających JavaScript, nie do podszywania się pod ludzi. Polityka akceptowalnego użytkowania CrawlRelay Acceptable Use Policy zabrania używania przeglądarek przez naszą bramę do masowego tworzenia kont, przejmowania kont, automatycznego rozwiązywania CAPTCHA lub omijania celowych blokad strony. Nie opisujemy wtyczek stealth ani spoofingu odcisków palców. Jeśli strona sprawdza Twoją przeglądarkę, zwolnij tempo, sprawdź jej robots.txt i warunki oraz poproś o dostęp lub użyj jej API.
Playwright i proxy: pytania
Czy mogę użyć innego proxy dla każdego kontekstu Playwright?
Tak. Przekaż proxy do browser.new_context() w Pythonie lub browser.newContext() w Node.js. Każdy kontekst ma wtedy własne wyjście, ciasteczka i pamięć. Bardzo stare wersje Playwright na Windows wymagały proxy przy starcie; jeśli masz ten błąd, uruchom z dowolnym proxy zastępczym i ustaw właściwe dla każdego kontekstu.
Czy Playwright obsługuje proxy SOCKS5 z uwierzytelnianiem?
Nie w Chromium, które nie obsługuje uwierzytelniania użytkownika i hasła w SOCKS5. Używaj portu HTTP bramy (7777): obsługuje on strony HTTPS przez CONNECT tunnel i wspiera użytkownika oraz hasło we wszystkich silnikach przeglądarek obsługiwanych przez Playwright.
Jak sprawdzić, jakie IP i kraj używa strona Playwright?
Otwórz https://api.ipify.org w tym samym kontekście przed stroną docelową i odczytaj tekst treści, tak jak w pierwszym przykładzie. Pamiętaj, że sticky session utrzymuje to IP tylko dopóki urządzenie proxy rezydencjalne jest online; zapisz IP na początku każdego kontekstu, aby zauważyć zmiany.
Ile ruchu sieciowego zużywa strona Playwright przez proxy?
Wszystko jest rozliczane: HTML, skrypty, style, obrazy, czcionki i wywołania API. Pełna strona to około 2 MB mediany; blokowanie obrazów, czcionek i mediów często tnie to do kilkuset kilobajtów. Zmierz swoje realne strony sumując rozmiar odpowiedzi w obsłudze response dla 50 stron.
Czy lepiej używać przeglądarki headless czy z interfejsem do scrapowania?
Headless to standard dla serwerów i zużywa mniej zasobów. Używaj przeglądarki z GUI tylko do debugowania, co pokazuje strona. Żadne z nich nie zmienia zasad: renderuj publiczne strony w kulturalnym tempie i szanuj robots.txt oraz warunki serwisu.
Renderuj publiczne strony przez proxy rezydencjalne
5,94 USD dla 10 GB, 0,50 USD/GB od 50 GB.