Szybka odpowiedź
Jak używać uwierzytelnionego proxy w Puppeteer?
Uruchom Chrome z --proxy-server=http://gw.crawlrelay.com:7777, potem wywołaj page.authenticate({ username, password }) przed pierwszym goto. Chrome ignoruje dane uwierzytelniające wpisane we flagę. CrawlRelay proxy rezydencjalne odczytują kraj i trwałą sesję z nazwy użytkownika, więc każda strona lub kontekst może mieć własne IP wyjściowe. Transfer kosztuje 0,50 USD/GB od 50 GB. Płatność w crypto, bez KYC.
Szybka konfiguracja Puppeteer
| Adres proxy | --proxy-server=http://gw.crawlrelay.com:7777 w args lub proxyServer na kontekst przeglądarki |
|---|---|
| Dane uwierzytelniające | await page.authenticate({ username, password }) przed nawigacją |
| Osobne sesje | browser.createBrowserContext({ proxyServer }): jeden kontekst na sesję |
| SOCKS5 | Nie działa z uwierzytelnianiem w Chrome: używaj portu HTTP |
| Oszczędzanie transferu | page.setRequestInterception(true) i blokuj obrazy, czcionki oraz multimedia |
Jak skonfigurować pojedyncze uwierzytelnione proxy?
To jest minimalny wzorzec. Blok try … finally zamyka Chrome nawet gdy nawigacja się nie powiedzie, co ma znaczenie na serwerach z porzuconymi procesami przeglądarek.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=http://gw.crawlrelay.com:7777"],
});
try {
const page = await browser.newPage();
await page.authenticate({ username: "USERNAME-country-us", password: "PASSWORD" });
await page.setRequestInterception(true);
page.on("request", (req) =>
["image", "font", "media"].includes(req.resourceType()) ? req.abort() : req.continue()
);
const res = await page.goto("https://example.com/", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log(res.status(), await page.title());
} finally {
await browser.close();
}Jak uruchomić kilka sesji lub krajów w jednej przeglądarce?
Utwórz jeden kontekst przeglądarki na sesję. Kontekst to izolowany profil z własnymi ciasteczkami, cache i stanem sieci, więc dane uwierzytelniające z jednego kontekstu nie przeciekają do innego. Nadaj każdemu kontekstowi nazwę użytkownika z własnym krajem lub ID sesji.
import puppeteer from "puppeteer";
import { randomUUID } from "node:crypto";
const GATEWAY = "http://gw.crawlrelay.com:7777";
const browser = await puppeteer.launch();
async function visit(country, url) {
const session = randomUUID().replaceAll("-", "").slice(0, 10);
const context = await browser.createBrowserContext({ proxyServer: GATEWAY });
try {
const page = await context.newPage();
await page.authenticate({
username: `USERNAME-country-${country}-session-${session}-ttl-20`,
password: "PASSWORD",
});
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
return { country, session, ip: await page.evaluate(() => document.body.innerText.trim()) };
} finally {
await context.close();
}
}
try {
const results = await Promise.all([
visit("us", "https://api.ipify.org"),
visit("gb", "https://api.ipify.org"),
]);
console.table(results);
} finally {
await browser.close();
}Dlaczego Puppeteer pokazuje błąd 407 lub ERR_TUNNEL_CONNECTION_FAILED?
Bo Chrome nie wysłał danych uwierzytelniających lub wysłał błędne. Sprawdź trzy rzeczy:
page.authenticate()wywoływany jest przed pierwszymgotona tej stronie.- Flaga
--proxy-serverlubproxyServerzawiera tylko schemat, host i port, bez częściuser:pass@. - Nazwa użytkownika nie ma literówek w części docelowej: przetestuj ją najpierw curl, jak pokazano na stronie 407.
Jeśli curl działa z tym samym użytkownikiem i hasłem, a Puppeteer dalej nie, przeczytaj ERR_TUNNEL_CONNECTION_FAILED.
Ile transferu zużywa strona w Puppeteer?
Wszystko co Chrome pobiera, jest rozliczane: HTML, skrypty, style, obrazy, czcionki oraz wywołania API z strony. HTTP Archive Web Almanac 2025 zmierzył medianę wielkości strony na 2 164 KB na mobilnych oraz 2 412 KB na desktopie. Blokowanie obrazów, czcionek i multimediów przez przechwytywanie żądań zwykle redukuje to do kilkuset kilobajtów, a zwracanie z cache powtarzających się skryptów obniża dalej transfer. Używaj rotujących mobilnych proxy 4G tylko tam gdzie potrzebne: transfer mobilny kosztuje 1,50 USD/GB od 5 GB, proxy rezydencjalne 0,50 USD/GB od 50 GB.
Puppeteer i proxy: pytania
Czy mogę umieścić nazwę użytkownika i hasło w --proxy-server?
Nie. Chrome ignoruje dane uwierzytelniające we fladze --proxy-server, a pierwsze żądanie HTTPS kończy się błędem 407 ukrytym pod ERR_TUNNEL_CONNECTION_FAILED. We fladze podaj tylko http://host:port, a dane uwierzytelniające przekazuj przez page.authenticate() na każdej nowej stronie.
Jak rotować IP między stronami w Puppeteer?
Otwieraj każdą stronę w nowym kontekście przeglądarki lub daj każdej stronie nazwę użytkownika bez ID sesji. Nowy kontekst otwiera nowe połączenia, a każde połączenie zwykle ma inne proxy rezydencjalne jako wyjście. W obrębie jednej strony Chrome ponownie używa połączeń, więc żądania do tego samego serwisu często korzystają z tego samego IP wyjściowego do zamknięcia połączenia.
Czy page.authenticate() działa z przechwytywaniem żądań?
Tak. Puppeteer sam obsługuje wyzwania uwierzytelniania proxy, a Twój handler przechwytywania musi tylko wywołać continue() lub abort() dla każdego żądania. Najpierw skonfiguruj authenticate(), a potem włącz przechwytywanie, jak w pierwszym przykładzie.
Czy warto używać wtyczek stealth z puppeteer-extra razem z proxy?
Nie dokumentujemy ani nie wspieramy narzędzi mających na celu ukrycie automatyzacji lub obejście detekcji botów. Ich celem jest ominięcie decyzji serwisów o filtrowaniu odwiedzających automatycznych, co jest niezgodne z naszą Polityką Akceptowalnego Użytkowania. Renderuj strony publiczne w umiarkowanym tempie i korzystaj z oficjalnych API, jeśli strony je udostępniają.
Z którego Chrome korzysta Puppeteer z proxy?
Najnowsze wersje Puppeteer pobierają dopasowaną wersję Chrome for Testing i używają jej domyślnie. Flagi proxy i page.authenticate() działają w nim tak samo jak w zwykłym Chrome. Jeśli wskażesz Puppeteer na własnego Chrome z executablePath, dbaj o jego aktualizacje.
Uruchom Puppeteer przez proxy rezydencjalne
5,94 USD dla 10 GB, 0,50 USD/GB od 50 GB.