Skip to content
Advanced / 8 min read

Scrapy-Proxy-Rotation: Wie man Proxys in Scrapy rotiert (und wann ein dediziertes WireGuard-Gateway besser ist)

Implementieren Sie Proxy-Rotation in Scrapy mit benutzerdefinierter Middleware, gehen Sie elegant mit Sperren um und erfahren Sie, wann ein stabiles WireGuard-Gateway wie NordLayer die richtige Wahl für SEO-Monitoring und Web-Scraping ist.

Linux WireGuard Web Scraping SEO-Monitoring

Überblick

Web-Scraping in großem Umfang stößt oft auf Ratenbegrenzungen, IP-Sperren oder Geo-Beschränkungen. Scrapy, ein beliebtes Python-Framework, rotiert Proxys nicht von Haus aus. Dieses Tutorial zeigt Ihnen, wie Sie eine rotierende Proxy-Middleware für Scrapy erstellen, Wiederholungsversuche konfigurieren und entscheiden, wann ein dediziertes WireGuard-VPN-Gateway (wie NordLayer) besser geeignet ist als ein Pool rotierender Proxys.

Sie lernen zwei Ansätze kennen:

  • Rotierende Proxys: Verwenden Sie viele IPs pro Sitzung, um Anfragen zu verteilen und Blockierungen zu vermeiden.
  • Dediziertes WireGuard-Gateway: Verwenden Sie eine einzelne, stabile IP für Aufgaben, die Konsistenz erfordern, wie Rank-Tracking, Ad-Verifizierung oder den Zugriff auf geospezifische Inhalte, die IP-Änderungen bestrafen.

NordLayer bietet WireGuard-Tunnel in Unternehmensqualität mit dedizierten Gateways und monatlicher Pauschalabrechnung. Es ist kein rotierender Proxy-Dienst, kann aber als stabile Egress-IP für Ihre Scrapy-Spider dienen, wenn Konsistenz wichtig ist.

Voraussetzungen

  • Python 3.7 oder höher
  • Grundlegende Kenntnisse von Scrapy
  • Eine Liste von HTTP/HTTPS- oder SOCKS5-Proxys (für den Rotationsansatz)
  • Optional: ein NordLayer-Konto mit einem dedizierten WireGuard-Gateway (für den Ansatz mit stabiler IP)
  • Ein Linux-Server oder lokaler Rechner (Befehle für Debian/Ubuntu gezeigt; für andere Systeme anpassen)

Proxy-Rotation in Scrapy verstehen

Scrapy verwendet Downloader-Middlewares, um Anfragen und Antworten zu verarbeiten. Um Proxys zu rotieren, fangen Sie jede Anfrage ab, weisen einen Proxy aus einem Pool zu und wiederholen Sie optional mit einem neuen Proxy, wenn eine Anfrage fehlschlägt.

Schlüsselkonzepte:

  • Proxy-Pool: eine Liste von Proxy-URLs (mit Anmeldeinformationen, falls erforderlich).
  • Rotationsstrategie: Zufallsauswahl, Round-Robin oder gewichtet nach Proxy-Zustand.
  • Wiederholungslogik: Fehlgeschlagene Anfragen mit einem anderen Proxy erneut in die Warteschlange stellen.

Wann stattdessen ein dediziertes WireGuard-Gateway in Betracht gezogen werden sollte:

  • Sie benötigen eine konsistente IP für SEO-Rank-Tracking über mehrere Standorte hinweg.
  • Ihre Zielseite blockiert häufige IP-Änderungen aggressiver als statische IPs.
  • Sie möchten verschlüsselten, teamverwalteten Zugriff, ohne eine Proxy-Liste pflegen zu müssen.

Schritte

1. Scrapy installieren und ein Projekt erstellen

Falls noch nicht geschehen, installieren Sie Scrapy und erstellen Sie ein neues Projekt.

pip install scrapy
scrapy startproject proxy_scraper
cd proxy_scraper
scrapy genspider example example.com

2. Eine rotierende Proxy-Middleware erstellen

Öffnen Sie proxy_scraper/middlewares.py und fügen Sie die folgende Middleware hinzu. Sie wählt für jede Anfrage einen zufälligen Proxy aus und wiederholt bei gängigen Block-Statuscodes.

# proxy_scraper/middlewares.py
import random
from scrapy import signals
from scrapy.exceptions import NotConfigured

class RotatingProxyMiddleware:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list
        self.current_proxy = None

    @classmethod
    def from_crawler(cls, crawler):
        proxy_list = crawler.settings.getlist('ROTATING_PROXY_LIST')
        if not proxy_list:
            raise NotConfigured('ROTATING_PROXY_LIST ist leer')
        return cls(proxy_list)

    def process_request(self, request, spider):
        self.current_proxy = random.choice(self.proxy_list)
        request.meta['proxy'] = self.current_proxy
        spider.logger.debug(f'Verwende Proxy: {self.current_proxy}')

    def process_response(self, request, response, spider):
        if response.status in [403, 429]:
            spider.logger.warning(f'Blockiert mit Proxy {self.current_proxy}. Wiederhole...')
            new_request = request.copy()
            new_request.dont_filter = True
            return new_request
        return response

3. Einstellungen konfigurieren, um die Middleware zu aktivieren und Proxys zu definieren

Bearbeiten Sie proxy_scraper/settings.py, um die Middleware zu aktivieren und Ihre Proxy-Liste anzugeben. Ersetzen Sie die Beispiel-Proxys durch Ihre eigenen.

# proxy_scraper/settings.py

DOWNLOADER_MIDDLEWARES = {
    'proxy_scraper.middlewares.RotatingProxyMiddleware': 543,
}

ROTATING_PROXY_LIST = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'socks5://user:[email protected]:1080',
]

# Optional: Wiederholungseinstellungen
RETRY_TIMES = 5
RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429, 403]

4. Rotation mit einem einfachen Spider testen

Führen Sie Ihren Spider aus und beobachten Sie die DEBUG-Protokolle, um zu bestätigen, dass verschiedene Proxys verwendet werden.

scrapy crawl example -L DEBUG

Wenn Sie Zeilen wie Verwende Proxy: http://... sehen, funktioniert die Middleware. Wenn alle Anfragen denselben Proxy verwenden, überprüfen Sie die Middleware-Reihenfolge und ob ROTATING_PROXY_LIST nicht leer ist.

5. Zuverlässigkeit mit Health-Checks und Backoff verbessern

Fügen Sie für Produktions-Scraping eine grundlegende Proxy-Zustandsverfolgung hinzu. Dieses Beispiel markiert einen Proxy nach wiederholten Blockierungen als fehlgeschlagen und entfernt ihn vorübergehend.

# proxy_scraper/middlewares.py (erweitert)
import random
from collections import defaultdict

class RotatingProxyMiddleware:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list
        self.failure_count = defaultdict(int)
        self.max_failures = 3

    @classmethod
    def from_crawler(cls, crawler):
        proxy_list = crawler.settings.getlist('ROTATING_PROXY_LIST')
        return cls(proxy_list)

    def process_request(self, request, spider):
        available = [p for p in self.proxy_list if self.failure_count[p] < self.max_failures]
        if not available:
            spider.logger.error('Alle Proxys erschöpft')
            return
        proxy = random.choice(available)
        request.meta['proxy'] = proxy

    def process_response(self, request, response, spider):
        proxy = request.meta.get('proxy')
        if response.status in [403, 429]:
            self.failure_count[proxy] += 1
            new_request = request.copy()
            new_request.dont_filter = True
            return new_request
        else:
            self.failure_count[proxy] = 0
        return response

6. Wann auf ein dediziertes WireGuard-Gateway umgestiegen werden sollte

Rotierende Proxys sind hervorragend für groß angelegtes, zustandsloses Scraping geeignet. Aber einige Aufgaben erfordern eine stabile, dedizierte IP:

  • SEO-Rank-Tracking, bei dem Sie konsistente Standortdaten benötigen
  • Zugriff auf APIs, die Sitzungen an eine IP binden
  • Teambasiertes Scraping, bei dem mehrere Benutzer dieselbe Egress-IP gemeinsam nutzen

NordLayer WireGuard-Tunnel bieten Ihnen ein dediziertes Gateway mit monatlicher Pauschalabrechnung. Sie können den gesamten Scrapy-Datenverkehr durch den Tunnel leiten und effektiv eine einzelne statische IP verwenden.

7. WireGuard unter Linux einrichten und Scrapy darüber leiten

Installieren Sie WireGuard und konfigurieren Sie einen Tunnel mit den Anmeldeinformationen von Ihrem NordLayer-Gateway.

sudo apt update
sudo apt install wireguard

Erstellen Sie eine Konfigurationsdatei unter /etc/wireguard/wg0.conf (ersetzen Sie die Platzhalter durch Ihre NordLayer-Werte).

[Interface]
PrivateKey = <your-private-key>
Address = 10.0.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = <nordlayer-public-key>
Endpoint = <gateway-ip>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Stellen Sie den Tunnel her:

sudo wg-quick up wg0

Jetzt verlässt der gesamte Scrapy-Datenverkehr (und jeder andere Datenverkehr) das System über das NordLayer-Gateway. Überprüfen Sie, ob sich Ihre öffentliche IP geändert hat:

curl ifconfig.me

Führen Sie Ihren Scrapy-Spider wie gewohnt aus. Er verwendet die stabile Gateway-IP.

8. Ansätze für Hybrid-Scraping kombinieren

Sie können beides verwenden: Leiten Sie die meisten Anfragen über rotierende Proxys, senden Sie aber Anfragen, die eine konsistente IP benötigen, durch den WireGuard-Tunnel. In Scrapy können Sie den Proxy für bestimmte Anfragen bedingt auf None setzen (wodurch die Standardroute des Systems verwendet wird, d. h. der WireGuard-Tunnel).

# Beispiel: In einem Spider für Rank-Tracking-Anfragen keinen Proxy festlegen
# Die Standardroute (WireGuard) wird verwendet.
def start_requests(self):
    # Rotierende Proxys für allgemeine Seiten
    yield scrapy.Request('https://example.com/general', meta={'proxy': None})
    # Für Rank-Tracking die rotierende Middleware umgehen
    yield scrapy.Request('https://example.com/serp', meta={'proxy': 'direct'})

Dann ändern Sie die Middleware, um die Rotation zu überspringen, wenn proxy == 'direct':

def process_request(self, request, spider):
    if request.meta.get('proxy') == 'direct':
        return None  # Standardroute verwenden
    # ... Rest der Rotationslogik

Fehlerbehebung

  • Middleware nicht angewendet: Stellen Sie sicher, dass DOWNLOADER_MIDDLEWARES den richtigen Pfad enthält und dass der Wert (543) nicht mit anderen Middlewares kollidiert. Überprüfen Sie die Standard-Middleware-Reihenfolge von Scrapy.
  • Alle Anfragen verwenden immer noch dieselbe IP: Überprüfen Sie, ob ROTATING_PROXY_LIST gefüllt ist und ob die process_request-Methode der Middleware ausgeführt wird. Fügen Sie ein print oder ein Debug-Log hinzu.
  • Häufige 403/429-Fehler: Ihre Proxys sind möglicherweise blockiert oder zu langsam. Reduzieren Sie CONCURRENT_REQUESTS und DOWNLOAD_DELAY oder wechseln Sie zu hochwertigeren Proxys. Ziehen Sie ein dediziertes WireGuard-Gateway in Betracht, wenn die Zielseite rotierende IPs aggressiv blockiert.
  • WireGuard-Tunnel kann keine Verbindung herstellen: Überprüfen Sie den privaten Schlüssel, den öffentlichen Schlüssel, den Endpunkt und die Firewall-Regeln (standardmäßig UDP-Port 51820). Führen Sie sudo wg show aus, um den Handshake-Status anzuzeigen.
  • Scrapy ignoriert den WireGuard-Tunnel: Wenn Sie AllowedIPs = 0.0.0.0/0 festgelegt haben, sollte der gesamte Datenverkehr durch den Tunnel geleitet werden. Bestätigen Sie dies mit ip route und testen Sie mit curl ifconfig.me.

Zusammenfassung

Sie wissen jetzt, wie Sie Proxy-Rotation in Scrapy mit benutzerdefinierter Middleware implementieren, Wiederholungslogik hinzufügen und die Proxy-Zustände überwachen. Für Projekte, die eine stabile, dedizierte IP erfordern – wie SEO-Rank-Tracking oder teambasierten Zugriff – kann ein WireGuard-Gateway wie NordLayer rotierende Proxys ergänzen oder ersetzen. Wählen Sie den Ansatz, der Ihren Scraping-Zielen entspricht: Rotation für Skalierung und Anonymität, dedizierte Gateways für Konsistenz und Kontrolle.