Torna al blog

Impostazione del proxy in Playwright per test headless e scraping: guida completa

Analizziamo come collegare correttamente un proxy in Playwright per test headless e scraping, con esempi di codice, rotazione IP e bypass della protezione anti-bot.

📅8 maggio 2026
```html

Playwright è uno degli strumenti più potenti per l'automazione del browser, test headless e scraping di dati. Ma senza un proxy configurato correttamente, il tuo script verrà rapidamente bloccato per IP: i siti hanno imparato a riconoscere le richieste automatizzate e a bloccarle. In questa guida esamineremo tutti i modi per collegare un proxy in Playwright - dalla configurazione di base alla rotazione IP e al bypass di Cloudflare.

Perché usare un proxy in Playwright e quando è indispensabile

Playwright avvia un vero browser (Chromium, Firefox o WebKit) in modalità background — questo è il headless. Dal punto di vista del sito, sembri un normale utente, ma solo fino a un certo punto. Non appena da un IP iniziano a provenire centinaia di richieste all'ora, gli algoritmi di protezione reagiscono immediatamente: CAPTCHA, blocco temporaneo, ban totale.

Ecco alcuni scenari concreti in cui un proxy è indispensabile:

  • Scraping di marketplace — Wildberries, Ozon, Avito, Yandex.Market bloccano gli script già dopo 50–100 richieste da un singolo IP.
  • Monitoraggio dei prezzi dei concorrenti — se esegui controlli ogni 15 minuti, senza cambiare IP verrai bloccato in poche ore.
  • Test di geolocalizzazione — è necessario controllare come appare il sito per gli utenti in Germania, Stati Uniti o Kazakistan.
  • Compilazione di moduli e registrazione di account — le piattaforme collegano gli account all'IP e bloccano la registrazione di massa.
  • Monitoraggio SEO — la raccolta delle posizioni da Google e Yandex richiede un cambio costante di IP, altrimenti il motore di ricerca mostrerà CAPTCHA.
  • Test di funzionalità A/B — alcune funzionalità sono disponibili solo per utenti di determinati paesi o regioni.

È importante capire: Playwright di per sé non ti rende anonimo. Senza proxy, tutte le richieste provengono dal tuo vero indirizzo IP. Aggiungere un proxy è il primo e più importante passo per un funzionamento stabile di qualsiasi script automatizzato.

💡 È importante sapere

Playwright supporta proxy a livello di tutto il browser, di un contesto separato (BrowserContext) e persino di una singola pagina. Questo offre flessibilità: diverse pagine possono funzionare attraverso IP diversi contemporaneamente.

Quale tipo di proxy scegliere per l'automazione headless

Non tutti i proxy sono adatti per Playwright. La scelta dipende dal compito: cosa stai scraping, quanto è aggressiva la protezione del sito e quale volume di richieste prevedi.

Tipo di proxy Livello di fiducia Velocità Adatto per
Data Center Basso Molto alta Scraping senza protezione rigorosa, test
Residenziali Alto Media Siti con Cloudflare, marketplace, social media
Mobili Massimo Media Facebook, TikTok, Instagram, rigidi anti-bot
SOCKS5 Dipende dalla fonte Alta Protocollo universale, supportato da Playwright

Per la maggior parte delle attività di scraping la scelta ottimale sono i proxy residenziali con rotazione. Hanno IP reali di utenti domestici, quindi i siti non li identificano come data center e non li bloccano automaticamente. Per i siti con protezione aggressiva (Cloudflare Bot Management, Akamai) è meglio utilizzare proxy mobili — i loro IP appartengono a operatori di telefonia mobile, il che genera la massima fiducia.

Playwright supporta i protocolli http, https e socks5. È importante: SOCKS5 non supporta l'autenticazione tramite username:password direttamente in alcune versioni — di questo si parla più dettagliatamente nella sezione sugli errori.

Configurazione di base del proxy in Playwright (JavaScript e Python)

Playwright consente di specificare un proxy all'avvio del browser tramite il parametro proxy. Questo è il modo più semplice: tutte le richieste del browser passeranno attraverso il server proxy specificato.

JavaScript / Node.js

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy.example.com:8080'
    }
  });

  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  
  const content = await page.textContent('body');
  console.log(content); // mostrerà l'IP del server proxy

  await browser.close();
})();

Python

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server": "http://proxy.example.com:8080"
        }
    )
    
    page = browser.new_page()
    page.goto("https://httpbin.org/ip")
    
    print(page.text_content("body"))  # mostrerà l'IP del proxy
    
    browser.close()

Per SOCKS5 basta cambiare lo schema nell'indirizzo del server:

# Python — proxy SOCKS5
browser = p.chromium.launch(
    proxy={
        "server": "socks5://proxy.example.com:1080"
    }
)

Per controllare rapidamente che il proxy funzioni, apri https://httpbin.org/ip o https://api.ipify.org — nella risposta dovrebbe esserci l'IP del server proxy, non il tuo reale.

Proxy con autenticazione tramite nome utente e password

La maggior parte dei fornitori di proxy commerciali utilizza l'autenticazione tramite nome utente e password — è una pratica standard. Playwright la supporta tramite i campi username e password nell'oggetto proxy.

JavaScript

const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyprovider.com:7777',
    username: 'your_login',
    password: 'your_password'
  }
});

Python

browser = p.chromium.launch(
    proxy={
        "server": "http://gate.proxyprovider.com:7777",
        "username": "your_login",
        "password": "your_password"
    }
)

Inoltre, nome utente e password possono essere passati direttamente nell'URL del server proxy — questo è comodo se stai formando la stringa dinamicamente:

# Autenticazione nell'URL (Python)
proxy_url = f"http://{login}:{password}@gate.proxyprovider.com:7777"

browser = p.chromium.launch(
    proxy={"server": proxy_url}
)

⚠️ Attenzione

Non memorizzare nome utente e password del proxy direttamente nel codice! Utilizza variabili d'ambiente (os.environ in Python o process.env in Node.js) o un file .env con la libreria dotenv.

Memorizzazione sicura tramite .env (Python)

import os
from dotenv import load_dotenv
from playwright.sync_api import sync_playwright

load_dotenv()

PROXY_SERVER   = os.getenv("PROXY_SERVER")
PROXY_LOGIN    = os.getenv("PROXY_LOGIN")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server":   PROXY_SERVER,
            "username": PROXY_LOGIN,
            "password": PROXY_PASSWORD
        }
    )
    # ...

Rotazione dei proxy: cambio IP per ogni richiesta

Un singolo proxy non salverà da un ban con un grande volume di richieste. Per uno scraping serio è necessaria la rotazione degli IP — cambio automatico del server proxy a intervalli specifici o per ogni nuova richiesta.

Ci sono due approcci alla rotazione in Playwright:

Approccio 1: Endpoint proxy rotante

La maggior parte dei fornitori di proxy residenziali fornisce un unico indirizzo gateway, che cambia automaticamente IP ad ogni connessione. Non è necessario scrivere la logica di rotazione — è integrata dal fornitore.

# Un endpoint — nuovo IP ad ogni connessione del browser
browser = p.chromium.launch(
    proxy={
        "server":   "http://rotating.proxyprovider.com:8888",
        "username": "your_login",
        "password": "your_password"
    }
)

Approccio 2: Rotazione manuale tramite lista di proxy

Se hai una lista di proxy statici, puoi implementare la rotazione manualmente — creando un nuovo browser o contesto per ogni iterazione:

import random
from playwright.sync_api import sync_playwright

PROXY_LIST = [
    {"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
    {"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
    {"server": "http://proxy3.example.com:8080", "username": "user", "password": "pass"},
]

URLS_TO_SCRAPE = [
    "https://example.com/page1",
    "https://example.com/page2",
    "https://example.com/page3",
]

with sync_playwright() as p:
    for url in URLS_TO_SCRAPE:
        proxy = random.choice(PROXY_LIST)  # proxy casuale
        
        browser = p.chromium.launch(proxy=proxy)
        page = browser.new_page()
        
        page.goto(url)
        # ... scraping dei dati ...
        
        browser.close()  # chiudiamo il browser, cambiamo IP

Approccio 3: Rotazione tramite BrowserContext (senza riavviare il browser)

with sync_playwright() as p:
    browser = p.chromium.launch()  # browser senza proxy
    
    for i, url in enumerate(URLS_TO_SCRAPE):
        proxy = PROXY_LIST[i % len(PROXY_LIST)]  # in circolo
        
        # Nuovo contesto con nuovo proxy — più veloce che riavviare il browser
        context = browser.new_context(proxy=proxy)
        page = context.new_page()
        
        page.goto(url)
        # ... scraping ...
        
        context.close()  # chiudiamo il contesto, non il browser
    
    browser.close()

Il terzo approccio è il più performante per scraping di massa. Riavviare il browser richiede 2–4 secondi, mentre creare un nuovo contesto richiede meno di 100 millisecondi.

Proxy a livello di contesto e pagina

Playwright supporta un'architettura flessibile: un browser può avere più contesti isolati, ognuno con il proprio proxy. Questo consente di lavorare parallelamente con più IP all'interno di un unico processo.

Più contesti con proxy diversi (scraping parallelo)

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();

  // Contesto 1 — proxy dalla Germania
  const context_de = await browser.newContext({
    proxy: {
      server: 'http://de-proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  // Contesto 2 — proxy dagli Stati Uniti
  const context_us = await browser.newContext({
    proxy: {
      server: 'http://us-proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  const page_de = await context_de.newPage();
  const page_us = await context_us.newPage();

  // Esecuzione parallela
  await Promise.all([
    page_de.goto('https://example.com'),
    page_us.goto('https://example.com')
  ]);

  // Entrambe le pagine vedono IP diversi
  console.log('DE IP:', await page_de.textContent('body'));
  console.log('US IP:', await page_us.textContent('body'));

  await browser.close();
})();

Questo approccio è ideale per testare la geolocalizzazione: controlli contemporaneamente come appare il sito per gli utenti di diversi paesi, senza avviare più istanze del browser.

💡 Suggerimento per le prestazioni

Per la massima parallelità, utilizza asyncio in Python o Promise.all in Node.js. Un browser può gestire 10–20 contesti paralleli senza un carico significativo sulla memoria.

Bypass della protezione anti-bot: Cloudflare, Akamai, DataDome

I proxy sono solo una parte della soluzione. I moderni sistemi anti-bot analizzano decine di segnali contemporaneamente: fingerprint del browser, comportamento del mouse, velocità di compilazione dei moduli, intestazioni HTTP e molto altro. Anche con un buon proxy, potresti essere bloccato se non consideri questi fattori.

1. Mascheramento della modalità headless

Playwright in modalità headless ha segni caratteristici che possono essere facilmente identificati: valori specifici di navigator.webdriver, assenza di plugin, dimensioni dello schermo non standard. Utilizza la libreria playwright-stealth per mascherare:

# Python: installazione
# pip install playwright-stealth

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server":   "http://residential.proxyprovider.com:8888",
            "username": "user",
            "password": "pass"
        }
    )
    page = browser.new_page()
    stealth_sync(page)  # applichiamo la mascheratura
    
    page.goto("https://bot.sannysoft.com")  # test per la rilevazione del bot
    browser.close()

2. User-Agent e viewport realistici

context = browser.new_context(
    proxy={
        "server":   "http://proxy.example.com:8080",
        "username": "user",
        "password": "pass"
    },
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    viewport={"width": 1920, "height": 1080},
    locale="ru-RU",
    timezone_id="Europe/Moscow"  # deve corrispondere alla geolocalizzazione del proxy!
)

3. Simulazione del comportamento umano

import time
import random

# Ritardi casuali tra le azioni
def human_delay(min_ms=500, max_ms=2000):
    time.sleep(random.randint(min_ms, max_ms) / 1000)

page.goto("https://example.com")
human_delay()

# Scorrimento fluido invece di immediato
page.evaluate("window.scrollBy({top: 500, behavior: 'smooth'})")
human_delay(300, 800)

# Movimento del mouse prima del clic
page.mouse.move(100, 200)
human_delay(100, 300)
page.mouse.move(300, 400)
human_delay(100, 200)
page.click("button#submit")

4. Corrispondenza del fuso orario con la geolocalizzazione del proxy

Questo viene spesso ignorato, ma i sistemi anti-bot controllano la corrispondenza: se il tuo proxy è da Mosca, ma il browser mostra il fuso orario UTC-8 (Los Angeles) — questo è un segnale di allerta. Imposta sempre timezone_id in base alla geolocalizzazione del proxy utilizzato.

Errori comuni e come risolverli

Quando si lavora con i proxy in Playwright, gli sviluppatori si imbattono regolarmente negli stessi problemi. Esaminiamo ciascuno con una soluzione concreta.

Errore 1: ERR_PROXY_CONNECTION_FAILED

Motivo: Indirizzo o porta del proxy errati, proxy non disponibile, credenziali errate.
Soluzione: Controlla la disponibilità del proxy tramite curl prima di avviare Playwright:

# Controllo del proxy tramite curl
curl -x http://user:[email protected]:8080 https://api.ipify.org

Errore 2: SOCKS5 non accetta l'autenticazione

Motivo: Playwright (Chromium) ha un supporto limitato per SOCKS5 con autenticazione tramite username/password.
Soluzione: Usa proxy HTTP con autenticazione o configura un tunnel SOCKS5 locale tramite ssh -D senza password.

Errore 3: Il proxy funziona, ma il sito blocca comunque

Motivo: Si utilizzano proxy di data center che sono nelle blacklist; la modalità headless non è mascherata; frequenza di richieste troppo alta.
Soluzione: Passa a proxy residenziali o mobili, aggiungi playwright-stealth, aumenta i ritardi tra le richieste.

Errore 4: Perdita dell'IP reale (DNS leak)

Motivo: Le richieste DNS possono bypassare il proxy.
Soluzione: Playwright di default reindirizza il DNS attraverso il proxy quando si utilizza un proxy HTTP. Ma per il controllo utilizza https://dnsleaktest.com nel browser headless.

Errore 5: Lavoro lento con il proxy

Motivo: I proxy residenziali sono più lenti di quelli di data center; grande distanza dal server proxy.
Soluzione: Scegli proxy in posizioni geograficamente vicine. Per attività senza rigorosi requisiti di anonimato, utilizza proxy di data center — sono significativamente più veloci.

Errore Soluzione rapida
ERR_PROXY_CONNECTION_FAILED Controlla curl, login/password, disponibilità della porta
407 Proxy Auth Required Aggiungi username e password nella configurazione del proxy
Il sito mostra CAPTCHA Cambia tipo di proxy in residenziali, aggiungi stealth
L'IP non cambia durante la rotazione Chiudi contesto/browser tra le richieste
Timeout di connessione Aumenta il timeout in goto(), scegli un proxy più vicino

Conclusione e raccomandazioni

Configurare un proxy in Playwright non è un compito una tantum, ma parte dell'architettura del tuo strumento di automazione. Un tipo di proxy scelto correttamente, una rotazione IP ben gestita e il mascheramento della modalità headless insieme garantiscono un funzionamento stabile anche su siti con protezione anti-bot aggressiva.

Riassumiamo le scelte del tipo di proxy per compiti specifici:

  • Scraping di dati aperti senza protezione rigorosa — andranno bene proxy rapidi di data center.
  • Marketplace (Wildberries, Ozon), aggregatori di notizie — sono necessari proxy residenziali con rotazione.
  • Social media (Instagram, Facebook, TikTok) e siti con Cloudflare — solo proxy mobili o residenziali.
  • Test di geolocalizzazione — qualsiasi tipo di proxy nel paese desiderato, l'importante è la corrispondenza del fuso orario.
  • Scraping di massa con alta frequenza — proxy residenziali rotanti con endpoint gateway.

Se stai costruendo un sistema di scraping o di test automatizzati su Playwright e hai bisogno di un funzionamento stabile senza blocchi, ti consigliamo di considerare proxy residenziali — offrono un alto livello di fiducia da parte dei siti e supportano la rotazione IP tramite un unico endpoint, semplificando l'integrazione con Playwright in poche righe di codice.

```