Integracja Proxy z Playwright: Przeglądarka, Kontekst i Rotacja
Playwright to jedyne główne środowisko przeglądarkowe, w którym uwierzytelnione proxy działają bez problemu — dane uwierzytelniające są pełnoprawnymi polami konfiguracyjnymi. Klucz tkwi w kontekstach: jedna przeglądarka, inny adres IP wyjściowy dla każdego zadania. Oto pełny wzorzec.
Playwright to jedyne główne środowisko automatyzacji przeglądarek, w którym uwierzytelnione proxy są pełnoprawnym elementem: nazwa użytkownika i hasło to zwykłe pola konfiguracyjne, bez rozszerzeń, bez okien dialogowych uwierzytelniania, bez bibliotek opakowujących. Dzięki temu podstawowa konfiguracja proxy Playwright to pięć linii kodu w Node lub Python. Prawdziwa przewaga leży poziom głębiej — proxy na poziomie kontekstu pozwalają na uruchomienie wielu izolowanych sesji w jednym procesie przeglądarki, każda z własnym adresem IP wyjściowym, co jest najtańszą architekturą rotacji oferowaną przez jakiekolwiek środowisko. Ten przewodnik obejmuje obie warstwy, pułapki SOCKS5 i localhost, co proxy robi z rachunkiem za przepustowość i gdzie ukrywanie naprawdę się kończy.
Proxy Playwright przy uruchomieniu przeglądarki
Przekaż obiekt proxy do launch(), a każda strona w przeglądarce będzie przez niego kierowana. Zwróć uwagę na kształt: URL serwera nie zawiera danych uwierzytelniających — trafiają one do oddzielnych pól username i password, co pozwala Playwright unikać problemu z okienkami uwierzytelniania, który nęka Selenium i 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();
})();
API Python odzwierciedla to dokładnie:
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()
Jeśli Twoje dane uwierzytelniające znajdują się w standardowym ciągu http://user:pass@host:port, rozdziel go za pomocą klasy URL (new URL() w Node, urllib.parse w Python) zamiast manipulacji ciągiem — hasła ze znakami specjalnymi przetrwają w ten sposób. Jedno zastrzeżenie dotyczące testów: use.proxy w playwright.config.ts obejmuje testy, ale istnieją długotrwałe raporty o ignorowaniu ustawień proxy na poziomie konfiguracji w mieszanych konfiguracjach, więc dla skryptów scrapingowych zawsze ustawiaj proxy przy launch() lub bezpośrednio w kontekście.
Proxy na poziomie kontekstu: rotacja bez nowych przeglądarek
BrowserContext to izolowana przeglądarka w przeglądarce: oddzielne ciasteczka, pamięć i cache, dzielące tylko proces. Konteksty akceptują własną opcję proxy, a ich tworzenie zajmuje milisekundy w porównaniu do sekund dla pełnego uruchomienia — więc wzorzec rotacji to jedna przeglądarka, kontekst na zadanie:
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();
})();
Skierowane na rotacyjny bramę, każdy kontekst wychodzi z innego IP w puli 90M+ adresów rezydencyjnych bez zarządzania listą — to właśnie robią rotacyjne proxy po stronie serwera. Gdy zadanie wymaga tego samego IP na kilku stronach (logowanie plus zakup), zażądaj sesji lepkiej poprzez parametry nazwy użytkownika, a wyjście utrzyma się na czas trwania okna sesji. Konteksty również izolują awarie: zablokowane wyjście umiera z jego kontekstem zamiast zatruwać całą przeglądarkę.
Ten sam wzorzec daje Ci darmowe geotargetowanie. Ponieważ proxy jest opcją kontekstu, jedna przeglądarka może jednocześnie posiadać kontekst USA, kontekst niemiecki i kontekst japoński — każdy widzi lokalne ceny, wyniki wyszukiwania i banery zgody z lokalnego IP wyjściowego. Dla porównania cen i weryfikacji reklam, to zastępuje trzy regiony chmurowe trzema liniami konfiguracji.

SOCKS5, zasady omijania i pułapka localhost
- SOCKS5 działa, uwierzytelnianie SOCKS5 nie. Chromium nie obsługuje poświadczeń SOCKS, więc
server: 'socks5://...'łączy się tylko z nieautoryzowanymi punktami końcowymi. W przypadku uwierzytelnionych proxy SOCKS5, albo przełącz się na port HTTP tego samego bramy, albo umieść IP swojej maszyny na białej liście, aby nie były potrzebne żadne poświadczenia. - Omijaj hosty za pomocą
bypass: '*.internal.example.com, localhost'— ruch do tych hostów idzie bezpośrednio. Przydatne, gdy Twój skrypt również komunikuje się z wewnętrznymi usługami, które nie mogą przechodzić przez proxy. - Localhost jest wyjątkowy. Chromium domyślnie pomija proxy dla adresów pętli zwrotnej, więc testowanie na lokalnym serwerze mock wydaje się 'ignorować' Twoje proxy. To przeglądarka, a nie Playwright — testuj na zewnętrznym punkcie końcowym, takim jak httpbin.org/ip.
- Lista kontrolna 'proxy nie działa': poświadczenia w polach (nie w URL serwera), schemat obecny w wartości serwera, a wyjście zweryfikowane przez załadowanie strony echa IP przed obwinieniem docelowej strony.
Ogranicz przepustowość przed skalowaniem
Przeglądarka renderująca pobiera wszystko — obrazy, czcionki, analitykę, skrypty reklamowe — a przez mierzoną rezydencyjną transmisję płacisz za to wszystko. Blokowanie nieistotnych typów zasobów rutynowo zmniejsza transfer na stronę o połowę lub więcej, a routing Playwright sprawia, że to jednolinijkowiec w kontekście. Więcej wzorców w naszym przewodniku po zmniejszaniu kosztów przepustowości proxy:
await context.route('**/*', (route) => {
const type = route.request().resourceType();
if (type === 'image' || type === 'font' || type === 'media') {
return route.abort();
}
return route.continue();
});
Zmierz efekt zamiast zakładać go: subskrybuj zdarzenia odpowiedzi kontekstu, sumuj rozmiary transferu dla próbki stron z i bez trasy, a otrzymasz rzeczywisty koszt GB na stronę — liczba, która decyduje, czy crawl miliona stron to błąd zaokrąglenia, czy linia budżetowa.
Ograniczenia ukrywania: czego proxy nie może naprawić
Bądź szczery co do pułapu. Rezydencyjne wyjście rozwiązuje reputację IP — pierwszy i największy filtr — ale Playwright nadal prezentuje sygnały automatyzacji powyżej warstwy sieciowej: dziwactwa renderowania bezgłowego, artefakty CDP i powierzchnie odcisków palców, które dostawcy antybotów badają bezpośrednio. Wtyczki ukrywające łatają niektóre sygnały i pozostają w tyle za aktualizacjami detektorów w innych; to wyścig zbrojeń, który dziedziczysz, a nie ustawienie, które włączasz. Pragmatyczny podział: uruchom Playwright przez rezydencyjne proxy dla długiego ogona normalnych stron, a naprawdę wrogie domeny kieruj przez Scraper API, które zarządza odciskami palców, renderowaniem i ponownymi próbami jako całym zadaniem i zwraca HTML, markdown lub ustrukturyzowany JSON. Twój kod Playwright nadal robi to, w czym jest wyjątkowo dobry — przepływy interakcji — podczas gdy zadania pobierania i parsowania przenoszą się do API. Ta sama kalkulacja dotyczy Puppeteer i Selenium; żadna zmiana środowiska nie rozwiązuje problemu z odciskami palców.

Często zadawane pytania
Jak ustawić proxy w Playwright Python?
Przekaż słownik proxy do launch(): p.chromium.launch(proxy={"server": "http://host:port", "username": "USER", "password": "PASS"}). Ten sam słownik działa na browser.new_context() dla routingu na poziomie kontekstu. Poświadczenia zawsze trafiają do oddzielnych pól, nigdy wewnątrz URL serwera.
Czy Playwright może używać innego proxy dla każdego kontekstu?
Tak — przekaż opcję proxy do każdego wywołania newContext(). Konteksty nie dzielą niczego poza procesem przeglądarki, więc dwa konteksty z różnymi proxy zachowują się jak dwie niepowiązane przeglądarki dla stron docelowych. To standardowy wzorzec rotacji: jedno uruchomienie, a następnie świeży kontekst na zadanie lub tożsamość.
Czy Playwright obsługuje uwierzytelnianie proxy SOCKS5?
Nie. Playwright przekazuje SOCKS5 do przeglądarki, a Chromium nie ma mechanizmu dla poświadczeń SOCKS, więc uwierzytelnione punkty końcowe SOCKS5 zawodzą. Użyj portu HTTP(S) tej samej bramy proxy z polami nazwy użytkownika i hasła, lub uwierzytelnij przez białą listę IP i zachowaj schemat SOCKS5.
Jaki jest poprawny format proxy Playwright?
Obiekt z polem server (scheme://host:port — http, https lub socks5) plus opcjonalne pola username, password i bypass. Nie umieszczaj poświadczeń wewnątrz URL serwera; Playwright oczekuje ich osobno, a hasła ze znakami specjalnymi przetrwają tylko w dedykowanych polach.
Dlaczego moje proxy Playwright nie działa na localhost?
Chromium pomija proxy dla adresów pętli zwrotnej domyślnie, więc żądania do localhost lub 127.0.0.1 idą bezpośrednio i wydają się ignorować Twoją konfigurację. Zweryfikuj proxy na zewnętrznym URL, takim jak httpbin.org/ip. W konfiguracjach testowych, również preferuj ustawienie proxy przy launch() zamiast polegać na opcjach pliku konfiguracyjnego.
Historia proxy Playwright jest najczystsza w ekosystemie: poświadczenia jako konfiguracja, konteksty jako jednostka rotacji, routing jako zawór przepustowości. Ustaw jakość IP pod spodem i środowisko zanika w tle — co jest dokładnie tym, co dobra infrastruktura powinna robić.