Puppeteer czy Playwright: co wybrać do pracy z proxy

Czym różnią się Puppeteer i Playwright: przeglądarki, języki, konfiguracja proxy, oszczędzanie transferu i wybór portów do scenariuszy wieloetapowych.

Redakcja Prokso 6 min czytania
Puppeteer czy Playwright: co wybrać do pracy z proxy
W skrócie
  • 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ównujemyPuppeteerPlaywright
PrzeglądarkiChrome i Chromium, FirefoxChromium, Firefox, WebKit
JęzykiJavaScript, TypeScriptJavaScript, TypeScript, Python, Java, .NET
Gdzie ustawia się proxyArgument --proxy-server przy uruchamianiu przeglądarkiOpcja proxy przy uruchamianiu przeglądarki lub dla osobnego kontekstu
Login i hasło do proxypage.authenticate() na stroniePola username i password w opcji proxy
Różne IP w jednej przeglądarceZwykle jedno proxy na uruchomienie, różne przeglądarki dla różnych IPKażdy kontekst z własnym portem
Oczekiwanie na elementyZwykle pisane ręcznieAutomatyczne oczekiwanie przed akcjami
Testy i nagrywanie akcjiPotrzebny osobny runner testówWł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() lub context.route() i wywołuj route.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.

Przeczytaj też

19.10.20266 min czytania

IPv4 czy IPv6: co warto wiedzieć o proxy

Czym IPv4 różni się od IPv6, dlaczego proxy IPv6 są tanie, ale nie otwierają każdej strony, jak sprawdzić adres i nie dopuścić do wycieku przez IPv6.