Socks5Proxy

Konfiguracja proxy w Playwright, różne IP dla przeglądarek i kontekstów

Ten przewodnik pokazuje, jak w Playwright podłączyć HTTP i SOCKS5 proxy Socks5Proxy przez opcję proxy z server, username, password oraz jak używać różnych IP w różnych kontekstach przeglądarki w Node.js i Python.

Co jest wygodne w konfiguracji proxy w Playwright?

Playwright przyjmuje adres proxy, nazwę użytkownika i hasło jako jedną opcję proxy, więc nie trzeba osobno obsługiwać okien uwierzytelniania. Ta sama opcja działa w przeglądarkach Chromium, Firefox i WebKit.

Można też uruchomić jedną przeglądarkę z wieloma kontekstami, każdy z innym proxy. Konteksty to oddzielne profile z własnymi ciasteczkami i pamięcią, więc jedna przeglądarka może obsługiwać wiele IP i sesji, oszczędzając pamięć.

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 playwright
npx playwright install chromium

Jak podłączyć proxy HTTP do całej przeglądarki?

Jeśli w opcji proxy w launch dodasz server, username i password, wszystkie strony w tej przeglądarce będą używać tego samego proxy. Strony HTTPS są przekazywane przez zaszyfrowany tunel CONNECT.

import { chromium } from "playwright";

const browser = await chromium.launch({
  proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body")); // proxy IP
await browser.close();

Jak używać różnych IP dla różnych kontekstów?

Jeśli dodasz opcję proxy do newContext, tylko ten kontekst będzie używał tego proxy. Poniższy kod pobiera listę proxy przez API, tworzy 3 konteksty z różnymi IP i wyświetla IP widoczne w każdym kontekście. W przypadku pracy z wieloma kontami jednocześnie, przypisz jedno konto i jedno IP do każdego kontekstu.

W niektórych wersjach Chromium i środowiskach Windows, aby użyć proxy dla każdego kontekstu, konieczne było również posiadanie opcji proxy w launch. W takim przypadku można dodać pierwsze proxy do launch i nadpisać je dla każdego kontekstu.

import { chromium } from "playwright";

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);

const browser = await chromium.launch();
for (const line of lines) {
  const [ip, port, user, pass] = line.trim().split(":");
  const context = await browser.newContext({
    proxy: { server: "http://" + ip + ":" + port, username: user, password: pass },
    locale: "en-US",
  });
  const page = await context.newPage();
  await page.goto("https://api.ipify.org");
  console.log(ip, await page.textContent("body"));
  await context.close();
}
await browser.close();

Jak używać proxy SOCKS5?

Wystarczy dodać adres socks5:// do server. Chromium nie obsługuje uwierzytelniania nazwą użytkownika i hasłem dla SOCKS5, więc zalecamy użycie autoryzacji IP dla SOCKS5. Dodaj IPv4 swojego serwera do listy dozwolonych IP w panelu i używaj tylko server bez username i password.

Jeśli musisz połączyć się za pomocą nazwy użytkownika i hasła, użyj portu HTTP tego samego IP. IP i lokalizacja widoczne na stronie docelowej będą takie same.

import { chromium } from "playwright";

const browser = await chromium.launch({
  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.textContent("body"));
await browser.close();

Jak używać w Pythonie?

Playwright dla Pythona ma tę samą strukturę. Podaj server, username i password w słowniku proxy. Przykład dla trybu synchronicznego znajduje się poniżej. Opcje są takie same w trybie asynchronicznym.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://198.51.100.23:8000",
        "username": "spx_user",
        "password": "spx_pass",
    })
    page = browser.new_page()
    page.goto("https://api.ipify.org")
    print(page.text_content("body"))
    browser.close()

Co należy dostosować, aby wyniki wyglądały jak użytkownicy z tego kraju?

Ustaw locale i timezoneId kontekstu zgodnie z krajem IP, aby strony były renderowane w języku i czasie odpowiednim dla użytkowników z tego kraju. Na przykład dla IP z Niemiec użyj locale de-DE i timezoneId Europe/Berlin.

Jeśli nie potrzebujesz obrazów i filmów, możesz zablokować te żądania za pomocą page.route, oszczędzając przepustowość i czas. Jest to szczególnie pomocne w planach wspólnych, gdzie miesięczna przepustowość jest ograniczona.

  • Dostosuj locale i timezoneId do kraju IP
  • Jeden kontekst, jedno konto, jedno IP
  • Blokuj niepotrzebne żądania obrazów i filmów za pomocą page.route
  • SOCKS5 używa autoryzacji IP, a nazwa użytkownika i hasło są dla portu HTTP.

Jak automatycznie pobierać listę i używać jej w różnych zadaniach?

GET /proxies w API zwraca IP, port i kraj dla każdej linii w formacie JSON. Możesz filtrować według kraju, aby od razu utworzyć listę odpowiednią dla zadań w danym kraju. Poniższy kod to przykład pobierający tylko amerykańskie proxy i tworzący konteksty według liczby zadań. Nazwy pól odpowiedzi można sprawdzić w dokumentacji API.

Jeśli masz wiele zadań, nie pozostawiaj kontekstów otwartych do końca, ale zamykaj je po zakończeniu każdego zadania, aby zwolnić pamięć.

import { chromium } from "playwright";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies?country=us&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const { proxies } = await res.json();

const browser = await chromium.launch();
for (const p of proxies.slice(0, 5)) {
  const context = await browser.newContext({
    proxy: { server: "http://" + p.host + ":" + p.http_port, username: p.username, password: p.password },
    locale: "en-US",
    timezoneId: "America/New_York",
  });
  const page = await context.newPage();
  await page.goto("https://api.ipify.org");
  console.log(await page.textContent("body"));
  await context.close();
}
await browser.close();

Jak blokować niepotrzebne żądania, aby oszczędzać przepustowość?

Użyj page.route lub context.route, aby blokować żądania obrazów, czcionek i filmów. Przyspieszy to ładowanie stron i zaoszczędzi pasmo proxy. Jest to szczególnie przydatne w zadaniach zbierania danych.

await context.route("**/*", (route) => {
  const type = route.request().resourceType();
  return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});

Czy w Firefox i WebKit używa się tego samego proxy?

Tak. Playwright obsługuje te same opcje proxy dla wszystkich trzech przeglądarek. Zespoły testujące mogą uruchomić Chromium, Firefox i WebKit z tym samym proxy, aby sprawdzić, czy strony wyglądają tak samo w różnych przeglądarkach.

Firefox, podobnie jak Chromium, nie obsługuje uwierzytelniania SOCKS5 za pomocą nazwy użytkownika i hasła w przeglądarce, więc połącz się z SOCKS5 za pomocą autoryzacji IP. Port HTTP łączy się za pomocą nazwy użytkownika i hasła we wszystkich trzech przeglądarkach.

Jeśli używasz Playwright Test, możesz dodać proxy do sekcji use w playwright.config, aby zastosować je do wszystkich testów, lub podzielić projekty według krajów i przypisać różne proxy do każdego z nich.

import { defineConfig } from "@playwright/test";

export default defineConfig({
  projects: [
    { name: "us", use: { locale: "en-US", proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" } } },
    { name: "de", use: { locale: "de-DE", proxy: { server: "http://198.51.100.24:8000", username: "spx_user", password: "spx_pass" } } },
  ],
});

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

net::ERR_PROXY_CONNECTION_FAILED oznacza, że adres serwera lub port są nieprawidłowe. Błąd 407 lub inne błędy uwierzytelniania wskazują na problem z nazwą użytkownika lub hasłem. Błąd 'Browser does not support socks5 proxy authentication' pojawia się, gdy próbujesz użyć nazwy użytkownika i hasła z SOCKS5. Przełącz się na autoryzację IP lub użyj portu HTTP.

Konfiguracja proxy w Playwright, różne IP dla przeglądarek i kontekstów | Socks5Proxy