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.
Ü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_MIDDLEWARESden 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_LISTgefüllt ist und ob dieprocess_request-Methode der Middleware ausgeführt wird. Fügen Sie einprintoder ein Debug-Log hinzu. - Häufige 403/429-Fehler: Ihre Proxys sind möglicherweise blockiert oder zu langsam. Reduzieren Sie
CONCURRENT_REQUESTSundDOWNLOAD_DELAYoder 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 showaus, um den Handshake-Status anzuzeigen. - Scrapy ignoriert den WireGuard-Tunnel: Wenn Sie
AllowedIPs = 0.0.0.0/0festgelegt haben, sollte der gesamte Datenverkehr durch den Tunnel geleitet werden. Bestätigen Sie dies mitip routeund testen Sie mitcurl 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.