Sie haben einen Parser eingerichtet, Proxys angeschlossen, aber die API gibt weiterhin Fehler 429 "Zu viele Anfragen" zurĂŒck oder blockiert den Zugriff? Das Problem liegt nicht an den Proxys selbst, sondern an einer falschen Strategie ihrer Nutzung. Rate Limiting ist ein Schutzmechanismus der API, der die Anzahl der Anfragen von einer IP-Adresse ĂŒber einen bestimmten Zeitraum begrenzt. In diesem Artikel werden wir untersuchen, warum Blockierungen bei der Arbeit ĂŒber Proxys auftreten und wie man das System richtig konfiguriert, um die Grenzen zu umgehen.
Was ist API Rate Limiting und wie funktioniert es?
Rate Limiting (Anfragefrequenzbegrenzung) ist ein Schutzmechanismus der API gegen Ăberlastungen und Missbrauch. Der Dienst legt ein Limit fĂŒr die Anzahl der Anfragen fest, die von einer Quelle ĂŒber einen bestimmten Zeitraum ausgefĂŒhrt werden können. Beispielsweise verwenden beliebte APIs solche EinschrĂ€nkungen:
- Twitter API: 300 Anfragen alle 15 Minuten fĂŒr den Standardzugang
- Instagram Graph API: 200 Anfragen pro Stunde pro Anwendung
- Google Maps API: abhÀngig vom Tarif, normalerweise 100-1000 Anfragen pro Tag
- Wildberries API: inoffizielle Limits von etwa 60 Anfragen pro Minute von einer IP
- Avito API: 10 Anfragen pro Sekunde fĂŒr das Scraping von Anzeigen
Es gibt mehrere Methoden zur Bestimmung der Quelle von Anfragen, auf die Rate Limiting angewendet wird:
IP-Adresse: die am weitesten verbreitete Methode. Die API zÀhlt die Anzahl der Anfragen von einer bestimmten IP innerhalb eines Zeitfensters.
API-SchlĂŒssel: Wenn Sie eine Authentifizierung ĂŒber einen SchlĂŒssel verwenden, wird das Limit unabhĂ€ngig von der IP daran gebunden.
User-Agent und Fingerabdruck: Einige APIs analysieren die Browser-Header und erstellen einen digitalen Fingerabdruck des Clients.
Session (Cookies): Das Limit kann an die Benutzersitzung ĂŒber Cookies gebunden sein.
Wenn das Limit ĂŒberschritten wird, gibt die API den HTTP-Status 429 "Zu viele Anfragen" und den Header Retry-After zurĂŒck, der die Zeit bis zum ZurĂŒcksetzen des Limits angibt. Einige Dienste verwenden ein "gleitendes Fenster" (rolling window), bei dem das Limit schrittweise aktualisiert wird, wĂ€hrend andere ein festes Fenster verwenden, das zu einem bestimmten Zeitpunkt zurĂŒckgesetzt wird.
Warum Proxys nicht automatisch vor Rate Limiting schĂŒtzen
Viele Entwickler glauben fĂ€lschlicherweise, dass es ausreicht, Proxys anzuschlieĂen, um eine unbegrenzte Anzahl von Anfragen zu senden. In der Praxis treten folgende Probleme auf:
Verwendung eines Proxys fĂŒr alle Anfragen
Wenn Ihr Skript dieselbe IP-Adresse des Proxys fĂŒr alle Anfragen verwendet, sieht die API dies als normalen Benutzer und wendet die Standardlimits an. Angenommen, Sie haben einen Preisparser von Wildberries ĂŒber einen einzigen Residential Proxy eingerichtet. Der Parser macht 100 Anfragen pro Minute, aber das Limit liegt bei 60 Anfragen. Ergebnis: Blockierung der IP fĂŒr 10-30 Minuten.
Langsame IP-Rotation
Einige verwenden einen Pool von 5-10 Proxys und wechseln nacheinander zwischen ihnen. Das Problem ist, dass jede IP das Limit schneller erreicht, als eine vollstĂ€ndige Rotation erfolgt. Angenommen, Sie haben 10 Proxys und ein Limit von 100 Anfragen pro Stunde und IP. Wenn Sie 1000 Anfragen pro Stunde machen, erhĂ€lt jeder Proxy 100 Anfragen - genau an der Grenze des Limits. Jede UngleichmĂ€Ăigkeit in der Verteilung fĂŒhrt zu Blockierungen.
Ignorieren anderer Identifikationsfaktoren
Selbst bei idealer IP-Rotation können Sie blockiert werden, wenn:
- Alle Anfragen kommen mit demselben User-Agent (z.B.
python-requests/2.28.0) - Ein API-SchlĂŒssel fĂŒr alle Anfragen verwendet wird
- Anfragen mit perfekter RegelmĂ€Ăigkeit (alle 0,5 Sekunden) eintreffen - das sieht aus wie ein Bot
- Die IP-Adressen der Proxys sich im selben Subnetz befinden (z.B. alle im Bereich 192.168.1.x)
Reputation der IP-Adressen
Datacenter-Proxys werden hĂ€ufig auf schwarze Listen gesetzt, da ihre IP-Adressen von Hunderten anderer Benutzer zum Scraping verwendet werden. Die API kann strengere Limits fĂŒr solche Adressen anwenden oder sie sofort blockieren. Beispielsweise sperren Instagram und Facebook aggressiv Datacenter, selbst wenn Sie die offiziellen Limits nicht ĂŒberschreiten.
IP-Rotationsstrategien zur Umgehung von Limits
Die richtige Rotation von Proxys ist der SchlĂŒssel zur Umgehung von Rate Limiting. Lassen Sie uns effektive Strategien je nach Aufgabe betrachten.
Rotation nach jeder Anfrage
Die aggressivste Strategie: jede Anfrage erfolgt ĂŒber eine neue IP. Geeignet fĂŒr Aufgaben mit sehr strengen Limits (1-5 Anfragen pro IP) oder wenn die Last maximal verteilt werden muss. DafĂŒr werden Residential Proxys mit automatischer Rotation verwendet - sie bieten einen Pool von Millionen IPs, und jede Anfrage erhĂ€lt automatisch eine neue Adresse.
Beispiel: Scraping von Instagram ĂŒber eine inoffizielle API, bei der das Limit 5 Anfragen pro Minute von einer IP betrĂ€gt. Mit der Rotation nach jeder Anfrage können Sie 300 Anfragen pro Minute ĂŒber 300 verschiedene IPs durchfĂŒhren.
Vorteile: maximaler Schutz vor Rate Limiting, jede IP wird minimal genutzt.
Nachteile: hohe Kosten (Residential Proxys sind teurer), mögliche Verzögerungen beim Wechsel der IP, schwieriger, Sitzungen aufrechtzuerhalten.
Zeitbasierte Rotation (Sticky Sessions)
Die IP-Adresse wird fĂŒr einen bestimmten Zeitraum (5-30 Minuten) verwendet und dann auf eine neue geĂ€ndert. Diese Strategie eignet sich fĂŒr APIs, die eine Sitzung erfordern, oder wenn mehrere zusammenhĂ€ngende Anfragen von einem "Benutzer" gestellt werden mĂŒssen.
Berechnung der optimalen Rotationszeit: Wenn das API-Limit 100 Anfragen pro Stunde betrĂ€gt und Sie planen, 50 Anfragen ĂŒber eine IP zu machen, verwenden Sie eine Sticky Session von 30 Minuten. In dieser Zeit machen Sie 25 Anfragen (bei gleichmĂ€Ăiger Last), was die HĂ€lfte des Limits betrĂ€gt.
Rotation nach Pool mit Limitverfolgung
Eine fortgeschrittene Strategie: Ihr Skript verfolgt die Anzahl der Anfragen von jeder IP und wechselt automatisch zu einer neuen, wenn das Limit erreicht wird. Angenommen, Sie haben einen Pool von 20 Proxys, das API-Limit betrĂ€gt 100 Anfragen pro Stunde. Das Skript verfolgt den ZĂ€hler fĂŒr jede IP und wechselt zur nĂ€chsten, wenn 90 Anfragen erreicht sind.
Diese Strategie erfordert Programmierlogik, bietet jedoch maximale Effizienz: Sie nutzen jeden Proxy voll aus, ohne die Limits zu ĂŒberschreiten.
Geografische Rotation
Einige APIs wenden unterschiedliche Limits je nach Region an. Beispielsweise kann ein Dienst Anfragen aus den USA strenger einschrÀnken als aus Europa. In solchen FÀllen verwenden Sie Proxys aus verschiedenen LÀndern und verteilen die Last zwischen ihnen.
| Rotationsstrategie | Wann verwenden | Proxytyp |
|---|---|---|
| Nach jeder Anfrage | Strenge Limits (1-10 Anfragen/IP), Scraping von sozialen Netzwerken | Residential mit automatischer Rotation |
| Nach Zeit (5-30 Min) | Sitzung erforderlich, mittlere Limits (50-200 Anfragen/Stunde) | Residential Sticky oder mobile |
| Nach Pool mit Limitverfolgung | GroĂes Scraping-Volumen, bekannte API-Limits | Jeder Typ mit einem Pool von 10+ IPs |
| Geografisch | Regionale EinschrÀnkungen, Scraping von lokalem Inhalt | Residential aus verschiedenen LÀndern |
Einstellung von Verzögerungen zwischen Anfragen
Selbst bei idealer IP-Rotation ist es wichtig, die Verzögerungen zwischen den Anfragen richtig einzustellen. Zu schnelle Anfragen sehen wie ein Angriff aus, selbst wenn sie von verschiedenen IPs kommen.
Berechnung der minimalen Verzögerung
Formel: Verzögerung = (Zeitfenster in Sekunden / Anfrage-Limit) à Sicherheitsfaktor
Beispiel: Die API erlaubt 100 Anfragen pro Stunde (3600 Sekunden). Minimale Verzögerung = 3600 / 100 = 36 Sekunden. Sicherheitsfaktor 1.2 hinzufĂŒgen: 36 Ă 1.2 = 43 Sekunden zwischen Anfragen von einer IP.
Wenn Sie 10 Proxys mit Rotation verwenden, können Sie alle 4,3 Sekunden Anfragen stellen (43 / 10), ohne das Limit an einer IP zu ĂŒberschreiten.
ZufÀllige Verzögerungen (Jitter)
Verwenden Sie anstelle einer festen Verzögerung von 5 Sekunden zufÀllige Intervalle, z.B. von 3 bis 7 Sekunden. Dies macht Ihren Verkehr Àhnlicher zu dem eines echten Benutzers. Viele Bot-Schutzsysteme analysieren Muster: Wenn Anfragen genau alle 5,0 Sekunden eintreffen, ist das verdÀchtig.
Exponentielle Verzögerung bei Fehlern
Wenn Sie einen Fehler 429 erhalten, senden Sie nicht sofort weitere Anfragen. Verwenden Sie eine exponentielle Verzögerung: erster Versuch nach 1 Sekunde, zweiter nach 2, dritter nach 4, vierter nach 8 und so weiter. Dies ist eine gÀngige Praxis, die APIs von ihren Clients erwarten.
Tipp: ĂberprĂŒfen Sie den Header Retry-After in der API-Antwort. Er gibt die genaue Zeit an, wann die Anfrage wiederholt werden kann. Verwenden Sie diesen Wert anstelle von willkĂŒrlichen Verzögerungen.
Welchen Proxytyp fĂŒr die Arbeit mit APIs wĂ€hlen?
Die Wahl des Proxytyps hat einen entscheidenden Einfluss auf den Erfolg der Umgehung von Rate Limiting. Lassen Sie uns die Vor- und Nachteile jeder Option fĂŒr die Arbeit mit APIs untersuchen.
Residential Proxys
Residential Proxys verwenden IP-Adressen echter Benutzer, die von Internetanbietern zugewiesen werden. FĂŒr APIs sieht dies aus wie normales Heim-Internet.
Vorteile fĂŒr APIs:
- Hohe VertrauenswĂŒrdigkeit: APIs sperren selten Heim-IP-Adressen
- Riesige Pools: Millionen von IPs zur Rotation
- Geografische Vielfalt: IPs aus verschiedenen StÀdten und LÀndern
- Geeignet fĂŒr soziale Netzwerke und strenge APIs (Instagram, Facebook, TikTok)
Nachteile:
- Hohe Kosten: Bezahlung erfolgt normalerweise nach Traffic (von $5-15 pro 1 GB)
- Variable Geschwindigkeit: abhÀngig von der Internetverbindung des Endbenutzers
- InstabilitÀt: IP kann jederzeit ausfallen
Wann verwenden: Scraping von Instagram, Facebook, TikTok, Arbeiten mit API-MarktplÀtzen (Wildberries, Ozon), alle Aufgaben, bei denen die Reputation der IP entscheidend ist.
Mobile Proxys
Mobile Proxys verwenden IP-Adressen von Mobilfunkanbietern (4G/5G). Eine IP wird hÀufig von Tausenden echten Benutzern gleichzeitig verwendet, daher blockieren APIs sie extrem selten.
Vorteile fĂŒr APIs:
- Maximales Vertrauen: APIs können IPs von Mobilfunkanbietern nicht blockieren
- Ideal fĂŒr mobile Anwendungen und APIs (Instagram, TikTok, Snapchat)
- Automatischer IP-Wechsel bei Wiederverbindung (Flugmodus)
- Eine IP kann mehr Anfragen ohne Sperrung durchfĂŒhren
Nachteile:
- Sehr hohe Kosten: von $50-150 pro IP und Monat
- Kleine Pools: schwierig, Hunderte von mobilen IPs zu erhalten
- Variable Geschwindigkeit: abhÀngig von der QualitÀt der mobilen Verbindung
Wann verwenden: Arbeiten mit mobilen APIs, Scraping von Instagram/TikTok in groĂen Mengen, wenn maximaler Schutz vor Sperrungen erforderlich ist.
Datacenter-Proxys
Datacenter-Proxys sind IP-Adressen von Servern, die in Rechenzentren untergebracht sind. Sie sind nicht mit echten Benutzern verbunden.
Vorteile fĂŒr APIs:
- Niedrige Kosten: von $1-5 pro IP und Monat
- Hohe Geschwindigkeit: KanÀle von 1-10 Gbit/s
- StabilitÀt: IPs fallen nicht zufÀllig aus
- GroĂe Pools: leicht, Hunderte von IPs zu erhalten
Nachteile:
- Niedriges Vertrauen: viele APIs blockieren Datacenter
- IPs sind oft auf schwarzen Listen wegen anderer Benutzer
- Nicht geeignet fĂŒr soziale Netzwerke und strenge Dienste
Wann verwenden: Scraping von öffentlichen APIs ohne strengen Schutz (Wetter, Wechselkurse, Nachrichten), Arbeiten mit eigenen APIs, Testen und Entwickeln.
| Kriterium | Residential | Mobile | Datacenter |
|---|---|---|---|
| API-Vertrauen | Hoch | Maximal | Niedrig |
| PoolgröĂe | Millionen IPs | Hunderte IPs | Tausende IPs |
| Geschwindigkeit | Durchschnittlich (10-50 Mbit/s) | Durchschnittlich (5-100 Mbit/s) | Hoch (100+ Mbit/s) |
| Kosten | $5-15/GB | $50-150/IP/Monat | $1-5/IP/Monat |
| FĂŒr soziale Netzwerke | â Ausgezeichnet | â Ideal | â Nicht geeignet |
| FĂŒr öffentliche APIs | â Gut | â Gut (teuer) | â Ausgezeichnet |
Praktische Umsetzung: Codebeispiele in Python
Lassen Sie uns konkrete Beispiele fĂŒr die Umsetzung der Umgehung von Rate Limiting mit Proxys betrachten. Alle Beispiele sind in Python mit der Bibliothek requests.
Einfache Rotation aus einem Proxy-Pool
Basisimplementierung mit zyklischer Rotation der IP aus einer Liste:
import requests
import time
from itertools import cycle
# Liste der Proxys (Format: protocol://user:pass@host:port)
PROXY_LIST = [
'http://user1:[email protected]:8080',
'http://user2:[email protected]:8080',
'http://user3:[email protected]:8080',
]
# Erstellen eines zyklischen Iterators
proxy_pool = cycle(PROXY_LIST)
def make_request(url):
proxy = next(proxy_pool) # NĂ€chsten Proxy aus dem Pool nehmen
proxies = {
'http': proxy,
'https': proxy
}
try:
response = requests.get(url, proxies=proxies, timeout=10)
return response
except requests.exceptions.RequestException as e:
print(f"Fehler mit Proxy {proxy}: {e}")
return None
# Beispielverwendung
for i in range(10):
response = make_request('https://api.example.com/data')
if response and response.status_code == 200:
print(f"Anfrage {i+1}: Erfolg")
time.sleep(2) # Verzögerung zwischen Anfragen
Rotation mit Limitverfolgung
Eine fortgeschrittenere Version, die die Anfragen fĂŒr jeden Proxy zĂ€hlt und beim AnnĂ€hern an das Limit wechselt:
import requests
import time
from collections import defaultdict
class ProxyRotator:
def __init__(self, proxy_list, max_requests_per_ip=90, time_window=3600):
self.proxy_list = proxy_list
self.max_requests = max_requests_per_ip # Anfrage-Limit pro IP
self.time_window = time_window # Zeitfenster in Sekunden
self.request_counts = defaultdict(list) # Anfragehistorie fĂŒr jede IP
self.current_index = 0
def get_proxy(self):
"""Gibt den Proxy mit der geringsten Anzahl an Anfragen zurĂŒck"""
current_time = time.time()
# Alte EintrĂ€ge auĂerhalb des Zeitfensters löschen
for proxy in self.request_counts:
self.request_counts[proxy] = [
t for t in self.request_counts[proxy]
if current_time - t < self.time_window
]
# Proxy mit der geringsten Anzahl an Anfragen suchen
available_proxies = []
for proxy in self.proxy_list:
count = len(self.request_counts[proxy])
if count < self.max_requests:
available_proxies.append((proxy, count))
if not available_proxies:
# Wenn alle Proxys das Limit erreicht haben, warten
oldest_request = min(
min(times) for times in self.request_counts.values() if times
)
wait_time = self.time_window - (current_time - oldest_request) + 1
print(f"Alle Proxys haben das Limit erreicht. Wartezeit {wait_time:.0f} Sek...")
time.sleep(wait_time)
return self.get_proxy()
# Proxy mit der geringsten Anzahl an Anfragen auswÀhlen
proxy = min(available_proxies, key=lambda x: x[1])[0]
self.request_counts[proxy].append(current_time)
return proxy
def make_request(self, url, **kwargs):
proxy = self.get_proxy()
proxies = {'http': proxy, 'https': proxy}
try:
response = requests.get(url, proxies=proxies, timeout=10, **kwargs)
return response
except requests.exceptions.RequestException as e:
print(f"Fehler mit Proxy {proxy}: {e}")
return None
# Beispielverwendung
PROXY_LIST = [
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
]
rotator = ProxyRotator(PROXY_LIST, max_requests_per_ip=100, time_window=3600)
for i in range(500): # 500 Anfragen stellen
response = rotator.make_request('https://api.example.com/data')
if response and response.status_code == 200:
print(f"Anfrage {i+1}: Erfolg")
time.sleep(1) # Minimale Verzögerung
Fehler 429 mit exponentieller Verzögerung behandeln
Richtige Behandlung der Antwort "Zu viele Anfragen" unter BerĂŒcksichtigung des Headers Retry-After:
import requests
import time
def make_request_with_retry(url, proxies, max_retries=5):
"""Macht eine Anfrage mit automatischen Wiederholungen bei Fehler 429"""
for attempt in range(max_retries):
try:
response = requests.get(url, proxies=proxies, timeout=10)
if response.status_code == 200:
return response
elif response.status_code == 429:
# ĂberprĂŒfen des Headers Retry-After
retry_after = response.headers.get('Retry-After')
if retry_after:
wait_time = int(retry_after)
print(f"Rate limit. Wartezeit {wait_time} Sek (aus Retry-After)")
else:
# Exponentielle Verzögerung: 2^attempt Sekunden
wait_time = 2 ** attempt
print(f"Rate limit. Versuch {attempt+1}, Wartezeit {wait_time} Sek")
time.sleep(wait_time)
continue
else:
print(f"HTTP-Fehler {response.status_code}")
return None
except requests.exceptions.RequestException as e:
print(f"Verbindungsfehler: {e}")
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
return None
print(f"Maximale Anzahl an Versuchen ĂŒberschritten ({max_retries})")
return None
# Beispielverwendung
proxies = {
'http': 'http://user:[email protected]:8080',
'https': 'http://user:[email protected]:8080'
}
response = make_request_with_retry('https://api.example.com/data', proxies)
if response:
print("Daten erhalten:", response.json())
Verwendung von Residential Proxys mit automatischer Rotation
Viele Anbieter von Residential Proxys bieten einen Endpunkt an, der bei jeder Anfrage automatisch die IP wechselt. Beispielkonfiguration:
import requests
import random
import time
# Residential Proxys mit automatischer Rotation
# Format: protocol://username:password@gateway:port
ROTATING_PROXY = 'http://customer-USER:[email protected]:12321'
def make_request_rotating(url):
"""Anfrage ĂŒber rotierenden Proxy (neue IP jedes Mal)"""
proxies = {
'http': ROTATING_PROXY,
'https': ROTATING_PROXY
}
# FĂŒgen Sie einen zufĂ€lligen User-Agent fĂŒr mehr AnonymitĂ€t hinzu
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36',
]
headers = {
'User-Agent': random.choice(user_agents)
}
try:
response = requests.get(url, proxies=proxies, headers=headers, timeout=15)
return response
except requests.exceptions.RequestException as e:
print(f"Fehler: {e}")
return None
# 100 Anfragen ĂŒber verschiedene IPs stellen
for i in range(100):
response = make_request_rotating('https://api.example.com/data')
if response and response.status_code == 200:
print(f"Anfrage {i+1}: Erfolg, IP geÀndert")
# ZufÀllige Verzögerung von 1-3 Sekunden
time.sleep(random.uniform(1, 3))
Ăberwachung von Limits und Fehlerbehandlung
Effektive Arbeit mit APIs erfordert stĂ€ndige Ăberwachung der Limits und richtige Fehlerbehandlung. Hier sind die wichtigsten Praktiken:
Analyse der Antwort-Header
Viele APIs geben Informationen ĂŒber Limits in den Antwort-Headern zurĂŒck. Standardheader:
X-RateLimit-Limitâ maximale Anzahl an Anfragen im FensterX-RateLimit-Remainingâ wie viele Anfragen noch ĂŒbrig sindX-RateLimit-Resetâ Zeit des ZurĂŒcksetzens des Limits (Unix-Zeitstempel)Retry-Afterâ nach wie vielen Sekunden die Anfrage wiederholt werden kann
Beispiel zum Lesen dieser Header:
response = requests.get(url, proxies=proxies)
# ĂberprĂŒfen der Limit-Header
limit = response.headers.get('X-RateLimit-Limit')
remaining = response.headers.get('X-RateLimit-Remaining')
reset_time = response.headers.get('X-RateLimit-Reset')
if remaining:
remaining = int(remaining)
if remaining < 10:
print(f"Achtung! Nur noch {remaining} Anfragen ĂŒbrig")
if reset_time:
import datetime
reset_dt = datetime.datetime.fromtimestamp(int(reset_time))
print(f"Das Limit wird um {reset_dt} zurĂŒckgesetzt")
Protokollierung und Statistik
FĂŒhren Sie detaillierte Statistiken ĂŒber Anfragen fĂŒr jeden Proxy. Dies hilft, problematische IPs zu identifizieren und die Rotation zu optimieren:
import json
from datetime import datetime
class RequestLogger:
def __init__(self):
self.stats = {}
def log_request(self, proxy, status_code, response_time):
if proxy not in self.stats:
self.stats[proxy] = {
'total': 0,
'success': 0,
'rate_limited': 0,
'errors': 0,
'avg_response_time': 0
}
self.stats[proxy]['total'] += 1
if status_code == 200:
self.stats[proxy]['success'] += 1
elif status_code == 429:
self.stats[proxy]['rate_limited'] += 1
else:
self.stats[proxy]['errors'] += 1
# Aktualisieren der durchschnittlichen Antwortzeit
current_avg = self.stats[proxy]['avg_response_time']
total = self.stats[proxy]['total']
self.stats[proxy]['avg_response_time'] = (
(current_avg * (total - 1) + response_time) / total
)
def print_stats(self):
print("\n=== Proxy-Statistiken ===")
for proxy, data in self.stats.items():
success_rate = (data['success'] / data['total'] * 100) if data['total'] > 0 else 0
print(f"\nProxy: {proxy}")
print(f" Gesamtanfragen: {data['total']}")
print(f" Erfolgreiche: {data['success']} ({success_rate:.1f}%)")
print(f" Rate limited: {data['rate_limited']}")
print(f" Fehler: {data['errors']}")
print(f" Durchschnittliche Antwortzeit: {data['avg_response_time']:.2f}s")
# Verwendung
logger = RequestLogger()
start_time = time.time()
response = requests.get(url, proxies=proxies)
response_time = time.time() - start_time
logger.log_request(proxy, response.status_code, response_time)
logger.print_stats()
Automatisches Umschalten der Strategie
Wenn Sie stÀndig Fehler 429 erhalten, verlangsamen Sie automatisch die Anfragen oder erhöhen Sie den Proxy-Pool:
class AdaptiveRateLimiter:
def __init__(self, initial_delay=1.0):
self.delay = initial_delay
self.consecutive_429 = 0
def on_success(self):
"""Erfolgreiche Anfrage - kann etwas beschleunigt werden"""
self.consecutive_429 = 0
self.delay = max(0.5, self.delay * 0.95) # Verzögerung um 5% reduzieren
def on_rate_limit(self):
"""Fehler 429 erhalten - muss verlangsamt werden"""
self.consecutive_429 += 1
self.delay *= 1.5 # Verzögerung um das 1,5-fache erhöhen
if self.consecutive_429 > 5:
print("WARNUNG: Zu viele Fehler 429. ĂberprĂŒfen Sie die Einstellungen!")
def wait(self):
"""Warten vor der nÀchsten Anfrage"""
time.sleep(self.delay)
return self.delay
# Verwendung
limiter = AdaptiveRateLimiter(initial_delay=2.0)
for i in range(1000):
response = make_request(url)
if response.status_code == 200:
limiter.on_success()
elif response.status_code == 429:
limiter.on_rate_limit()
delay = limiter.wait()
print(f"Anfrage {i+1}, Verzögerung: {delay:.2f}s")
Umgang mit Captchas und anderen Blockierungen
Einige APIs zeigen bei Ăberschreitung der Limits ein Captcha anstelle einer direkten Blockierung an. Anzeichen:
- Statuscode 403 mit einem Antwortkörper, der "captcha" oder "recaptcha" enthÀlt
- Weiterleitung zu einer Seite mit Captcha (Status 302)
- Spezielle Header wie
X-Captcha-Required: true
In solchen FĂ€llen sollten Sie:
- Die Verwendung dieser IP sofort einstellen
- Zu einem anderen Proxy aus dem Pool wechseln
- Die Verzögerungen zwischen den Anfragen erhöhen
- Mehr Vielfalt in User-Agent und anderen Headern hinzufĂŒgen
Wichtig: Wenn Sie regelmĂ€Ăig auf Captchas stoĂen, wĂ€hrend Sie Residential Proxys verwenden, liegt das Problem wahrscheinlich in den Verhaltensmustern (gleiche Header, zu schnelle Anfragen) und nicht an den IP-Adressen.
Fazit
Die Umgehung von API Rate Limiting bei der Verwendung von Proxys ist nicht nur eine technische Einstellung, sondern eine umfassende Strategie, die die richtige Wahl des Proxytyps, die Einstellung der IP-Rotation, das Management von Verzögerungen und die Ăberwachung von Limits umfasst. Wichtige Erkenntnisse aus dem Artikel:
- Proxys lösen das Problem des Rate Limiting nicht von selbst - eine richtige Rotationsstrategie ist erforderlich
- FĂŒr soziale Netzwerke und strenge APIs verwenden Sie Residential oder mobile Proxys, fĂŒr öffentliche APIs sind Datacenter geeignet
- Berechnen Sie die GröĂe des Proxy-Pools basierend auf den API-Limits und der gewĂŒnschten Scraping-Geschwindigkeit
- Ăberwachen Sie immer die Limits und passen Sie Ihre Strategie entsprechend an