Guida Scrapy · 1 min di lettura

Come utilizzare i proxy con Scrapy

Scrapy instrada ogni richiesta attraverso un proxy in uno dei tre modi: una chiave meta per richiesta, una variabile d'ambiente o un middleware downloader rotante. Ecco ciascuno, con codice funzionante per proxy s4m autenticati.

Tre modi in cui Scrapy comunica con un proxy

Scrapy fornisce un HttpProxyMiddleware che è abilitato per impostazione predefinita. Legge il proxy da uno dei due luoghi: la chiave proxy nel dizionario meta di una richiesta, o le variabili ambientali standard http_proxy / https_proxy. Per un proxy fisso durante un'intera scansione, la variabile ambientale è il percorso più veloce; per il controllo e la rotazione per richiesta, imposta request.meta["proxy"] tu stesso, di solito da un middleware downloader personalizzato.

L'autenticazione è la parte che le persone trascurano. Scrapy non legge USER:PASS@ dall'URL del proxy come fa curl — si aspetta un'intestazione Proxy-Authorization. L'approccio pulito è costruire quell'intestazione una volta e allegarla nel tuo middleware. I proxy s4m si autenticano con USER:PASS contro proxy.s4m.online, HTTP sulla porta 3128 (l'abbinamento naturale per il middleware HTTP proxy di Scrapy). Per SOCKS5 dovresti anticipare la scansione con un ponte locale SOCKS-to-HTTP, ma per la maggior parte dello scraping l'endpoint HTTP è più semplice. Scopri di più nella pagina del proxy e consulta altre guide allo scraping.

Un middleware proxy rotante

Inserisci questo in middlewares.py, abilitalo in settings.py, e ogni richiesta sceglie un proxy dal tuo pool con l'intestazione di autenticazione corretta.

python
# middlewares.py
import base64
import random

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
PROXIES = [f"http://{HOST}:3128"]  # add more endpoints/ports to rotate

class S4mProxyMiddleware:
    def _auth_header(self):
        raw = f"{USER}:{PASS}".encode()
        return b"Basic " + base64.b64encode(raw)

    def process_request(self, request, spider):
        request.meta["proxy"] = random.choice(PROXIES)
        # Scrapy needs the Proxy-Authorization header explicitly:
        request.headers[b"Proxy-Authorization"] = self._auth_header()

# settings.py
DOWNLOADER_MIDDLEWARES = {
    # keep Scrapy's built-in proxy middleware after ours
    "myproject.middlewares.S4mProxyMiddleware": 350,
    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
CONCURRENT_REQUESTS = 8
DOWNLOAD_DELAY = 0.5
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]

Collegalo

Da un progetto pulito a un crawling proxy.

Aggiungi il middleware

Incolla la classe S4mProxyMiddleware nel file middlewares.py del tuo progetto e sostituisci USER, PASS e HOST con le tue credenziali s4m e l'endpoint.

Abilitalo nelle impostazioni

Registralo in DOWNLOADER_MIDDLEWARES con una priorità inferiore a quella di HttpProxyMiddleware di Scrapy (un numero più piccolo viene eseguito per primo), in modo che il tuo proxy e l'intestazione siano impostati prima che venga eseguito il middleware integrato.

Regola la cortesia

Imposta DOWNLOAD_DELAY e CONCURRENT_REQUESTS per rimanere sotto il limite di velocità del target, e abilita RETRY_HTTP_CODES per 429 e 5xx in modo che i blocchi transitori vengano riprovati automaticamente.

Verifica l'IP di uscita

Aggiungi una prima richiesta a un endpoint IP-echo come https://api.ipify.org e registra la risposta per confermare che il tuo crawl sta realmente uscendo attraverso il proxy.

Rotazione, ripetizioni e onestà

Per una rotazione reale, inserisci diversi endpoint in PROXIES e lascia che process_request ne scelga uno per richiesta; combina questo con il middleware di retry integrato di Scrapy in modo che un 429 o un 503 venga ripetuto con una nuova selezione. Mantieni DOWNLOAD_DELAY diverso da zero e la concorrenza modesta — un crawler che si ritira è molto più difficile da bloccare rispetto a uno che corre.

Due avvertenze oneste. Prima di tutto, i proxy s4m sono datacenter, non residenziali: eccellenti per API, test e siti moderatamente difesi, ma i sistemi anti-bot aggressivi possono contrassegnare gli intervalli dei datacenter. In secondo luogo, la rotazione non è una licenza per ignorare le regole di un sito — leggi robots.txt e i suoi termini. Quando hai bisogno di un'uscita consistente per una lista di autorizzazione, aggiungi un IP personale dedicato invece di ruotare. Controlla le uscite e le porte con i tools, e prototipa contro la lista di proxy gratuita prima di impegnare il traffico.

FAQ

Domande, risposte

Perché Scrapy non raccoglie il mio USER:PASS dall'URL del proxy?

A differenza di curl, HttpProxyMiddleware di Scrapy non estrae le credenziali dall'URL. Devi impostare tu stesso un'intestazione Proxy-Authorization — costruisci un'intestazione di autenticazione di base da USER:PASS come mostrato nell'esempio del middleware.

Scrapy può utilizzare un proxy SOCKS5?

Non nativamente tramite HttpProxyMiddleware, che è orientato a HTTP. Usa l'endpoint HTTP sulla porta 3128 per Scrapy, o esegui un ponte locale SOCKS-to-HTTP se hai bisogno specificamente di SOCKS5.

Come faccio a ruotare i proxy per richiesta?

Metti diversi endpoint proxy in un elenco e scegli uno in process_request, impostando request.meta["proxy"] ogni volta. Abbinalo al middleware di retry di Scrapy in modo che una richiesta bloccata venga ripetuta con una nuova selezione.

Questi sono proxy residenziali?

No. I proxy s4m sono proxy SOCKS5 e HTTP autenticati da datacenter, pagati a consumo. Si adattano alla maggior parte dello scraping, anche se obiettivi fortemente difesi possono segnalare intervalli di IP da datacenter.

Scala i tuoi crawl Scrapy

Proxy di data center autenticati su proxy.s4m.online, pagamento a consumo, pronti a ruotare tramite un middleware Scrapy. Aggiungi un IP dedicato quando un obiettivo si aspetta un'uscita coerente.

Le persone hanno trovato questa pagina cercando

Frasi di ricerca reali a cui questa pagina risponde — i collegamenti aprono la pagina che le tratta in dettaglio.