Configurazione proxy in Playwright, collegamento di IP diversi per browser e contesto
Questa guida spiega come collegare i proxy HTTP e SOCKS5 di Socks5Proxy alle opzioni proxy di Playwright con server, username e password, e come usare IP diversi per contesto in un browser, con codice Node.js e Python.
Qual è il modo più comodo per configurare il proxy in Playwright?
Playwright accetta l'indirizzo proxy, il nome utente e la password come un'unica opzione proxy, quindi non è necessario gestire separatamente la finestra di autenticazione. L'opzione è la stessa per Chromium, Firefox e WebKit.
Inoltre, quando esegui un solo browser e crei più contesti al suo interno, puoi assegnare un proxy diverso a ciascun contesto. I contesti sono profili separati con cookie e archiviazione isolati, quindi puoi gestire più IP e sessioni con un solo browser, risparmiando memoria.
L'esempio usa IP 198.51.100.23, porta HTTP 8000, porta SOCKS5 1080, username spx_user e password spx_pass.
npm install playwright
npx playwright install chromiumCome posso collegare un proxy HTTP all'intero browser?
Aggiungi server, username e password alle opzioni proxy di launch per utilizzare lo stesso proxy su tutte le pagine di quel browser. I siti HTTPS vengono passati attraverso un tunnel CONNECT cifrato.
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();Come utilizzare IP diversi per ogni contesto?
Aggiungi l'opzione proxy a newContext per utilizzare quel proxy solo per quel contesto. Il codice seguente riceve un elenco tramite API, crea 3 contesti con IP diversi e stampa l'IP visibile in ciascun contesto. Per gestire più account contemporaneamente, associa un account e un IP a ciascun contesto.
Alcune versioni di Chromium e ambienti Windows richiedono l'opzione proxy anche in launch per utilizzare proxy separati per contesto. In questi casi, è sufficiente inserire il primo proxy in launch e sovrascriverlo per ogni contesto.
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();Come si usa un proxy SOCKS5?
Inserisci l'indirizzo socks5:// nel server. Chromium non supporta l'autenticazione username e password per SOCKS5, quindi consigliamo di connettersi con autenticazione IP per SOCKS5. Registra l'IPv4 del server di esecuzione nel dashboard e inserisci solo server senza username e password.
Se serve username e password, usa la porta HTTP dello stesso IP. Il sito di destinazione vedrà lo stesso IP e posizione.
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();Come si usa in Python?
Playwright per Python ha la stessa struttura. Inserisci server, nome utente e password nel dizionario proxy. Di seguito è riportato un esempio sincrono. I nomi delle opzioni sono gli stessi anche per il metodo asincrono.
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()Cosa bisogna allineare per far apparire i risultati come quelli di un utente di quel paese?
Imposta sia locale che timezoneId del contesto in base al paese dell'IP per visualizzare la pagina nella lingua e nel fuso orario degli utenti di quel paese. Ad esempio, per un IP tedesco, usa locale de-DE e timezoneId Europe/Berlin.
Se non sono necessari immagini e video, puoi bloccare queste richieste con page.route per risparmiare banda e tempo. Soprattutto utile per piani condivisi che hanno una banda mensile limitata.
- Imposta locale e timezoneId in base al paese dell'IP
- Un contesto, un account, un IP
- Blocca le richieste di immagini e video non necessarie con page.route
- SOCKS5 con autorizzazione IP, username e password sulla porta HTTP
Come scaricare automaticamente l'elenco e dividerlo per ogni attività?
GET /proxies dell'API restituisce in JSON per ogni riga IP, porta e paese. Filtra per paese per creare liste adatte a lavori specifici. Questo codice crea contesti per proxy USA in base al numero di lavori. I campi sono documentati.
Se hai molti lavori, non lasciare i contesti aperti fino alla fine, ma chiudili quando il lavoro è completato per liberare memoria.
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();Come risparmiare larghezza di banda bloccando le richieste non necessarie?
Bloccare le richieste di immagini, font e video con page.route o context.route accelera l'apertura della pagina e risparmia larghezza di banda del proxy. È particolarmente efficace per le attività di raccolta dati.
await context.route("**/*", (route) => {
const type = route.request().resourceType();
return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});Si può usare lo stesso proxy su Firefox e WebKit?
Sì. Playwright accetta la stessa opzione proxy per tutti e tre i browser. Se hai un team di test, puoi utilizzare lo stesso proxy per aprire Chromium, Firefox e WebKit in sequenza e verificare che le pagine siano coerenti tra i browser.
Come Chromium, Firefox non supporta l'autenticazione SOCKS5 con username e password nel browser, quindi connettiti tramite autorizzazione IP. La porta HTTP si connette con username e password in tutti e tre i browser.
Se usi Playwright Test, puoi inserire proxy nella sezione use di playwright.config per applicarlo a tutti i test o dividere i progetti per paese e assegnare proxy diversi a ciascuno.
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" } } },
],
});Come risolvere gli errori più frequenti?
net::ERR_PROXY_CONNECTION_FAILED indica che l'indirizzo o la porta del server sono errati. Gli errori 407 o relativi all'autenticazione richiedono la verifica dei valori di username e password. L'errore 'Browser does not support socks5 proxy authentication' si verifica quando si inseriscono username e password per SOCKS5. Cambia in autenticazione IP o utilizza la porta HTTP.