Skip to content
Advanced / 6 min read

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.

Linux SOCKS5 HTTP(S) Web Scraping

Ü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:port eingebettet 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 captcha im HTML). Sie können auch Ihre Anfragefrequenz reduzieren und DOWNLOAD_DELAY erhöhen.
  • SOCKS5-Fehler: Scrapy benötigt die requests-Bibliothek mit SOCKS-Unterstützung für SOCKS5-Proxys. Installieren Sie sie mit pip install requests[socks], wenn Sie Missing dependencies for SOCKS support sehen.
  • 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.