Socks5Proxy

Konfiguracja proxy w Puppeteer, podłączanie przez --proxy-server i page.authenticate

Ten przewodnik pokazuje, jak w Puppeteer podłączyć HTTP proxy Socks5Proxy przez argument --proxy-server i uwierzytelnianie page.authenticate, połączenie SOCKS5 oraz uruchamianie wielu przeglądarek z różnymi IP.

Jak działa proxy w Puppeteer?

Puppeteer określa proxy przez argumenty przekazywane podczas uruchamiania Chrome. Jeśli podasz adres w --proxy-server, wszystkie strony w tej przeglądarce będą używać tego samego proxy. Nazwy użytkownika i hasła HTTP proxy nie można przekazać przez argumenty, więc należy je przekazać przez page.authenticate po otwarciu strony. Wtedy Puppeteer automatycznie odpowiada na żądania uwierzytelnienia proxy.

Przykładowe dane: IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, nazwa użytkownika spx_user, hasło spx_pass.

npm install puppeteer

Jak połączyć proxy HTTP z uwierzytelnianiem?

W args w launch dodaj --proxy-server=198.51.100.23:8000, a zaraz po utworzeniu strony za pomocą newPage, przekaż nazwę użytkownika i hasło do page.authenticate. Uwierzytelnianie jest wymagane dla każdej strony, więc powtórz tę samą operację przy tworzeniu nowej strony.

Witryny HTTPS również otwierają się bez problemu. Przeglądarka tworzy tunel CONNECT i komunikuje się w zaszyfrowanej formie.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

Jak używać proxy SOCKS5?

Wprowadź adres socks5:// w --proxy-server. Jednak Chrome nie obsługuje uwierzytelniania nazwy użytkownika i hasła dla proxy SOCKS, więc page.authenticate nie działa z SOCKS5. Aby połączyć się z SOCKS5, użyj uwierzytelniania IP, rejestrując IPv4 serwera, na którym działa ten kod, w panelu sterowania.

Jeśli musisz połączyć się za pomocą nazwy użytkownika i hasła, najprościej jest użyć portu HTTP tego samego IP. Ponieważ jest to ten sam IP, lokalizacja widoczna na stronie docelowej będzie taka sama.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Jak uruchomić wiele przeglądarek z różnymi IP?

Chrome używa jednego proxy na uruchomioną przeglądarkę, więc jeśli potrzebujesz różnych IP, musisz uruchomić osobne przeglądarki. Poniższy kod pobiera listę ip:port:user:pass za pomocą API i uruchamia przeglądarkę dla pierwszych trzech, wyświetlając IP widoczne na każdej stronie.

Otwieranie wielu przeglądarek zużywa dużo pamięci. Zalecamy użycie kolejki zadań i ograniczenie liczby jednocześnie uruchomionych przeglądarek.

import puppeteer from "puppeteer";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

Jak otwierać strony szybciej?

Przechodząc przez proxy, obrazy, czcionki i filmy są również pobierane przez proxy, co zwiększa zużycie pasma i czasu. Jeśli potrzebujesz tylko tekstu i danych, możesz zablokować żądania obrazów i czcionek za pomocą page.setRequestInterception, aby przyspieszyć działanie i zaoszczędzić miesięczne pasmo w planach współdzielonych.

Wartość waitUntil również ma znaczenie. networkidle0 czeka na zakończenie wszystkich żądań, co może być wolne. Lepiej użyć page.waitForSelector, aby przejść do następnego kroku, gdy tylko potrzebne elementy będą widoczne.

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

Czy można używać różnych IP dla różnych stron w jednej przeglądarce?

--proxy-server w Chrome stosuje się do całej przeglądarki, co utrudnia przypisanie różnych IP do poszczególnych stron. Puppeteer 22 i nowsze pozwala na użycie różnych proxy dla każdego kontekstu za pomocą opcji proxyServer w browser.createBrowserContext. Konteksty mają oddzielne ciasteczka i magazyny, co dobrze pasuje do pracy z wieloma kontami.

Strony utworzone w kontekście też mogą używać page.authenticate do przekazania nazwy użytkownika i hasła. To zużywa mniej pamięci niż otwieranie wielu przeglądarek.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

Co należy dopasować, aby wyglądać jak użytkownik z tego kraju?

Ustaw Accept-Language za pomocą page.setExtraHTTPHeaders i strefę czasową za pomocą page.emulateTimezone zgodnie z krajem IP. Jeśli język i strefa czasowa nie pasują do kraju IP, strony mogą wyświetlać się w niewłaściwym języku lub z innym formatem daty.

Wielkość ekranu można ustawić przez page.setViewport, a do emulacji urządzeń mobilnych można użyć ustawień KnownDevices z Puppeteera w page.emulate.

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

Jak utrzymać stabilność przeglądarki podczas długotrwałych zadań?

Dla stabilności lepiej jest zamknąć przeglądarkę po przetworzeniu określonej liczby stron i otworzyć nową, zamiast trzymać jedną otwartą cały dzień. Długo działająca przeglądarka zużywa coraz więcej pamięci, a po błędzie może zatrzymać całą pracę.

Zawsze używaj try i finally do wywołania page.close, a w goto dodaj timeout, aby uniknąć zawieszenia na nieodpowiadającej stronie. Nieudane zadania można ponowić, uruchamiając nową przeglądarkę z innym proxy.

Zapisywanie czasu odpowiedzi i błędów dla każdego proxy pomaga w identyfikacji wolnych połączeń. Możesz skontaktować się z pomocą techniczną w panelu lub zmienić sposób wykonywania zadań.

Jak rozwiązać częste błędy?

net::ERR_INVALID_AUTH_CREDENTIALS lub błąd 407 oznacza, że wartości w page.authenticate są nieprawidłowe lub wywołanie zostało wykonane po newPage. Upewnij się, że wywołujesz tę funkcję przed goto dla każdej strony.

net::ERR_PROXY_CONNECTION_FAILED oznacza, że adres lub port są nieprawidłowe. Upewnij się, że używasz portu HTTP dla adresów HTTP i portu SOCKS5 dla adresów SOCKS5. Jeśli połączenie SOCKS5 jest odrzucane, sprawdź, czy IP Twojego serwera jest na liście dozwolonych IP.

Konfiguracja proxy w Puppeteer, uwierzytelnianie przez page.authenticate | Socks5Proxy