Scrapy-Anleitung · 1 Min Lesezeit

Wie man Proxys mit Scrapy verwendet

Scrapy leitet jede Anfrage auf eine von drei Arten über einen Proxy: einen Meta-Schlüssel pro Anfrage, eine Umgebungsvariable oder eine rotierende Downloader-Middleware. Hier ist jede, mit funktionierendem Code für authentifizierte s4m-Proxys.

Drei Möglichkeiten, wie Scrapy mit einem Proxy kommuniziert

Scrapy bietet ein HttpProxyMiddleware, das standardmäßig aktiviert ist. Es liest den Proxy aus einem von zwei Orten: dem proxy Schlüssel im meta Dictionary einer Anfrage oder den standardmäßigen http_proxy / https_proxy Umgebungsvariablen. Für einen festen Proxy während eines gesamten Crawls ist die Umgebungsvariable der schnellste Weg; für die Kontrolle und Rotation pro Anfrage setzen Sie request.meta["proxy"] selbst, normalerweise von einer benutzerdefinierten Downloader-Middleware.

Die Authentifizierung ist der Teil, den die Leute übersehen. Scrapy liest nicht USER:PASS@ aus der Proxy-URL, wie es curl tut — es erwartet einen Proxy-Authorization Header. Der saubere Ansatz ist, diesen Header einmal zu erstellen und in Ihrer Middleware anzuhängen. s4m Proxys authentifizieren sich mit USER:PASS gegen proxy.s4m.online, HTTP auf Port 3128 (die natürliche Anpassung für Scrapy's HTTP Proxy Middleware). Für SOCKS5 würden Sie den Crawl mit einer lokalen SOCKS-zu-HTTP-Brücke voranstellen, aber für die meisten Scraping-Vorgänge ist der HTTP-Endpunkt einfacher. Erfahren Sie mehr auf der Proxy-Seite und sehen Sie sich andere Scraping-Anleitungen an.

Ein rotierendes Proxy-Middleware

Fügen Sie dies in middlewares.py ein, aktivieren Sie es in settings.py, und jede Anfrage wählt einen Proxy aus Ihrem Pool mit dem richtigen Auth-Header aus.

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]

Verdrahten Sie es

Von einem sauberen Projekt zu einem proxied Crawl.

Fügen Sie die Middleware hinzu

Fügen Sie die S4mProxyMiddleware-Klasse in die middlewares.py Ihres Projekts ein und ersetzen Sie USER, PASS und HOST durch Ihre s4m-Anmeldeinformationen und den Endpunkt.

Aktiviere es in den Einstellungen

Registriere es in DOWNLOADER_MIDDLEWARES mit einer Priorität unter Scrapy's HttpProxyMiddleware (eine kleinere Zahl läuft zuerst), damit dein Proxy und Header gesetzt werden, bevor die integrierte Middleware läuft.

Höflichkeit einstellen

Setzen Sie DOWNLOAD_DELAY und CONCURRENT_REQUESTS, um unter dem Ratenlimit des Ziels zu bleiben, und aktivieren Sie RETRY_HTTP_CODES für 429 und 5xx, damit vorübergehende Blockierungen automatisch erneut versucht werden.

Überprüfen Sie die Ausgangs-IP

Füge eine erste Anfrage an einen IP-Echo-Endpunkt wie https://api.ipify.org hinzu und protokolliere die Antwort, um zu bestätigen, dass dein Crawl wirklich über den Proxy ausgeht.

Rotation, Wiederholungen und Ehrlichkeit

Für echte Rotation, fügen Sie mehrere Endpunkte in PROXIES ein und lassen Sie process_request einen pro Anfrage auswählen; kombinieren Sie das mit Scrapy's eingebautem Retry-Middleware, sodass ein 429 oder 503 bei einer frischen Auswahl erneut versucht wird. Halten Sie DOWNLOAD_DELAY ungleich null und die Parallelität moderat — ein Crawler, der zurückschreckt, ist viel schwerer zu blockieren als einer, der sprintet.

Zwei ehrliche Warnungen. Erstens, s4m-Proxys sind Datacenter, nicht residential: ausgezeichnet für APIs, Tests und moderat geschützte Seiten, aber aggressive Anti-Bot-Systeme können Datacenter-Bereiche kennzeichnen. Zweitens, Rotation ist keine Lizenz, die Regeln einer Seite zu ignorieren — lesen Sie robots.txt und die Nutzungsbedingungen. Wenn Sie einen einzigen konsistenten Ausgang für eine Erlaubenliste benötigen, fügen Sie stattdessen eine dedizierte persönliche IP hinzu, anstatt zu rotieren. Überprüfen Sie Ausgänge und Ports mit den Tools und prototypisieren Sie gegen die kostenlose Proxyliste, bevor Sie Traffic senden.

FAQ

Fragen, beantwortet

Warum erkennt Scrapy mein USER:PASS aus der Proxy-URL nicht?

Im Gegensatz zu curl analysiert Scrapy's HttpProxyMiddleware keine Anmeldeinformationen aus der URL. Sie müssen selbst einen Proxy-Authorization-Header setzen – erstellen Sie einen Basic-Auth-Header aus USER:PASS, wie im Middleware-Beispiel gezeigt.

Kann Scrapy einen SOCKS5-Proxy verwenden?

Nicht nativ über HttpProxyMiddleware, das HTTP-orientiert ist. Verwenden Sie den HTTP-Endpunkt auf Port 3128 für Scrapy oder betreiben Sie eine lokale SOCKS-zu-HTTP-Brücke, wenn Sie speziell SOCKS5 benötigen.

Wie rotiere ich Proxys pro Anfrage?

Setzen Sie mehrere Proxy-Endpunkte in eine Liste und wählen Sie einen in process_request aus, indem Sie request.meta["proxy"] jedes Mal festlegen. Kombinieren Sie es mit Scrapy's Retry-Middleware, damit eine blockierte Anfrage bei einer neuen Auswahl erneut versucht wird.

Sind das Wohnproxys?

Nein. s4m-Proxys sind authentifizierte Datacenter-SOCKS5- und HTTP-Proxys, die nach Verbrauch abgerechnet werden. Sie eignen sich für die meisten Scraping-Anwendungen, obwohl stark geschützte Ziele Datacenter-IP-Bereiche kennzeichnen können.

Skalieren Sie Ihre Scrapy-Crawls

Authentifizierte Datacenter-Proxys auf proxy.s4m.online, nutzungsabhängig, bereit zur Rotation durch eine Scrapy-Middleware. Fügen Sie eine dedizierte IP hinzu, wenn ein Ziel eine konsistente Ausgangs-IP erwartet.

Menschen fanden diese Seite durch die Suche nach

Echte Suchphrasen, auf die diese Seite antwortet — die verlinkten öffnen die Seite, die sie ausführlich behandelt.