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 demmeta['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-HttpProxyMiddlewareist deaktiviert, um Konflikte mit der benutzerdefinierten Middleware zu vermeiden.PROXIES: Diese Liste enthält die Proxy-Server, die Sie verwenden möchten. Das Format istprotocol://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 einfachprotocol://host:port.RETRY_TIMESundRETRY_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 aktiviertscrapy_user_agents, um User Agents zu rotieren. Dies hilft zu verhindern, dass Ihr Scraper leicht identifiziert wird. Sie müssenscrapy_user_agentsmitpip install scrapy-user-agentsinstallieren.
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 Funktionnext()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.pykorrekt 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.