Scarnox · Blog

Proxy rotanti per lo scraping: configurazione ed errori da evitare

Un proxy rotante cambia l'indirizzo IP da cui escono le tue richieste, o a ogni richiesta o dopo un intervallo stabilito. È uno degli strumenti più comuni nel web scraping, e uno dei più usati male. Ruotare troppo poco e un solo indirizzo viene limitato nella frequenza. Ruotare troppo e il traffico non assomiglia affatto a un visitatore. Questa guida spiega i due modelli di rotazione, mostra una configurazione Python funzionante con nuovi tentativi per i proxy guasti e spiega come un campo proxy si inserisce nella risoluzione dei captcha.

Rotazione o sessioni persistenti

Un servizio di proxy rotanti può distribuire gli indirizzi in due modi:

Un visitatore reale mantiene un indirizzo per tutta la visita. Le sessioni persistenti imitano questo comportamento, quindi sono di solito il default migliore quando un sito usa cookie o sessioni. Usa la rotazione per richiesta solo per lo scraping senza stato.

Un pool rotante di base in Python

L'esempio seguente mantiene un pool di URL di proxy, li alterna e passa al successivo quando uno fallisce. Conserva le credenziali in variabili d'ambiente, mai nel codice sorgente.

import itertools
import os
import requests

# Gli URL dei proxy arrivano dall'ambiente, per esempio:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)

def fetch(url: str, max_tries: int = 3) -> requests.Response:
    last_error = None
    for _ in range(max_tries):
        proxy = next(rotation)
        try:
            r = requests.get(
                url,
                proxies={"http": proxy, "https": proxy},
                timeout=30,
            )
            if r.status_code == 407:  # autenticazione del proxy rifiutata
                raise requests.RequestException("proxy auth rejected")
            return r
        except requests.RequestException as exc:
            last_error = exc  # proxy guasto o lento: prova il successivo
    raise RuntimeError(f"all attempts failed for {url}: {last_error}")

Due dettagli contano qui. Primo, un proxy guasto deve essere ritentato su un indirizzo diverso, non sullo stesso. Secondo, una richiesta che fallisce per un errore di autenticazione deve fermarsi ed essere segnalata, invece di bruciare l'intero pool.

Monitora lo stato dei proxy

Un round robin semplice continua a inviare traffico a un proxy che ha iniziato a fallire. Tieni un punteggio semplice per ogni indirizzo: conta gli errori recenti, e rimuovi un indirizzo dal pool per un periodo di raffreddamento quando supera una soglia. Riportalo in gioco più tardi e tienilo sotto osservazione. Il tuo scraper spenderà così le sue richieste sulla parte sana del pool.

Registra il proxy usato con ogni risultato. Quando un sito inizia a restituire blocchi, vuoi sapere se la colpa è di un indirizzo, di una regione o dell'intero pool.

Dosa il pool

La rotazione distribuisce il carico tra gli indirizzi, ma ogni indirizzo ha comunque un proprio ritmo. Imposta un ritardo per indirizzo e un limite globale sul numero di richieste al secondo nell'intero pool. La rotazione non è una licenza per inviare più traffico. È un modo per mantenere il traffico di un indirizzo entro limiti ragionevoli.

Errori comuni

La maggior parte dei problemi di rotazione deriva da poche abitudini. Cambiare indirizzo nel mezzo di un login o di un flusso di acquisto spezza la sessione e rende il sito sospettoso. Una risposta 429 è un limite di frequenza imposto dal sito, non un proxy guasto, quindi passare subito a un nuovo indirizzo e riprovare non fa che propagare il problema. Cambiare indirizzo a ogni richiesta mantenendo gli stessi cookie è anch'esso incoerente, perché i cookie sono stati emessi a un visitatore diverso. Infine, un pool che non viene mai controllato si riempie silenziosamente di indirizzi morti, e il tasso di errore sale senza una causa evidente. Controlla il pool secondo una pianificazione e rimuovi ciò che non funziona.

Proxy e risoluzione dei captcha

Alcuni tipi di attività captcha possono usare il proxy che il tuo scraper utilizza. Lo passi nel campo opzionale proxy, nel formato http://user:pass@host:port, e la risoluzione avviene dallo stesso percorso di rete che usa la richiesta della pagina. Le attività proxyless saltano del tutto quel campo. Quale scegliere dipende dal fatto che il sito leghi il captcha all'indirizzo di rete, e questo compromesso è spiegato in proxy o proxyless per il captcha.

Due punti pratici:

Il tipo di captcha attivo su Scarnox oggi è PopularCaptcha. La guida Python per PopularCaptcha mostra la richiesta e come inviare il token restituito.

Scegliere i tuoi proxy

Il tipo di indirizzo che ruoti conta quanto la rotazione stessa. Gli indirizzi datacenter sono veloci ed economici per richiesta, ma spesso ottengono un punteggio basso. Gli indirizzi residenziali ottengono punteggi migliori e sono più lenti. La guida proxy residenziali e datacenter li confronta in dettaglio, e i consigli lì valgono anche per il pool che costruisci qui.

Scraping responsabile

Passi successivi

Inizia con il credito di prova gratuito, senza carta: crea un account e prova il flusso PopularCaptcha con il tuo proxy. Per le tariffe attuali, consulta la pagina dei prezzi.