
- Puppeteer to biblioteka dla Chrome i Firefoksa w JavaScripcie i TypeScripcie; Playwright obsługuje Chromium, Firefoksa i WebKit oraz języki JS/TS, Python, Java i .NET
- W Puppeteerze proxy zwykle ustawia się przy uruchamianiu przeglądarki, a login i hasło przekazuje się przez page.authenticate
- W Playwrighcie proxy z loginem i hasłem ustawia się przy uruchomieniu albo dla osobnego kontekstu, co jest wygodne przy kilku profilach w jednej przeglądarce
- Do logowania na konto i innych scenariuszy wieloetapowych bierz port sticky 10000-20000; do niezależnych żądań – rotację na 823 lub 824
- Blokowanie obrazów, czcionek i wideo przez przechwytywanie żądań wyraźnie zmniejsza zużycie transferu w obu bibliotekach
Puppeteer i Playwright rozwiązują to samo zadanie: sterują prawdziwą przeglądarką z poziomu kodu. Skrypt otwiera strony, klika przyciski, wypełnia formularze i zbiera dane. Obie biblioteki potrafią działać przez proxy, ale robią to inaczej.
Poniżej: czym się różnią, jak podłączyć proxy w każdej z nich, jak oszczędzać transfer i jakich portów używać w różnych scenariuszach. Na końcu prosta zasada wyboru.
Dwie biblioteki o wspólnych korzeniach
Puppeteer pojawił się wcześniej i rozwija go zespół Chrome w Google. Przez długi czas działał tylko z Chrome i Chromium, a teraz obsługuje też Firefoksa. Piszesz w nim w JavaScripcie lub TypeScripcie na Node.js.
Playwright powstał w Microsofcie, a część jego autorów pracowała wcześniej nad Puppeteerem. Dlatego składnia jest podobna, ale Playwright od początku projektowano szerzej: kilka przeglądarek, kilka języków, wbudowane narzędzia do testów.
Porównanie w jednej tabeli
| Co porównujemy | Puppeteer | Playwright |
|---|---|---|
| Przeglądarki | Chrome i Chromium, Firefox | Chromium, Firefox, WebKit |
| Języki | JavaScript, TypeScript | JavaScript, TypeScript, Python, Java, .NET |
| Gdzie ustawia się proxy | Argument --proxy-server przy uruchamianiu przeglądarki | Opcja proxy przy uruchamianiu przeglądarki lub dla osobnego kontekstu |
| Login i hasło do proxy | page.authenticate() na stronie | Pola username i password w opcji proxy |
| Różne IP w jednej przeglądarce | Zwykle jedno proxy na uruchomienie, różne przeglądarki dla różnych IP | Każdy kontekst z własnym portem |
| Oczekiwanie na elementy | Zwykle pisane ręcznie | Automatyczne oczekiwanie przed akcjami |
| Testy i nagrywanie akcji | Potrzebny osobny runner testów | Własny runner Playwright Test i generator kodu codegen |
| Przechwytywanie żądań | page.setRequestInterception() | page.route() lub context.route() |
Przeglądarki i języki: od tego zaczyna się wybór
Jeśli Twój zespół pisze w Pythonie, Javie lub C#, sprawa jest prawie przesądzona. Playwright ma oficjalne wersje dla tych języków z tym samym zestawem funkcji. Puppeteer oficjalnie obsługuje tylko JavaScript i TypeScript, a nieoficjalne porty na inne języki są rozwijane osobno i pozostają w tyle.
Podobnie jest z przeglądarkami. Puppeteer dobrze obsługuje Chrome i Firefoksa. Playwright dodaje WebKit – silnik, na którym działa Safari. Ma to znaczenie, jeśli testujesz stronę tak, jak widzą ją użytkownicy iPhone’a i Maca.
Jak podłączyć proxy w Puppeteerze
Chromium w Puppeteerze pobiera proxy z argumentu --proxy-server przy uruchomieniu. Zawiera on tylko protokół, host i port, bez loginu. Login i hasło przekazuje się osobno, przez page.authenticate(), przed pierwszym przejściem na stronie.
Najważniejsza konsekwencja: proxy jest powiązane z uruchomieniem przeglądarki. Jeśli potrzebujesz trzech różnych adresów, zwykle uruchamiasz trzy przeglądarki, każdą na własnym porcie. W nowszych wersjach można też ustawić proxy dla osobnego kontekstu, ale uwierzytelnianie nadal odbywa się przez stronę. Konfigurację krok po kroku znajdziesz w instrukcji Puppeteer.
Poniższy przykład uruchamia przeglądarkę na porcie sticky, wyłącza obrazy, czcionki i wideo oraz wypisuje adres, który widzi strona:
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({ args: ["--proxy-server=http://gw.prokso.com:10001"] });
const page = await browser.newPage();
await page.authenticate({ username: "USERNAME", password: "PASSWORD" });
await page.setRequestInterception(true);
page.on("request", (req) => {
if (["image", "font", "media"].includes(req.resourceType())) req.abort();
else req.continue();
});
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();Jak podłączyć proxy w Playwrighcie
Playwright przyjmuje proxy razem z loginem i hasłem w opcji proxy: pola server, username i password. Osobne uwierzytelnianie na stronie nie jest potrzebne. Opcję możesz przekazać przy uruchamianiu przeglądarki – wtedy proxy jest wspólne dla wszystkich stron.
Druga możliwość to ustawienie proxy dla kontekstu: browser.newContext({ proxy }). Kontekst działa jak osobny profil: własne ciasteczka, pamięć i własny adres. Dzięki temu w jednej przeglądarce działa kilka profili na różnych portach sticky i nie trzeba uruchamiać przeglądarki od nowa dla każdego z nich. W Pythonie składnia jest taka sama. Szczegóły znajdziesz w instrukcji Playwright.
import { chromium } from "playwright";
const browser = await chromium.launch();
const ports = [10001, 10002, 10003];
for (const port of ports) {
const context = await browser.newContext({
proxy: { server: `http://gw.prokso.com:${port}`, username: "USERNAME", password: "PASSWORD" },
});
await context.route("**/*", (route) =>
["image", "font", "media"].includes(route.request().resourceType()) ? route.abort() : route.continue()
);
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(port, await page.textContent("body"));
await context.close();
}
await browser.close();Każdy kontekst wychodzi tu przez własny port i dostaje własny adres. Jeśli otworzysz w nich stronę sprawdzającą IP, zobaczysz trzy różne IP z jednego kraju.
Ograniczenie SOCKS5 wspólne dla obu
Chromium nie przyjmuje hasła do proxy SOCKS5 i dotyczy to zarówno Puppeteera, jak i Playwrighta. Dlatego wygodniej pracować z loginem i hasłem przez HTTP: port 823 lub porty sticky 10000-20000. Jeśli potrzebujesz właśnie SOCKS5, włącz w panelu klienta dostęp po IP: do 5 adresów na plan, login nie jest potrzebny.
Co jeszcze daje Playwright
Automatyczne oczekiwanie to najbardziej odczuwalna różnica w codziennej pracy. Przed kliknięciem lub wpisaniem tekstu Playwright sam czeka, aż element się pojawi, stanie się widoczny i dostępny. Skrypty wychodzą krótsze i rzadziej się wysypują na wolnych stronach, a przez proxy strony czasem ładują się dłużej niż zwykle.
W zestawie są jeszcze dwa narzędzia. Playwright Test to runner testów z równoległymi uruchomieniami, raportami i śledzeniem (tracing). Codegen nagrywa Twoje działania w przeglądarce i zamienia je w gotowy kod, co bardzo przyspiesza pierwsze kroki.
Dojrzałość i społeczność
Puppeteer ma długą historię, więc na typowe pytania jest wiele gotowych odpowiedzi, przykładów i zewnętrznych modułów. Wiele narzędzi, które łączą się z już otwartą przeglądarką, historycznie podawało przykłady właśnie dla Puppeteera.
Playwright jest młodszy, ale szybko urósł i jest aktywnie rozwijany. Ma szczegółową dokumentację, a przykłady są dostępne od razu dla wszystkich języków. Do nowych projektów, zwłaszcza z testami, wybiera się go coraz częściej.
Jak oszczędzać transfer w każdej z nich
Transfer w Prokso jest liczony w obu kierunkach, a płacisz za gigabajt. Przeglądarka ładuje całą stronę, a obrazy, wideo i czcionki często zajmują większość objętości. Jeśli potrzebujesz tylko tekstu lub danych, możesz ich nie ładować.
- W Puppeteerze włącz
page.setRequestInterception(true)i przerywaj żądania typu image, font i media. - W Playwrighcie użyj
page.route()lubcontext.route()i wywołujroute.abort()dla tych samych typów. - Nie otwieraj tej samej strony kilka razy w jednym przebiegu: zapisz wynik i bierz go z pamięci podręcznej.
- Zamykaj konteksty i przeglądarki po zakończeniu zadania, żeby żądania w tle nie zużywały transferu.
Kalkulator transferu pomoże oszacować zużycie z wyprzedzeniem. Ceny za gigabajt dla każdego typu proxy znajdziesz w cenniku.
Port sticky czy rotacja
Wybór portu nie zależy od biblioteki, tylko od scenariusza. Jeśli skrypt przechodzi przez kilka kroków na jednej stronie (logowanie, potwierdzenie, koszyk), adres nie może zmienić się w połowie. Inaczej strona zobaczy, że jeden użytkownik w ciągu minuty znalazł się w różnych miejscach.
- Scenariusz wieloetapowy: port sticky od 10000 do 20000 na gw.prokso.com. Utrzymuje jeden adres od 1 do 120 minut, domyślnie 30. Ustaw czas utrzymania z zapasem na cały scenariusz.
- Niezależne strony, na przykład zbieranie kart produktów: rotacja, port 823 dla HTTP lub 824 dla SOCKS5, nowy adres przy każdym żądaniu.
- Kilka profili równolegle: każdy dostaje własny port sticky, osobną przeglądarkę w Puppeteerze lub osobny kontekst w Playwrighcie.
Pamiętaj, że stały adres rezydencjalny lub mobilny może zmienić się przed czasem, jeśli urządzenie przejdzie w tryb offline. Port dostaje wtedy nowy adres z tego samego kraju. Dobrze, jeśli skrypt potrafi po takiej zmianie kontynuować krok, zamiast kończyć się błędem. Więcej o trybach w słowniczku: sesja sticky.
Jak wybrać: krótka zasada
- Nie piszesz w JavaScripcie: bierz Playwright.
- Potrzebujesz WebKit albo testów w kilku przeglądarkach: Playwright.
- Wiele profili z różnymi adresami w jednym procesie: wygodniej w Playwrighcie z kontekstami.
- Masz już działający kod w Puppeteerze albo potrzebujesz tylko Chrome: nie ma sensu go przepisywać, Puppeteer da radę.
- Projekt działa już na Selenium i wszystko Ci odpowiada: zostań przy nim, tam też podłączysz proxy.
Jeśli używasz Selenium, zajrzyj do instrukcji Selenium. A jeśli przeglądarką steruje agent AI, przyda się artykuł proxy dla agentów AI: obowiązują w nim te same zasady dotyczące portów i transferu, tylko dostosowane do tego, że agent działa samodzielnie.
W obu przypadkach zacznij od małej skali: jeden skrypt, jeden port, sprawdzenie adresu na stronie Mój IP. Gdy wszystko działa, dodawaj profile i wątki. I pamiętaj, że proxy nie znosi zasad strony: tempo żądań i regulamin platformy obowiązują przy każdym adresie.
Pytania i odpowiedzi (FAQ)
Którą bibliotekę wybrać na początek?
Jeśli piszesz w Pythonie, Javie lub .NET, wybór jest prosty: Playwright, bo Puppeteer nie ma oficjalnego wsparcia dla tych języków. W JavaScripcie możesz zacząć od dowolnej. Playwright jest wygodniejszy do testów dzięki automatycznemu oczekiwaniu i wbudowanemu runnerowi; Puppeteer sprawdzi się, gdy potrzebujesz tylko automatyzacji Chrome.
Czy w Puppeteerze można ustawić inne proxy dla różnych kart?
Klasyczny sposób to jedno proxy na jedno uruchomienie przeglądarki przez argument --proxy-server. W nowszych wersjach można też ustawić proxy dla osobnego kontekstu przeglądarki, ale login i hasło nadal przekazuje się na stronie. Jeśli potrzebujesz wielu profili z różnymi adresami, łatwiej zrobić to w Playwrighcie.
Dlaczego SOCKS5 z loginem i hasłem nie działa?
Chromium nie przyjmuje hasła do proxy SOCKS5 i dotyczy to obu bibliotek. Używaj portów HTTP z loginem i hasłem albo włącz w panelu klienta dostęp po IP: wtedy SOCKS5 działa bez hasła.
Którego portu użyć do logowania na konto?
Portu sticky z zakresu 10000-20000. Utrzymuje jeden adres od 1 do 120 minut, domyślnie 30, więc logowanie, potwierdzenie i kolejne kroki idą z jednego IP. Porty 823 i 824 zmieniają adres przy każdym żądaniu i nadają się do zbierania niezależnych stron.
Ile przeglądarek mogę uruchomić równolegle?
Po stronie Prokso limit wynosi do 1000 jednoczesnych połączeń na plan. W praktyce szybciej dojdziesz do granic pamięci i procesora własnego komputera: każda przeglądarka jest zasobożerna. Zacznij od kilku instancji i zwiększaj ich liczbę, obserwując błędy.


