Erweiterte ProxyScrape-Rotation in Scrapy: Benutzerdefinierte Downloader-Middleware mit Retry und Ban-Erkennung
Erstellen Sie eine benutzerdefinierte Scrapy-Downloader-Middleware, die ProxyScrape-Residential- und -Datacenter-Proxys rotiert, Wiederholungsversuche verarbeitet und Bans erkennt, für zuverlässiges Scraping im großen Maßstab.
Überblick
Scrapy ist ein leistungsstarkes Python-Framework für groß angelegtes Web-Scraping, aber ohne Proxy-Rotation stoßen Sie schnell auf Rate Limits und IP-Bans. Dieses Tutorial zeigt Ihnen, wie Sie eine benutzerdefinierte Scrapy-Downloader-Middleware erstellen, die ProxyScrape-Residential- und -Datacenter-Proxys rotiert, Wiederholungsversuche automatisch verarbeitet und Bans erkennt, um Daten zuverlässig zu sammeln.
ProxyScrape bietet Residential-, Datacenter- und Mobile-Proxys mit HTTP- und SOCKS5-Unterstützung, einem Pool von über 97 Mio. IPs und starker langfristiger Uptime. Sie können je nach Ihrem Scraping-Volumen Pay-as-you-go- oder monatliche Pauschalabrechnung wählen.
Voraussetzungen
- Python 3.8 oder neuer installiert.
- Scrapy installiert (
pip install scrapy). - Ein ProxyScrape-Konto mit aktivierten Residential- oder Datacenter-Proxys.
- Ihren Proxy-Endpunkt und Ihre Zugangsdaten aus dem ProxyScrape-Dashboard.
- Optional: Eine Liste einzelner Proxy-Endpunkte, wenn Sie statische Rotation gegenüber einem rotierenden Endpunkt bevorzugen.
Schritt 1: Ein Scrapy-Projekt erstellen
Öffnen Sie Ihr Terminal und erstellen Sie ein neues Scrapy-Projekt:
pip install scrapy
scrapy startproject proxyscrape_scraper
cd proxyscrape_scraper
Schritt 2: ProxyScrape-Zugangsdaten sicher speichern
Hardcodieren Sie Zugangsdaten niemals in Ihren Quelldateien. Verwenden Sie Umgebungsvariablen und lesen Sie sie in settings.py ein.
Erstellen Sie eine .env-Datei oder exportieren Sie Variablen in Ihrer Shell:
export PROXYSCRAPE_USER='your_username'
export PROXYSCRAPE_PASS='your_password'
export PROXYSCRAPE_ENDPOINT='http://proxy.proxyscrape.com:8080'
Dann fügen Sie in settings.py hinzu:
import os
PROXYSCRAPE_USER = os.getenv('PROXYSCRAPE_USER')
PROXYSCRAPE_PASS = os.getenv('PROXYSCRAPE_PASS')
PROXYSCRAPE_ENDPOINT = os.getenv('PROXYSCRAPE_ENDPOINT')
Schritt 3: Die Rotations-Middleware erstellen
Erstellen Sie eine neue Datei proxyscrape_scraper/middlewares.py und definieren Sie eine Middleware, die:
- einen Proxy aus einer Liste auswählt oder Ihren rotierenden Endpunkt verwendet.
- Zugangsdaten in die Proxy-URL einfügt.
- bei ban-bezogenen HTTP-Statuscodes erneut versucht.
# proxyscrape_scraper/middlewares.py
import random
import logging
from scrapy import signals
from scrapy.exceptions import NotConfigured
class ProxyScrapeRotationMiddleware:
def __init__(self, proxy_list, credentials):
self.proxy_list = proxy_list
self.credentials = credentials
self.logger = logging.getLogger(__name__)
@classmethod
def from_crawler(cls, crawler):
proxy_list = crawler.settings.getlist('PROXY_LIST')
credentials = (
crawler.settings.get('PROXYSCRAPE_USER'),
crawler.settings.get('PROXYSCRAPE_PASS'),
)
if not proxy_list:
raise NotConfigured('PROXY_LIST ist leer')
return cls(proxy_list, credentials)
def process_request(self, request, spider):
proxy = random.choice(self.proxy_list)
user, password = self.credentials
if user and password:
proxy = proxy.replace('://', f'://{user}:{password}@')
request.meta['proxy'] = proxy
self.logger.debug(f'Verwende Proxy: {proxy}')
def process_response(self, request, response, spider):
if response.status in [403, 429, 503]:
self.logger.warning(
f'Ban erkannt mit Status {response.status} auf {request.url}'
)
request.meta['proxy'] = None
return request.replace(dont_filter=True)
return response
Schritt 4: Einstellungen für Rotation und Wiederholungsversuche konfigurieren
Definieren Sie in settings.py Ihre Proxy-Liste, aktivieren Sie die Middleware und optimieren Sie das Wiederholungsverhalten.
# settings.py
PROXY_LIST = [
'http://proxy1.proxyscrape.com:8080',
'socks5://proxy2.proxyscrape.com:1080',
# Fügen Sie weitere Endpunkte aus Ihrem ProxyScrape-Dashboard hinzu
]
DOWNLOADER_MIDDLEWARES = {
'proxyscrape_scraper.middlewares.ProxyScrapeRotationMiddleware': 543,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
}
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [403, 429, 500, 502, 503, 504]
Schritt 5: Optional — Sticky Sessions mit Session-IDs
Wenn Ihr ProxyScrape-Tarif Sticky Sessions über Benutzernamen-Parameter unterstützt, können Sie eine Session-ID an den Benutzernamen anhängen. Prüfen Sie Ihr ProxyScrape-Dashboard auf die genaue Syntax (oft etwas wie username-session-abc123).
# Ersetzen Sie in process_request die Benutzernamen-Logik:
session_id = ''.join(random.choices('abcdef0123456789', k=8))
user = f'{self.credentials[0]}-session-{session_id}'
proxy = proxy.replace('://', f'://{user}:{self.credentials[1]}@')
Verwenden Sie Sticky Sessions, wenn Sie dieselbe IP über mehrere Anfragen an dieselbe Domain hinweg beibehalten müssen, z. B. bei Login-Abläufen oder mehrstufigen Checkouts.
Schritt 6: Ihren rotierenden Scraper testen
Erstellen Sie einen einfachen Spider, um zu überprüfen, ob Anfragen über verschiedene Proxys laufen.
# proxyscrape_scraper/spiders/ip_test.py
import scrapy
class IpTestSpider(scrapy.Spider):
name = 'ip_test'
start_urls = ['https://httpbin.org/ip']
def parse(self, response):
yield {'ip': response.json()['origin']}
Führen Sie den Spider aus und speichern Sie die Ergebnisse:
scrapy crawl ip_test -o ips.json
Öffnen Sie ips.json und bestätigen Sie, dass die ip-Werte unterschiedlich sind. Wenn Sie wiederholt dieselbe IP sehen, überprüfen Sie Ihre PROXY_LIST oder die Konfiguration des rotierenden Endpunkts.
Den richtigen ProxyScrape-Proxytyp für Scrapy wählen
| Proxy-Typ | Am besten für | Rotation | Sticky Sessions | Protokollunterstützung |
|---|---|---|---|---|
| Residential | Allgemeines Web-Scraping, geo-targetierte Daten | Rotierender Endpunkt oder Liste | Normalerweise über Session-IDs verfügbar | HTTP, SOCKS5 |
| Datacenter | Hochgeschwindigkeits-Scraping nicht geschützter Websites | Rotierender Endpunkt oder Liste | Oft statisch | HTTP, SOCKS5 |
| Mobile | Nur mobile Websites, soziale Medien, App-Tests | Rotierender Endpunkt | Normalerweise verfügbar | HTTP, SOCKS5 |
Fehlerbehebung
- Authentifizierungsfehler (407 Proxy Authentication Required): Überprüfen Sie Ihren Benutzernamen und Ihr Passwort doppelt. Wenn Sie einen rotierenden Endpunkt verwenden, stellen Sie sicher, dass die Zugangsdaten korrekt als
user:pass@host:porteingebettet sind. - Verbindungszeitüberschreitungen: Versuchen Sie, von HTTP auf SOCKS5 oder umgekehrt zu wechseln. Manche Websites blockieren ein Protokoll aggressiver. Überprüfen Sie außerdem, ob Ihre Firewall ausgehenden Datenverkehr über den Proxy-Port zulässt.
- Bans nicht erkannt: Wenn Sie weiterhin CAPTCHAs oder leere Daten erhalten, erweitern Sie Ihre Ban-Erkennung, um nach CAPTCHA-Indikatoren im Antworttext zu suchen (z. B. das Vorkommen von
captchaim HTML). Sie können auch Ihre Anfragefrequenz reduzieren undDOWNLOAD_DELAYerhöhen. - SOCKS5-Fehler: Scrapy benötigt die
requests-Bibliothek mit SOCKS-Unterstützung für SOCKS5-Proxys. Installieren Sie sie mitpip install requests[socks], wenn SieMissing dependencies for SOCKS supportsehen. - Sticky Sessions funktionieren nicht: Bestätigen Sie das genaue Format der Session-Parameter in Ihrem ProxyScrape-Dashboard. Einige Tarife verwenden
username-session-{id}, während andere ein separates Passwortfeld verwenden.
Zusammenfassung
Sie verfügen jetzt über eine produktionsreife Scrapy-Middleware, die ProxyScrape-Proxys rotiert, bei Bans erneut versucht und optional Sticky Sessions beibehält. Mit diesem Setup können Sie Ihre Scraping-Projekte skalieren, ohne sich um Rate Limits oder IP-Sperren sorgen zu müssen. Für beste Ergebnisse kombinieren Sie rotierende Residential-Proxys mit einer konservativen Download-Verzögerung und überwachen Sie Ihre Erfolgsquoten. Passen Sie Ihre PROXY_LIST und Ihre Wiederholungslogik an, wenn sich Ihre Scraping-Ziele ändern.