Zum Inhalt springen
GProxy
Registrierung
Гайды 6 Min. Lesezeit 95 Aufrufe

Scrapy Proxy-Einrichtung

Konfigurieren Sie Scrapy mit Proxy-Middleware für effizientes Web-Scraping. Rotieren Sie Proxys, um IP

Python Парсинг
Scrapy Proxy-Einrichtung

Ein HTTP-Proxy-Server fungiert als Vermittler zwischen Ihrem Web-Scraping-Skript und der Ziel-Website. Anstatt dass Ihr Scrapy-Spider direkt eine Verbindung zum Ziel herstellt, verbindet er sich mit dem Proxy-Server, der die Anfrage dann an das Ziel weiterleitet. Dies ermöglicht es Ihnen, Ihre IP-Adresse zu maskieren, geografische Beschränkungen zu umgehen und zu vermeiden, von Websites blockiert zu werden, die Anti-Scraping-Maßnahmen einsetzen. Dieser Artikel bietet eine praktische Anleitung zum Einrichten und Rotieren von Proxys mithilfe von Scrapy-Middleware.

Proxys in Scrapy mit Middleware einrichten

Scrapys Middleware-System bietet eine flexible Möglichkeit, Anfragen und Antworten zu verarbeiten. Wir können dieses System nutzen, um Proxy-Unterstützung zu implementieren. Der Prozess beinhaltet die Erstellung einer benutzerdefinierten Middleware, die Anfragen abfängt und ihnen einen Proxy-Server zuweist.

Eine benutzerdefinierte Proxy-Middleware erstellen

Erstellen Sie zunächst eine neue Python-Datei (z. B. proxy_middleware.py) in Ihrem Scrapy-Projekt. Diese Datei enthält den Code für Ihre benutzerdefinierte Proxy-Middleware.

import random

class ProxyMiddleware:
    def __init__(self, proxies):
        self.proxies = proxies

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('PROXIES'))

    def process_request(self, request, spider):
        proxy = random.choice(self.proxies)
        request.meta['proxy'] = proxy
        print(f"Using proxy: {proxy}")

    def process_response(self, request, response, spider):
         # Optional: Handle response codes to retry with a different proxy
        if response.status in [403, 429]:
            print(f"Proxy {request.meta['proxy']} blocked, retrying with another proxy.")
            return self._retry_request(request, spider)
        return response

    def _retry_request(self, request, spider):
        proxy = random.choice(self.proxies)
        request.meta['proxy'] = proxy
        new_request = request.copy()
        return new_request

Erklärung:

  • __init__(self, proxies): Der Konstruktor nimmt eine Liste von Proxys als Eingabe entgegen.
  • from_crawler(cls, crawler): Diese Klassenmethode wird von Scrapy verwendet, um eine Instanz der Middleware zu erstellen. Sie ruft die Liste der Proxys aus den Scrapy-Einstellungen ab.
  • process_request(self, request, spider): Diese Methode wird aufgerufen, bevor Scrapy eine Anfrage sendet. Sie wählt zufällig einen Proxy aus der Liste aus und weist ihn dem meta['proxy']-Attribut der Anfrage zu. Dies weist Scrapy an, den angegebenen Proxy für diese Anfrage zu verwenden.
  • process_response(self, request, response, spider): Diese Methode ermöglicht es Ihnen, die vom Server empfangene Antwort zu verarbeiten. Hier prüft sie auf Statuscodes wie 403 (Verboten) oder 429 (Zu viele Anfragen), die oft darauf hinweisen, dass der Proxy blockiert ist. Wenn ein blockierender Code gefunden wird, wird die Anfrage mit einem anderen Proxy wiederholt.
  • _retry_request(self, request, spider): Diese Methode erstellt eine neue Anfrage mit einem anderen zugewiesenen Proxy.

Scrapy-Einstellungen konfigurieren

Als Nächstes müssen Sie Ihre Scrapy-Einstellungen konfigurieren, um die Middleware zu aktivieren und eine Liste von Proxys bereitzustellen. Öffnen Sie Ihre Datei settings.py und fügen Sie Folgendes hinzu:

# settings.py

# Enable the ProxyMiddleware
DOWNLOADER_MIDDLEWARES = {
    'your_project_name.proxy_middleware.ProxyMiddleware': 350,  # Adjust priority as needed
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, # Disable the default HttpProxyMiddleware
}

# List of proxies
PROXIES = [
    'http://user1:pass1@proxy1.example.com:8080',
    'http://user2:pass2@proxy2.example.com:8080',
    'http://user3:pass3@proxy3.example.com:8080',
    'https://user4:pass4@proxy4.example.com:8080',
]

# Retry many times since proxies often fail
RETRY_TIMES = 10

# Retry on most error codes since proxies fail a lot
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 408]

# Disable default user agent middleware and use a custom one
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

Erklärung:

  • DOWNLOADER_MIDDLEWARES: Dieses Wörterbuch aktiviert und konfiguriert Downloader-Middlewares. Der Schlüssel ist der Pfad zu Ihrer Middleware-Klasse, und der Wert ist die Priorität der Middleware. Niedrigere Zahlen bedeuten höhere Priorität (Middleware wird früher ausgeführt). Die Standard-HttpProxyMiddleware ist deaktiviert, um Konflikte mit der benutzerdefinierten Middleware zu vermeiden.
  • PROXIES: Diese Liste enthält die Proxy-Server, die Sie verwenden möchten. Das Format ist protocol://user:password@host:port. Es können sowohl HTTP- als auch HTTPS-Proxys verwendet werden. Wenn kein Benutzername und Passwort erforderlich sind, lautet das Format einfach protocol://host:port.
  • RETRY_TIMES und RETRY_HTTP_CODES: Diese Einstellungen konfigurieren Scrapys Wiederholungs-Middleware. Da Proxys unzuverlässig sein können, ist es eine gute Praxis, die Anzahl der Wiederholungen zu erhöhen und häufige HTTP-Fehlercodes einzuschließen, die auf ein Proxy-Problem hinweisen könnten.
  • DOWNLOADER_MIDDLEWARES.update(...): Dieser Abschnitt deaktiviert die Standard-User-Agent-Middleware und aktiviert scrapy_user_agents, um User Agents zu rotieren. Dies hilft zu verhindern, dass Ihr Scraper leicht identifiziert wird. Sie müssen scrapy_user_agents mit pip install scrapy-user-agents installieren.

Den Spider ausführen

Jetzt können Sie Ihren Scrapy-Spider wie gewohnt ausführen. Die Middleware weist jeder Anfrage automatisch einen Proxy zu.

scrapy crawl your_spider_name

Proxy-Rotationsstrategien

Die Rotation von Proxys ist entscheidend, um zu verhindern, dass Ihr Scraper blockiert wird. Hier sind einige gängige Strategien:

  • Zufällige Auswahl: Wie im obigen Beispiel implementiert, wird für jede Anfrage zufällig ein Proxy aus der Liste ausgewählt. Dies ist der einfachste Ansatz, aber möglicherweise nicht der effektivste.
  • Sequentielle Rotation: Durchlaufen der Liste der Proxys in einer sequenziellen Weise. Dies kann nützlich sein, wenn Sie sicherstellen möchten, dass jeder Proxy gleich oft verwendet wird.
  • Intelligente Rotation: Implementierung von Logik zur Verfolgung der Leistung jedes Proxys und zur Priorisierung von Proxys, die gut funktionieren. Dies kann die Überwachung von Antwortzeiten, Fehlerraten und anderen Metriken umfassen.
  • Verwendung einer Proxy-API: Nutzung einer Proxy-Dienst-API, die die Proxy-Rotation und -Verwaltung automatisch übernimmt. Diese Dienste bieten oft Funktionen wie Geo-Targeting und IP-Adress-Reputationsmanagement.

Sequentielle Proxy-Rotation

Hier ist ein Beispiel für die Implementierung sequenzieller Proxy-Rotation in Ihrer Middleware:

import itertools

class SequentialProxyMiddleware:
    def __init__(self, proxies):
        self.proxies = itertools.cycle(proxies) # Use cycle to rotate proxies

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('PROXIES'))

    def process_request(self, request, spider):
        proxy = next(self.proxies) # Get the next proxy from the cycle
        request.meta['proxy'] = proxy
        print(f"Using proxy: {proxy}")

    def process_response(self, request, response, spider):
        if response.status in [403, 429]:
            print(f"Proxy {request.meta['proxy']} blocked, rotating to the next proxy.")
            return self._retry_request(request, spider)
        return response

    def _retry_request(self, request, spider):
        proxy = next(self.proxies)
        request.meta['proxy'] = proxy
        new_request = request.copy()
        return new_request

Wesentliche Änderung:

  • itertools.cycle(proxies): Dies erstellt einen Iterator, der unbegrenzt durch die Liste der Proxys läuft. Die Funktion next() wird verwendet, um den nächsten Proxy in der Sequenz zu erhalten.

Denken Sie daran, Ihre DOWNLOADER_MIDDLEWARES-Einstellung zu aktualisieren, um auf die SequentialProxyMiddleware zu verweisen.

Proxy-API-Integration

Die Integration mit einer Proxy-API beinhaltet typischerweise das Stellen von Anfragen an die API, um einen Proxy abzurufen, und das Verwalten der Authentifizierung und Fehlerantworten der API. Die Einzelheiten hängen von der von Ihnen gewählten API ab. Viele Proxy-Anbieter bieten Python-SDKs an, um diesen Prozess zu vereinfachen.

Proxy-Typen

Hier ist ein Vergleich verschiedener Proxy-Typen:

Merkmal HTTP-Proxy HTTPS-Proxy SOCKS-Proxy
Protokoll HTTP HTTPS SOCKS (verschiedene Versionen)
Verschlüsselung Keine Verschlüsselung zwischen Client und Proxy Verschlüsselung zwischen Client und Proxy Verschlüsselung hängt von der SOCKS-Version ab
Anwendungsfälle Web-Browsing, Scraping von HTTP-Seiten Web-Browsing, Scraping von HTTPS-Seiten Allzweck, unterstützt verschiedene Protokolle
Anonymität Kann weniger anonym sein Kann anonymer sein Kann sehr anonym sein
Konfiguration Typischerweise in Webbrowsern konfiguriert Typischerweise in Webbrowsern konfiguriert Erfordert SOCKS-Client- oder Bibliotheksunterstützung
Beispiel-URL http://host:port https://host:port socks5://host:port oder socks4://host:port
Authentifizierung Standardauthentifizierung (Benutzername/Passwort) Standardauthentifizierung (Benutzername/Passwort) Benutzername/Passwort-Authentifizierung wird unterstützt

Häufige Probleme und Fehlerbehebung

  • Proxys funktionieren nicht: Überprüfen Sie, ob der Proxy-Server online und zugänglich ist. Überprüfen Sie die Authentifizierungsdaten des Proxys (Benutzername und Passwort). Stellen Sie sicher, dass das Proxy-Format in settings.py korrekt ist.
  • Blockierte Proxys: Implementieren Sie Proxy-Rotation und erwägen Sie die Verwendung eines Proxy-Dienstes mit einem großen Pool von IP-Adressen. Überwachen Sie Antwortcodes (403, 429) und wiederholen Sie Anfragen automatisch mit anderen Proxys.
  • Langsame Leistung: Wählen Sie Proxys, die geografisch nah am Zielserver sind. Testen Sie verschiedene Proxy-Anbieter, um einen mit zuverlässiger Leistung zu finden.
  • HTTPS-Fehler: Stellen Sie sicher, dass Ihr Proxy HTTPS-Verbindungen unterstützt. Einige HTTP-Proxys unterstützen nur HTTP-Verkehr.
  • DNS-Lecks: Verwenden Sie einen SOCKS-Proxy oder konfigurieren Sie Ihr System so, dass es den DNS-Server des Proxys verwendet, um DNS-Lecks zu verhindern.

Fazit

Das Einrichten und Rotieren von Proxys in Scrapy ist unerlässlich für den Aufbau robuster und zuverlässiger Web-Scraper. Durch die Verwendung benutzerdefinierter Middleware, die Implementierung effektiver Rotationsstrategien und das Verständnis der verschiedenen Proxy-Typen können Sie das Risiko, blockiert zu werden, erheblich reduzieren und die Leistung Ihrer Scraping-Projekte verbessern. Denken Sie daran, Ihre Proxys kontinuierlich zu überwachen und Ihre Strategie bei Bedarf anzupassen, um eine optimale Scraping-Effizienz aufrechtzuerhalten.

Denken Sie daran, Ihre Proxys regelmäßig zu testen und deren Leistung zu überwachen, um sicherzustellen, dass Ihr Scraper weiterhin effektiv funktioniert. Erwägen Sie die Verwendung eines Proxy-Management-Dienstes für erweiterte Funktionen und eine einfachere Verwaltung.

Aktualisiert: 26.01.2026
Zurück zur Kategorie

Testen Sie unsere Proxys

20.000+ Proxys in über 100 Ländern weltweit

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.