Skip to content
Artikel / 6 Min. Lesezeit

Rotierende Proxies für Web Scraping: Python requests, Scrapy-Middleware und Rank-Tracking

Ein praktischer Leitfaden zu rotierenden Proxies in Python und Scrapy – Pool-Auswahl, Sticky Sessions versus Rotation pro Anfrage, funktionierender Middleware-Code, Ban-Erkennung und warum Rank-Tracker Standortkonsistenz mehr brauchen als reine IP-Menge.

Wenn Sie ein paar hundert Seiten von einer einzigen IP scrapen, stoßen Sie irgendwann auf ein Rate Limit, ein CAPTCHA oder einen Soft Block. Rotation ist die Standardlösung – aber schlechte Rotation ist schlimmer als keine: Sie verbrennt Proxy-Budget, erschwert das Debugging und kann sogar bot-artiger wirken als ein gleichmäßiger, höflicher Crawler.

Dieser Leitfaden behandelt, wie Rotation funktioniert, wie Sie sie in Python mit requests und in Scrapy mit einer Downloader-Middleware implementieren, und wie dieselben Techniken auf SERP-Rank-Tracking angewendet werden.

Bevor Sie rotieren, prüfen Sie, ob Rotation das Problem ist

Rotation verdeckt Blocks auf IP-Ebene. Sie behebt nicht:

  • Ein Musterproblem. Keine noch so große Anzahl an IPs rettet einen Crawler, der dieselbe URL fünfzig Mal pro Sekunde mit einem Standard-User-Agent anfordert.
  • Ein Session-Problem. Wenn Ihr Ablauf erfordert, eingeloggt zu bleiben, wirkt eine neue IP mitten in der Session wie Account-Diebstahl.
  • Ein Geo-Problem. Wenn der benötigte Inhalt regionalsperrt ist, brauchen Sie das richtige Land, nicht mehr IPs.

Diagnostizieren Sie zuerst: Protokollieren Sie Statuscodes, Antwortinhalte und Antwortzeiten pro IP. Wenn jede IP ein 200 erhält und eine bestimmte Seite einen Block zurückgibt, ist Ihr Problem das Anfrageverhalten, nicht die IP-Reputation.

Wählen Sie einen Proxy-Typ, der zur Aufgabe passt

Typ Typische Stärke Achten Sie auf
Datacenter Schnell, hohe Parallelität, weit verbreitet Leicht identifizierbar; von strengen Websites blockiert
Residential Fügt sich in echten Nutzerverkehr ein Langsamer; Bandbreitenlimits; Session-Handling wichtig
Mobile Hohes Vertrauen, am schwersten zu blockieren Teuer; instabil; weniger gleichzeitige Sessions
ISP / statisches Residential Stabile, konsistente IP Kleinere Pools; weniger Rotation

Für strukturierte Daten auf toleranten Websites reicht Datacenter normalerweise aus. Für Suchergebnisse, Marktplätze und Reise-Websites sind in der Regel Residential- oder Mobile-Proxies erforderlich. Bewerten Sie Anbieter nach Rotationsgranularität, Session-Kontrolle, Geo-Abdeckung und dem Umgang mit Bans – nicht nach einer Schlagzeilen-Anzahl von IPs.

Rotationsstrategien

Rotation pro Anfrage

Jede Anfrage geht von einer IP aus, die aus dem Pool gewählt wird. Viele Anbieter stellen dies als einen einzelnen rotierenden Gateway-Hostnamen plus Port bereit oder als Session-Token im Benutzernamen. Am besten für zustandslose Seitenabrufe.

Sticky Sessions

Dieselbe IP wird für ein definiertes Zeitfenster wiederverwendet oder bis Sie sie freigeben. Verwenden Sie dies für mehrstufige Abläufe: suchen, Angebot öffnen, Detailseite lesen. In den meisten kommerziellen Pools wird die Stickiness durch eine Session-ID im Proxy-Benutzernamen gesteuert, und eine neue ID erzeugt eine neue IP.

Geografische Stickiness

Für Rank-Tracking und Preisprüfungen möchten Sie normalerweise dieselbe Stadt oder dasselbe Land über einen Abfragesatz hinweg, da die Ergebnisse je nach Standort variieren. Rotieren Sie innerhalb eines Geos, nicht über Geos hinweg.

Drosselung der Parallelität

Rotation und Rate Limiting ergänzen sich, sie ersetzen sich nicht. Ein Crawler mit fünf gleichzeitigen Anfragen, der Retry-After respektiert, ist besser als einer mit zweihundert Threads, die jede IP so lange bombardieren, bis sie gebannt ist.

Python: rotierende Proxies mit requests

Installieren Sie SOCKS-Unterstützung, wenn Sie sie benötigen. Die Bibliothek requests verwendet darunter PySocks:

pip install "requests[socks]"

Dann rotieren Sie über einen Pool:

import itertools
import requests

POOL = [
    'http://user:[email protected]:8000',
    'http://user:[email protected]:8000',
    'socks5h://user:[email protected]:1080',
]

proxy_cycle = itertools.cycle(POOL)

def fetch(url, timeout=20):
    proxy = next(proxy_cycle)
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, proxies=proxies, timeout=timeout)
    response.raise_for_status()
    return response.text

Ein paar Dinge, die sich in der Produktion lohnen:

  • Wiederholen Sie mit einem anderen Proxy bei 429 oder 403, nicht mit demselben.
  • Verwenden Sie requests.Session() zur Wiederverwendung von Verbindungen, aber erstellen Sie eine Session pro IP statt einer Session für den gesamten Crawl.
  • Protokollieren Sie, welcher Proxy welches Ergebnis geliefert hat, damit Sie schlechte IPs aussortieren können, statt sie erneut zu ziehen.
  • Verwenden Sie socks5h:// (beachten Sie das h), wenn Hostnamen am Proxy statt lokal aufgelöst werden sollen.

Scrapy: eine Downloader-Middleware für rotierende Proxies

Scrapy behandelt die Proxy-Authentifizierung bereits über seine integrierte HTTP-Proxy-Middleware, Sie müssen also nur request.meta['proxy'] setzen, bevor die Anfrage gesendet wird. Eine einfache Rotations-Middleware sieht so aus:

import random

class RotatingProxyMiddleware:
    def __init__(self, proxies):
        self.proxies = proxies

    @classmethod
    def from_crawler(cls, crawler):
        proxies = crawler.settings.getlist('ROTATING_PROXIES')
        if not proxies:
            raise ValueError('ROTATING_PROXIES is empty')
        return cls(proxies)

    def process_request(self, request, spider):
        request.meta['proxy'] = random.choice(self.proxies)

Registrieren Sie sie in Ihrem Einstellungsmodul:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.RotatingProxyMiddleware': 350,
}

ROTATING_PROXIES = [
    'http://user:[email protected]:8000',
    'http://user:[email protected]:8000',
]

AUTOTHROTTLE_ENABLED = True
RETRY_HTTP_CODES = [403, 429, 500, 502, 503, 504]

Zwei Hinweise:

  • Ein naives random.choice verwendet weiterhin gebannte IPs. Community-Projekte wie scrapy-rotating-proxies ergänzen Ban-Erkennung und Statistiken pro Proxy auf Basis derselben Idee, was die Abhängigkeit wert ist, sobald Sie über eine Handvoll Anfragen hinaus skalieren.
  • Scrapys Retry-Middleware wiederholt normalerweise mit demselben Proxy. Wenn Bans Ihr Problem sind, lassen Sie den Retry-Pfad die Proxy-Auswahl erneut ausführen.

Denselben Ansatz auf Rank-Tracking anwenden

Rank-Tracker haben eine Proxy-Anforderung, die generische Scraper nicht haben: Standortkonsistenz. Ein Keyword, das aus einer Stadt und dann aus einer anderen geprüft wird, erzeugt unterschiedliche SERPs und einen bedeutungslosen Verlaufsgraphen.

Praktische Regeln für Rank-Tracking:

  • Wählen Sie einen Standort pro verfolgtem Keyword und halten Sie ihn über Läufe hinweg stabil.
  • Erneuern Sie die IP regelmäßig, damit Sie nicht markiert werden, bleiben Sie aber innerhalb derselben Stadt oder Region.
  • Verwenden Sie mobile Proxies, wenn Sie mobile Ergebnisse verfolgen, da sich Desktop- und Mobile-SERPs stark genug unterscheiden, um relevant zu sein.
  • Cachen Sie aggressiv und prüfen Sie nach Zeitplan statt kontinuierlich.

Außerdem sollte man es deutlich sagen: Das Scrapen von Suchmaschinen verstößt normalerweise gegen deren Nutzungsbedingungen. Wenn Sie verlässliche Ranking-Daten benötigen, sind offizielle APIs und lizenzierte Rank-Tracking-Feeds der risikoärmere Weg. Proxies sind für die Fälle, in denen eine API wirklich nicht existiert.

Wie Sie erkennen, ob die Rotation funktioniert

Verfolgen Sie diese über einen gesamten Crawl, nicht pro Anfrage:

  • Erfolgsrate pro Proxy, also 2xx-Antworten geteilt durch Versuche.
  • Blockrate pro Proxy, wobei der Blocktyp erfasst wird: 403, CAPTCHA, leerer Body, Consent-Seite.
  • Median-Antwortzeit pro Proxy. Ein Proxy, der funktioniert, aber dreißig Sekunden pro Seite braucht, ist ein Nettoverlust.
  • Tatsächlich verwendete eindeutige IPs im Vergleich zur Größe des konfigurierten Pools.

Wenn die Erfolgsrate über alle IPs hinweg gleichbleibend ist, ist Ihr Problem nicht die IP-Reputation, und keine noch so große Rotation wird helfen.

Fazit

Rotieren Sie erst, nachdem Sie Anfragefrequenz, Header und Session-Logik korrigiert haben. Verwenden Sie Rotation pro Anfrage für zustandslose Abrufe und Sticky Sessions für alles Mehrstufige. In Python benötigt requests das SOCKS-Extra und einen Proxy pro Session, während in Scrapy eine Downloader-Middleware, die request.meta['proxy'] zuweist, Sie schon sehr weit bringt, wobei Ban-Tracking-Pakete den Rest übernehmen. Und beim Rank-Tracking behandeln Sie die Geografie als Anforderung und die Rotation als Wartung.