Kurze Antwort
Wie funktionieren Sticky Sessions und IP-Rotation bei einem Residential Proxy?
Bei CrawlRelay erhält ein Benutzername ohne Session-ID bei jeder neuen TCP-Verbindung eine IP aus dem Pool, meist eine andere, und -session-<id>-ttl-<minutes> behält für diese ID eine IP für bis zu 30 Minuten, obwohl die IP auch früher wechseln kann. Die Rotation orientiert sich an Verbindungen, nicht an HTTP-Anfragen, sodass Keep-Alive bestimmt, wann Ihre IP tatsächlich wechselt. Residential-Traffic kostet 0,50 $/GB ab 50 GB. Bezahlen Sie mit Krypto, ohne KYC.
Session-Regeln im Überblick
| Rotationseinheit | Eine IP aus dem Pool pro neuer TCP-Verbindung, meist eine andere |
|---|---|
| Sticky Session | -session-<id>-ttl-<minutes>, angehängt an den Benutzernamen |
| Session-Länge | bis zu 30 Minuten |
| Session-ID | 1–32 Buchstaben oder Ziffern; eine ID pro Flow |
| Was eine Session vorzeitig beendet | Das Residential-Gerät dahinter ist offline |
| Geteilte IDs | Clients, die dieselbe ID senden, teilen sich denselben Residential Proxy-Ausgang |
| Kosten | Keine: Sessions und Rotation sind im Preis pro GB enthalten |
Was passiert am Gateway, wenn ich eine Session-ID sende?
Das Gateway liest bei jeder neuen Verbindung den Benutzernamen. Ohne Session-Teil wählt es für diese Verbindung nur einen Residential Proxy-Ausgang, der Ihrer Zielsetzung entspricht. Mit Session-Teil behält es denselben Residential Proxy-Ausgang für diese ID für die von Ihnen festgelegte TTL bei.
Eine Sticky-IP ist eine echte Haushaltsverbindung, sie kann also vor Ablauf der TTL verschwinden: Das Gerät wird ausgeschaltet, verliert das WLAN oder wechselt das Netz. Lange Flows müssen das aushalten, indem sie die Ausgangs-IP an Checkpoints prüfen und im Fehlerfall ab einem Checkpoint neu starten, anstatt den gesamten Job abzubrechen.
Wie wird in den einzelnen Bibliotheken eine Verbindung mehrfach genutzt?
Wenn eine Bibliothek eine Verbindung offenhält, teilt sich jede Anfrage über dieselbe Verbindung einen Residential Proxy-Ausgang. So erhält man das gewünschte Verhalten bewusst.
| Bibliothek | Standard | Neue IP pro Anfrage | Eine IP für einen Flow |
|---|---|---|---|
| Python requests | Session hält Verbindungen offen | Header Connection: close oder ein neuer Session pro Anfrage | Eine Session mit Session-ID im Benutzernamen |
| httpx | Client verwaltet Verbindungen | httpx.Limits(max_keepalive_connections=0) | Ein Client pro Session-ID |
| aiohttp | TCPConnector verwaltet Verbindungen | TCPConnector(force_close=True) | Session-ID im Proxy-URL-Benutzernamen |
| Scrapy | Verbindungen pro Proxy-Zugangsdaten und Host verwalten | meta={"proxy_session": "new"} mit unserem Middleware | Ein fester proxy_session für den Flow |
| Playwright / Puppeteer | Chrome verwaltet pro Kontext | Neuer Kontext pro Seite | Ein Kontext pro Session-ID |
| Node.js undici, axios, got | Agenten halten Sockets offen | Neuer Agent pro Anfrage oder Keep-Alive aus | Ein Agent pro Session-ID |
| curl | Eine Verbindung pro Befehl | Bereits so umgesetzt | Gleiche Session-ID bei jedem Befehl |
Welche Session-Strategie passt zu welchem Scraping-Job?
| Job | Strategie | Empfohlene TTL |
|---|---|---|
| Unabhängige Produkt-, Artikel- oder Angebotsseiten | Rotation: keine Sitzung-ID | — |
| Paginierung, bei der die nächste Seite von einem Cookie oder Cursor abhängt | Eine sticky Session pro Eintrag | 10–30 Min |
| Suchen, dann Ergebnisse, dann Detailseiten | Eine sticky Session pro Suche | 10–20 Min |
| Headless-Browser rendert mehrere Seiten einer Website | Eine sticky Session pro Browser-Kontext | Lebensdauer des Kontexts, bis zu 30 Min |
| Überprüfung, was eine Seite in mehreren Städten zeigt | Eine kurze Session pro Stadt-Check | 5 Min |
| Stündliches erneutes Prüfen derselben Seite | Rotation | — |
Wie verwalte ich einen Pool von sticky Sessions in Python?
Ein kleiner Pool verteilt die Last auf einige stabile Residential-Proxys und schließt jeden nach einer bestimmten Anzahl von Anfragen oder bei Anzeichen eines Ausfalls wie 502 oder 503 aus. Wichtig: Er wechselt die IPs nicht, um an einem 403 oder 429 vorbeizukommen. Das bedeutet, dass die Seite ein verlangsamtes Tempo möchte, daher hebt der Pool diese Codes an deinen Code weiter.
import random
import uuid
import requests
GATEWAY = "gw.crawlrelay.com:7777"
BASE_USER, PASSWORD = "USERNAME-country-us", "PASSWORD"
class SlowDown(Exception):
"""The target asked us to slow down (403 or 429): back off, do not rotate."""
class StickySession:
def __init__(self, ttl=15, max_requests=50):
self.id = uuid.uuid4().hex[:10]
self.max_requests, self.used = max_requests, 0
user = "%s-session-%s-ttl-%d" % (BASE_USER, self.id, ttl)
proxy = "http://%s:%s@%s" % (user, PASSWORD, GATEWAY)
self.http = requests.Session()
self.http.proxies = {"http": proxy, "https": proxy}
class SessionPool:
EXIT_PROBLEMS = {502, 503, 504}
def __init__(self, size=5, **options):
self.options = options
self.sessions = [StickySession(**options) for _ in range(size)]
def _replace(self, i):
self.sessions[i].http.close()
self.sessions[i] = StickySession(**self.options)
def get(self, url, **kwargs):
i = random.randrange(len(self.sessions))
s = self.sessions[i]
s.used += 1
try:
r = s.http.get(url, timeout=(10, 30), **kwargs)
except requests.exceptions.RequestException:
self._replace(i) # dropped exit or timeout: start a fresh session
raise
if r.status_code in (403, 429):
raise SlowDown("%s returned %d" % (url, r.status_code))
if r.status_code in self.EXIT_PROBLEMS or s.used >= s.max_requests:
self._replace(i)
return r
pool = SessionPool(size=5, ttl=15, max_requests=50)
print(pool.get("https://api.ipify.org").text)Wie erkenne ich, dass sich eine sticky IP geändert hat?
Frage nach. Fordere einen IP-Echo-Service wie https://api.ipify.org über dieselbe Session am Anfang und an jedem Checkpoint an und vergleiche die Antworten. Eine Änderung bedeutet, dass der Ausgang hinter der Session gewechselt hat: Starte den Flow vom letzten Checkpoint neu oder öffne eine neue Session. Protokolliere das mit der Session-ID, um IP-Wechsel von Seitenverhalten beim Debuggen zu unterscheiden.
Welche Session-Fehler kosten am meisten?
- Rotation bei jeder Anfrage eines mehrstufigen Flows. Die Seite sieht einen Warenkorb, Cursor oder Such-Token zwischen Ländern springen und setzt es zurück.
- Eine Session-ID für jeden Worker. Eine Session ist für einen Flow gedacht; gib jedem Worker und Flow eine eigene ID.
- Sessions viel zu lang für die Aufgabe. Eine TTL von 30 Minuten für einen 2-minütigen Flow bindet eine IP unnötig und erschwert das Loglesen.
- 429 als IP-Problem behandeln. Eine neue IP ändert die Seitenregel nicht; langsamer machen schon. Siehe 429 Too Many Requests.
- Annahme von Rotation pro Anfrage. Keep-alive hält den Ausgang; prüfe die obige Tabelle für deine Library.
Sessions und Rotation: Fragen
Wie lange dauert eine sticky Session?
Sticky Sessions halten dieselbe IP für die von Ihnen festgelegte Zeit (TTL, in Minuten) bis zu 30 Minuten. Die IP kann früher wechseln, z. B. wenn das Residential-Gerät offline geht.. Wähle eine TTL etwas länger als der Flow, den sie bedient, und prüfe den Ausgang an Checkpoints.
Kosten sticky Sessions mehr als Rotation?
Nein. CrawlRelay verrechnet Traffic pro GB, und Sessions, Rotation sowie Targeting sind im Preis enthalten. Eine sticky Session kann sogar Traffic sparen, weil eine gehaltene Verbindung den TLS-Handshake pro Anfrage vermeidet.
Ist Rotation bei jeder Anfrage besser fürs Scraping?
Für unabhängige Seiten verteilt Rotation die Last und verhindert, dass eine Seite stundenlang von einer IP erreicht wird. Für alles mit Status, z. B. Paginierung mit Cookie, zerstört es den Flow. Die meisten Crawls mischen beides: Rotation zwischen Items, Sticky Sessions innerhalb eines Flows.
Kann ich die genaue IP auswählen, die ich bekomme?
Nein. Ein Residential Proxy weist Ausgänge aus einem sich ständig ändernden Pool zu, passend zum Targeting in deinem Benutzernamen. Du wählst Land, Stadt, US-Bundesstaat, PLZ oder ASN und kannst eine IP mit einer Session behalten; die Reservierung einer bestimmten IP ist nicht möglich.
Rotation und Sessions sind in jedem Plan enthalten
1,50 $ für 1 GB, 0,50 $/GB ab 50 GB.