BeautifulSoup und Requests über mobile Proxys: Schritt-für-Schritt-Anleitung für Einsteiger
Inhalt: Einführung · Vorbereitung · Grundlagen · Schritt 1: Installation von Python und Bibliotheken · Schritt 2: Schneller Test ohne Proxy · Schritt 3: Anfrage über mobilen Proxy · Schritt 4: IP-Rotation · Schritt 5: Fehler, Timeouts und Wiederholungen · Schritt 6: Captcha-Handling · Ergebnisüberprüfung · Typische Fehler · Erweiterte Möglichkeiten · FAQ · Fazit
Einführung
In diesem Schritt-für-Schritt-Guide richten Sie Ihre Python-Entwicklungsumgebung ein, senden Anfragen an Webseiten über mobile Proxys, extrahieren die benötigten Daten mit BeautifulSoup und lernen, sicher und stabil mit der IP-Rotation zu arbeiten. Wir verwenden die Bibliothek Requests für Netzwerkanfragen und BeautifulSoup zum Parsen von HTML. Am Ende erhalten Sie einen minimal funktionsfähigen Parser, der: HTTP-Anfragen über einen mobilen Proxy sendet, die Header für mobile Geräte korrekt anpasst, wiederholt Anfragen mit einem intelligenten Backoff bei Fehlern, dreht die IP auf der Seite des mobilen Proxy-Anbieters, behandelt Captchas vorsichtig und speichert die Daten in einem handlichen Format.
Für wen dieser Guide gedacht ist: für Einsteiger, die sich mit Web-Scraping vertraut machen; für Fachleute in verwandten Bereichen (Marketing, Recherche, OSINT), die ein einfaches und zuverlässiges Tool benötigen; für Entwickler, die schnell einen funktionierenden Prototyp erstellen und weiterentwickeln möchten.
Was Sie im Voraus wissen sollten: grundlegende Computerkenntnisse; Verständnis davon, was eine Datei und ein Ordner sind und wie man die Eingabeaufforderung ausführt; ein minimales Wissen über Python ist von Vorteil, aber nicht erforderlich, da wir Schritt für Schritt vorgehen. Wichtig: Sie müssen rechtlich berechtigt sein, die Zielseiten zu verarbeiten, und die Regeln der Webseiten, einschließlich robots.txt und Benutzervereinbarungen, beachten.
Wie lange es dauert: 2–4 Stunden, wenn Sie alles der Reihe nach abarbeiten. Die Installation der Umgebung und der schnelle Test benötigen bis zu 30 Minuten. Die Verbindung mit dem mobilen Proxy und die Einrichtung der Rotation dauern zwischen 40 Minuten und 1,5 Stunden. Das Hinzufügen von Fehlerbehandlung und Captcha-Handling benötigt zwischen 30 und 60 Minuten.
Tipp: Speichern Sie sich den Link zum Abschnitt Schritt 4: IP-Rotation und Schritt 5: Fehler, Timeouts und Wiederholungen. Diese Abschnitte werden häufig benötigt, um die Stabilität zu erhöhen.
⚠️ Achtung: Das gesamte Material wird zu Schulungs- und Übungszwecken beim legalen Parsen bereitgestellt. Verwenden Sie keine Techniken, um Zugangsbeschränkungen zu umgehen, und verstoßen Sie nicht gegen geltendes Recht sowie die Nutzungsbedingungen von Webseiten. Wir diskutieren auch keine VPNs oder andere Methoden zur Umgehung von Blockierungen.
Vorbereitung
Benötigte Werkzeuge und Zugriffe: ein Computer mit Windows, macOS oder Linux; Internetzugang; installierte Python-Version 3.11–3.13 (aktuelle Version empfohlen); Paketmanager pip; Texteditor (Visual Studio Code, PyCharm Community oder andere). Außerdem benötigen Sie ein Konto bei einem mobilen Proxy-Anbieter. Sie können sich an den funktionalen Anforderungen orientieren, die Dienste wie mobileproxy.space bereitstellen: individueller Proxy-Endpunkt, Authentifizierung per Benutzername und Passwort oder IP, konfigurierbare Rotation (nach Timer oder API), Statistiken über Anfragen.
Systemvoraussetzungen: mindestens 4 GB RAM; 1–2 GB freien Platz auf der Festplatte für Python und Bibliotheken; stabiler Internetanschluss mit mindestens 10 Mbit/s; Möglichkeit zur Installation von Programmen. Administratorrechte sind nur für die Installation von Python erforderlich (unter Windows).
Was heruntergeladen und installiert werden muss: Python-Installer; Code-Editor (z.B. VS Code); Bibliotheken requests, beautifulsoup4, lxml (für beschleunigtes HTML-Parsen).
Backup-Erstellung (falls relevant): Erstellen Sie eine Kopie des Ordners mit dem Code, bevor Sie Änderungen an bestehenden Projekten vornehmen. Wenn Sie ein Projekt zum ersten Mal erstellen, richten Sie ein separates Arbeitsverzeichnis ein. Bewahren Sie die Datei mit Proxy-Zugangsdaten außerhalb des Repositories auf und verwenden Sie nach Möglichkeit eine .env-Datei und einen Secret Manager.
Tipp: Erstellen Sie ein Projektverzeichnis ohne Leerzeichen und ohne kyrillische Buchstaben im Namen, zum Beispiel parser_mobile_proxy. Dies erleichtert das Ausführen von Skripten und vermeidet Pfadfehler.
Grundlagen
Schlüsselbegriffe einfach erklärt: Parsing oder Web-Scraping ist das automatische Sammeln von öffentlich zugänglichen Daten von Webseiten. Requests ist eine Python-Bibliothek zum Ausführen von HTTP-Anfragen. BeautifulSoup ist eine Python-Bibliothek zum Parsen von HTML und zum Extrahieren von Inhaltsfragmenten nach Tags, Klassen und Attributen. Proxy ist ein Zwischenserver, der Anfragen im Namen seines Nutzers an die Webseite sendet. Mobiler Proxy ist ein Proxy, der IP-Adressen von Mobilfunkanbietern verwendet. IP-Rotation ist der Wechsel der Ausgangs-IP in bestimmten Zeitintervallen oder auf Befehl.
Grundprinzipien der Funktionsweise: Sie erzeugen eine HTTP-Anfrage an die Webseite; Ihre Anfrage geht über einen mobilen Proxy; die Webseite sieht die Adresse des Proxys und nicht Ihre. Sie erhalten die HTML-Seite und parsen sie mit BeautifulSoup.
Was vor Beginn wichtig ist zu verstehen: Halten Sie sich an robots.txt und die Bedingungen der Webseite; überlasten Sie den Server nicht mit häufigen Anfragen; verwenden Sie Timeouts; senden Sie eine angemessene Anzahl paralleler Anfragen; bearbeiten Sie die Antwortcodes 4xx und 5xx. Ein mobiler Proxy hilft, die Wahrscheinlichkeit von Fraud-Triggers und Einschränkungen zu verringern, da mobile IP-Bereiche aktiv von echten Nutzern verwendet werden. Die Stabilität hängt jedoch von der Qualität des Anbieters, der Last und der Richtigkeit Ihres Codes ab.
⚠️ Achtung: Verwenden Sie kein Parsing, um sich unautorisierten Zugang zu verschaffen oder geschützte Bereiche ohne Genehmigung zu betreten. Arbeiten Sie nur mit offenen Daten, für deren Verarbeitung Sie berechtigt sind.
Schritt 1: Installation von Python und Bibliotheken
Ziel des Schrittes
Installieren Sie Python und die erforderlichen Bibliotheken, erstellen Sie ein Projekt und grundlegende Dateien. Nach diesem Schritt können Sie Skripte ausführen und HTTP-Anfragen durchführen.
Step-by-Step-Anleitung
- Laden Sie Python von der offiziellen Webseite herunter und installieren Sie es. Aktivieren Sie bei der Installation auf Windows die Option „Add Python to PATH“. Auf macOS können Sie den Paketmanager brew oder den offiziellen Installer verwenden. Auf Linux verwenden Sie die Repositories Ihres Systems.
- Überprüfen Sie die Installation. Öffnen Sie das Terminal und führen Sie den Befehl aus: python --version oder python3 --version. Stellen Sie sicher, dass die Version zwischen 3.11 und 3.13 liegt.
- Erstellen Sie einen Projektordner, zum Beispiel C:\Users\Ihr_Benutzername\parser_mobile_proxy oder /Users/Ihr_Benutzername/parser_mobile_proxy.
- Öffnen Sie den Projektordner in Ihrem Code-Editor. Erstellen Sie die Datei main.py und die Datei requirements.txt.
- Fügen Sie requirements.txt Folgendes hinzu: requests==2.32.3; beautifulsoup4==4.12.3; lxml==5.2.2.
- Installieren Sie die Abhängigkeiten mit dem Befehl pip install -r requirements.txt oder pip3 install -r requirements.txt.
- Überprüfen Sie, ob die Bibliotheken installiert sind. Führen Sie im Terminal python -c "import requests, bs4, lxml; print('ok')" aus. Es sollte „ok“ ausgegeben werden.
Wichtige Hinweise
Wichtig: Installieren Sie die Bibliotheken in einer virtuellen Umgebung, um Konflikte zwischen den Versionen zu vermeiden. Sie können eine Umgebung mit dem Befehl python -m venv .venv erstellen und aktivieren, indem Sie source .venv/bin/activate (macOS, Linux) oder .venv\Scripts\activate (Windows) verwenden, und dann pip install -r requirements.txt ausführen.
Tipp: Wenn Sie keine Administratorrechte haben, führen Sie die Benutzerinstallation mit pip install --user -r requirements.txt durch oder arbeiten Sie in einer virtuellen Umgebung.
Erwartetes Ergebnis
Sie können ein einfaches Skript ausführen und die benötigten Module ohne Fehler importieren.
Mögliche Probleme und Lösungen
- Der Befehl python kann nicht gefunden werden. Lösung: Verwenden Sie python3 oder stellen Sie sicher, dass PATH richtig konfiguriert ist. Installieren Sie Python erneut mit der Aktivierung von „Add to PATH“.
- Versionen von lxml sind konfliktbehaftet. Lösung: Aktualisieren Sie pip (python -m pip install --upgrade pip) und installieren Sie lxml anschließend erneut.
- Nicht genügend Berechtigungen bei der Installation. Lösung: Aktivieren Sie die virtuelle Umgebung oder verwenden Sie das Flag --user.
✅ Überprüfung: Der Befehl python -c "import requests, bs4; print('ready')" gibt „ready“ aus, und die Datei main.py befindet sich im Projektordner.
Schritt 2: Schneller Test des Parsens ohne Proxy
Ziel des Schrittes
Überprüfen, ob die Basisverbindung von Requests + BeautifulSoup funktioniert, bevor Sie Proxys anschließen. Wir werden eine normale Anfrage an eine Testseite stellen und den Titel extrahieren.
Step-by-Step-Anleitung
- Öffnen Sie die Datei main.py in Ihrem Editor.
- Fügen Sie den Grundcode für die Anfrage und das Parsing ein.
- Führen Sie das Skript aus und überprüfen Sie die Ausgabe.
Beispielcode
import requests; from bs4 import BeautifulSoup; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36"}); url = "https://example.com"; resp = session.get(url, timeout=30); html = resp.text; soup = BeautifulSoup(html, "lxml"); title = soup.title.text.strip() if soup.title else "(kein title-Tag)"; print("Status:", resp.status_code, "Titel:", title)Wichtige Hinweise
Wichtig: Wir verwenden einen mobilen User-Agent, um einen mobilen Browser zu simulieren. Dies hilft, das Verhalten mit dem mobilen Proxy im nächsten Schritt abzustimmen.
Tipp: Wenn die Zielseite unterschiedliche Versionen für Desktop- und mobile Geräte ausliefern kann, speichern Sie das HTML in einer Datei zur Fehlersuche: open("page.html", "w", encoding="utf-8").write(html). So können Sie die Struktur der Tags untersuchen.
Erwartetes Ergebnis
Das Skript gibt den Antwortcode und den Titel der Seite aus. Dies ist eine grundlegende Überprüfung, dass der Parser das HTML sieht und analysieren kann.
Mögliche Probleme und Lösungen
- Code 403 oder 404. Lösung: Überprüfen Sie die URL; versuchen Sie, den User-Agent zu ändern; stellen Sie sicher, dass die Seite erreichbar ist.
- Timeout. Lösung: Erhöhen Sie das Timeout auf 60, überprüfen Sie die Internetverbindung.
- Falsche Kodierung. Lösung: Verwenden Sie resp.encoding = resp.apparent_encoding vor dem Parsen.
✅ Überprüfung: Sie sehen den Status 200 und die Zeile Titel: (Seitenname). In dem Ordner könnte eine page.html erscheinen, wenn Sie das HTML gespeichert haben.
Schritt 3: Anfrage über mobilen Proxy
Ziel des Schrittes
Den mobilen Proxy mit Requests verbinden, eine Anfrage senden und sicherstellen, dass der Datenverkehr tatsächlich über den Proxy und nicht direkt läuft. Wir fügen auch die Authentifizierung hinzu und überprüfen die Header.
Was vorzubereiten ist
Die Daten Ihres mobilen Proxys: Host (z.B. proxy.provider.local oder IP-Adresse), Port (z.B. 12345), Benutzername und Passwort zur Authentifizierung oder eine bestätigte Whitelist-IP, wenn der Anbieter nach IP autorisiert. Die meisten mobilen Anbieter, einschließlich Lösungen wie mobileproxy.space, stellen diese Parameter im persönlichen Bereich zur Verfügung.
Step-by-Step-Anleitung
- Öffnen Sie die Datei main.py.
- Fügen Sie ein Dictionary proxies mit den Daten Ihres Proxys hinzu.
- Senden Sie die Anfrage über session.get mit dem Parameter proxies.
- Überprüfen Sie, ob die Antwort eingegangen ist, und parsen Sie die Seite.
Beispielcode
import requests; from bs4 import BeautifulSoup; PROXY_HOST = "PROXY_HOST"; PROXY_PORT = 12345; PROXY_USER = "USER"; PROXY_PASS = "PASS"; proxy_auth = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"; proxies = {"http": proxy_auth, "https": proxy_auth}; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1", "Accept-Language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"}); url = "https://example.com"; resp = session.get(url, proxies=proxies, timeout=45); print("HTTP:", resp.status_code); soup = BeautifulSoup(resp.text, "lxml"); print("TITLE:", soup.title.text.strip() if soup.title else "(nicht vorhanden)")Wichtige Hinweise
Wichtig: Wenn Ihr Anbieter die Authentifizierung nach IP durchführt, verwenden Sie das Format proxies ohne Benutzernamen und Passwort: "http": f"http://{PROXY_HOST}:{PROXY_PORT}". Stellen Sie sicher, dass Ihre aktuelle IPadresse in der Whitelist des Anbieters hinzugefügt wurde.
Tipp: Bei der ersten Ausführung fügen Sie den Parameter verify=False nur zur Diagnose von TLS-Fehlern hinzu. Lassen Sie dies nicht in der Produktion. Installieren Sie besser die Stammzertifikate, sofern der Anbieter dies verlangt.
Tipp: Speichern Sie die Proxy-Einstellungen in einer .env-Datei: PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS. Laden Sie diese mit os.getenv oder der Bibliothek python-dotenv, um Geheimnisse nicht im Code zu speichern.
Erwartetes Ergebnis
Sie erhalten einen Code von 200 und einen korrekten TITLE. Wenn auf der Zielseite die IP angezeigt wird, sollte sie sich von Ihrer unterscheiden, da die Anfrage über den mobilen Proxy läuft.
Mögliche Probleme und Lösungen
- 407 Proxy Authentication Required. Lösung: Überprüfen Sie den Benutzernamen und das Passwort; stellen Sie sicher, dass Sie das richtige Format der URL mit Authentifizierung verwenden.
- 403 Forbidden. Lösung: Ändern Sie den User-Agent in einen mobilen; überprüfen Sie die Header Accept-Language; verringern Sie die Anfragerate.
- ConnectionError oder ReadTimeout. Lösung: Erhöhen Sie das Timeout, überprüfen Sie die Stabilität des Proxys beim Anbieter und wiederholen Sie die Anfrage mit Backoff.
✅ Überprüfung: Die Antwort kommt mit dem Status 200. TITLE ist korrekt. Wenn Sie auf einer Seite testen, die Ihre IP anzeigt, sollte diese mit der IP des mobilen Proxys übereinstimmen (überprüfen Sie das Dashboard des Anbieters).
Schritt 4: IP-Adressen sicher und vorhersagbar rotieren
Ziel des Schrittes
Die Rotation der IPs des mobilen Proxys nach einem Timer oder durch API-Befehle einzurichten. Dies erhöht die Robustheit des Parsens und verringert die Wahrscheinlichkeit, unter Schutzmaßnahmen zu fallen. Wir implementieren zwei Möglichkeiten: eine zyklische Liste von Proxy-Endpunkten und die Rotation innerhalb eines Endpunkts durch API oder Timer beim Anbieter.
Step-by-Step-Anleitung
- Bestimmen Sie die Rotationsstrategie: nach Zeit (z.B. alle 5–10 Minuten), nach Anzahl der Anfragen (z.B. alle 10–20 Anfragen) oder hybrid.
- Wenn Sie mehrere Proxy-Endpunkte haben, bereiten Sie eine Liste vor und implementieren Sie das Round-Robin-Wechseln.
- Wenn Ihr Anbieter eine API zur IP-Wechsel in einem Endpunkt hat, fügen Sie den Aufruf im Code hinzu und warten Sie auf ein bestätigtes Rotationsfenster (in der Regel 10–60 Sekunden).
- Berücksichtigen Sie die Einschränkungen des Anbieters: minimaler Rotationszeitraum und API-Aufruflimits pro Tag.
- Planen Sie Pausen und IP-Überprüfungen nach der Rotation ein, um sicherzustellen, dass die neue IP aktiv ist.
Beispiel von Round-Robin über mehrere Endpunkte
import itertools, requests; from bs4 import BeautifulSoup; proxies_list = [ {"http": "http://user1:pass1@host1:10001", "https": "http://user1:pass1@host1:10001"}, {"http": "http://user2:pass2@host2:10002", "https": "http://user2:pass2@host2:10002"} ]; cycle = itertools.cycle(proxies_list); def fetch(url): s = requests.Session(); s.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"}); proxies = next(cycle); r = s.get(url, proxies=proxies, timeout=45); return r; r = fetch("https://example.com/catalog"); print(r.status_code)Beispiel der Rotation innerhalb eines Endpunkts durch API
Viele Anbieter mobiler Proxys, einschließlich Lösungen wie mobileproxy.space, ermöglichen es, die IP innerhalb desselben Endpunkts durch einen Timer (z.B. alle N Minuten) oder durch einen API-Aufruf zu wechseln. Im Code sieht dies wie eine zusätzliche Anfrage an die Service-URL des Anbieters aus. Unten finden Sie eine allgemeine Vorlage. Ersetzen Sie die URL und das Token durch Ihre Daten aus dem Anbieter-Dashboard. Berücksichtigen Sie dabei die Limits und Rotationsfenster.
import time, requests; def rotate_ip(api_rotate_url, timeout=30): try: r = requests.get(api_rotate_url, timeout=timeout); return r.status_code, r.text; except Exception as e: return None, str(e); api_url = "http://PROXY_HOST:PORT/changeip?token=YOUR_TOKEN"; status, body = rotate_ip(api_url); print("ROTATE:", status, body); time.sleep(20); # warten Sie auf das Rotationsfenster; s = requests.Session(); proxies = {"http": "http://USER:PASS@PROXY_HOST:PORT", "https": "http://USER:PASS@PROXY_HOST:PORT"}; resp = s.get("https://example.com", proxies=proxies, timeout=45); print(resp.status_code)Wichtige Hinweise
Wichtig: Rotation ist keine „Silberkugel“. Wenn Sie zu viele Anfragen in kurzer Zeit stellen, können Schutztriggers auch bei einem IP-Wechsel auslösen. Halten Sie eine moderate Rate ein, verwenden Sie zufällige Verzögerungen und Wiederholungen mit Backoff.
Tipp: Planen Sie die Rotation stundenweise und nach Belastung. Zum Beispiel: eine Rotation alle 10–20 Minuten plus Wechsel nach 15–25 Anfragen an die Domain. Dies glättet das Verhalten und sieht natürlicher aus.
Tipp: Speichern Sie Metadaten zur Anfrage: welcher Proxy verwendet wurde, welche IP-Adresse hatte, und welchen Status der Server zurückgab. Dies beschleunigt die Fehlersuche.
Erwartetes Ergebnis
Ihr Code wechselt stabil zwischen Proxy-Endpunkten oder initiiert den IP-Wechsel innerhalb eines Endpunkts und wartet auf das Rotationsfenster. Nach dem Wechsel werden die Anfragen weiterhin mit dem Status 200 ausgeführt.
Mögliche Probleme und Lösungen
- IP ändert sich nicht nach dem API-Aufruf. Lösung: Warten Sie länger, überprüfen Sie die Limits; stellen Sie sicher, dass Sie die richtige URL aufrufen und dass das Token gültig ist; überprüfen Sie die Statistiken im Dashboard des Anbieters.
- Verfügbarkeit sinkt während der Rotation. Lösung: wechseln Sie während der Rotation zu einem anderen Endpunkt oder verwenden Sie einen Backup-Kanal im Round-Robin-Modus.
- Häufige 429 Too Many Requests. Lösung: Erhöhen Sie das Intervall zwischen den Anfragen, reduzieren Sie die Gesamtzahl der gleichzeitig offenen Streams.
✅ Überprüfung: Bei regelmäßiger Ausgabe der aktuellen IP in den Logs ist zu sehen, dass die Adresse gemäß der Rotationsstrategie wechselt und der Status der Anfragen 200-299 bleibt.
Schritt 5: Fehler, Timeouts und Wiederholungen bearbeiten
Ziel des Schrittes
Ihr Parser soll widerstandsfähig gegenüber Netzwerkfehlern und zeitweiligen Serverfehlern sein. Wir fügen Timeouts, Wiederholungen mit exponentiellem Backoff, zufällige Verzögerungen und Logging hinzu.
Step-by-Step-Anleitung
- Bestimmen Sie die maximale Anzahl an Wiederholungen (z.B. 3–5) und die Basisverzögerung (z.B. 1–2 Sekunden).
- Implementieren Sie Backoff: Bei jedem Fehlschlag erhöhen Sie die Wartezeit um das Zweifache plus etwas randomisierten „Rauschen“.
- Fangen Sie die Codes 5xx und 429 als vorübergehend ab; betrachten Sie 4xx vorsichtig (403 ist oft eine dauerhafte Sperre).
- Fügen Sie verständliches Logging hinzu, um zu verstehen, was bei jedem Schritt passiert.
- Kapseln Sie den Netzwerkaufruf in eine Funktion fetch_safely, die leicht wiederverwendbar ist.
Beispielcode
import time, random, requests; from bs4 import BeautifulSoup; def fetch_safely(url, session, proxies=None, max_retries=4, base_delay=1.5, timeout=45): attempt = 0; while attempt <= max_retries: try: r = session.get(url, proxies=proxies, timeout=timeout); if r.status_code in (200, 201): return r; elif r.status_code in (429, 500, 502, 503, 504): delay = base_delay * (2 ** attempt) + random.uniform(0.0, 0.7); time.sleep(delay); attempt += 1; continue; elif r.status_code == 403: return r; else: return r; except (requests.exceptions.ConnectTimeout, requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError) as e: delay = base_delay * (2 ** attempt) + random.uniform(0.1, 0.9); time.sleep(delay); attempt += 1; continue; return NoneWichtige Hinweise
Wichtig: Setzen Sie angemessene Timeouts: 30–60 Sekunden für instabile Verbindungen, 10–20 Sekunden für schnelle Netzwerke. Deaktivieren Sie die SSL-Prüfung nicht, es sei denn, es ist zwingend erforderlich.
Tipp: Verwenden Sie für Logs das Modul logging. Fügen Sie zu Beginn eine minimale Konfiguration hinzu: logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s"). Dies ist praktisch für die Diagnose.
Tipp: Differenzieren Sie zwischen „vorübergehenden Fehlern“ und „dauerhaften Ausfällen“. Bei vorübergehenden Fehlern wiederholen; bei dauerhaften Problemen dokumentieren und weitermachen, um nicht in eine Schleife zu geraten.
Erwartetes Ergebnis
Das Skript läuft auch bei vorübergehenden Fehlern weiter und gibt entweder eine Antwort zurück oder wechselt korrekt zur nächsten Aufgabe, ohne zu crashen.
Mögliche Probleme und Lösungen
- Wiederholungen helfen nicht, immer 429. Lösung: Reduzieren Sie die Anfragerate, verlängern Sie die Wartezeiten, erhöhen Sie das Fenster zwischen den IP-Rotationen.
- Dauerhafte 403. Lösung: Klären Sie die Richtlinien der Webseite, überprüfen Sie die Header auf Richtigkeit, reduzieren Sie die Anfragerate, verwenden Sie gegebenenfalls offizielle APIs.
- Häufige ConnectionError. Lösung: Überprüfen Sie den Anbieter des mobilen Proxys; möglicherweise ist ein anderer Standort oder ein anderer Port erforderlich.
✅ Überprüfung: Bei der Simulation von Fehlern sehen Sie in den Logs Wiederholungen mit fortschreitender Wartezeit. Nach 1–2 Versuchen enden viele Anfragen erfolgreich.
Schritt 6: Erkennung und Verarbeitung von Captchas auf legale Weise
Ziel des Schrittes
Erlernen Sie die Erkennung, wenn eine Seite ein Captcha zurückgibt, und reagieren Sie entsprechend: reduzieren Sie die Last, pausieren Sie temporär die Anfragen, nutzen Sie die IP-Rotation korrekt. Wir umgehen keinen Schutz, sondern handeln im Rahmen von gutem Scraping.
Step-by-Step-Anleitung
- Bestimmen Sie die Anzeichen für Captchas auf den Zielwebseiten: das Vorhandensein von Schlüsselwörtern im HTML (captcha, g-recaptcha), unübliche Felder in Formularen, Placeholder-Seiten.
- Fügen Sie im Code eine Überprüfung auf den HTML-Inhalt vor dem Parsen der Hauptlogik hinzu.
- Wenn ein Captcha aufgetreten ist, führen Sie milde Maßnahmen durch: erhöhen Sie die Pause; reduzieren Sie die Anfragerate auf der Domain; initiieren Sie die IP-Rotation; versuchen Sie eine Wiederholungsanfrage.
- Wenn das Captcha bestehen bleibt, unterbrechen Sie automatisch die Versuche und überprüfen Sie die Bedingungen der Webseite. Möglicherweise sind die Daten über eine offizielle API verfügbar.
Beispielcode
from bs4 import BeautifulSoup; import time, requests; def is_captcha(html): text = html.lower(); hints = ["captcha", "g-recaptcha", "hcaptcha", "distil", "cloudflare", "please verify", "are you a human"]; return any(h in text for h in hints); def get_with_captcha_handling(url, session, proxies, rotate_func=None): r = session.get(url, proxies=proxies, timeout=45); if r.status_code == 200 and not is_captcha(r.text): return r; time.sleep(10); if rotate_func: try: rotate_func(); time.sleep(20); except Exception: pass; r2 = session.get(url, proxies=proxies, timeout=60); return r2Wichtige Hinweise
Wichtig: Wenn das Captcha weiterhin zurückkommt, reduzieren Sie die Scanfrequenz, warten Sie auf das nächste Rotationsfenster oder wechseln Sie zu einem anderen Endpunkt. Halten Sie sich an die Grundsätze des guten Scraping.
Tipp: Manchmal wird das Captcha nur für bestimmte Pfade angezeigt. Reduzieren Sie die Rate nur für diese spezifischen Pfade und nicht für die gesamte Domain. Dies bewahrt die allgemeine Geschwindigkeit.
⚠️ Achtung: Wir diskutieren nicht das Umgehen von Captchas mithilfe von Drittanbieterdiensten, Umgehungsskripten, Browseremulationen und ähnlichen Techniken. Arbeiten Sie nur innerhalb erlaubter Grenzen und verwenden Sie offizielle APIs, wenn verfügbar.
Erwartetes Ergebnis
Das Skript kann sanft auf das Auftreten von Captchas reagieren: es macht Pausen, initiiert den IP-Wechsel (sofern verfügbar) und wiederholt die Anfrage. Dies verringert die Anzahl falscher Ablehnungen und hilft, die Stabilität zu wahren.
Mögliche Probleme und Lösungen
- Captchas bei jeder Anfrage. Lösung: Reduzieren Sie die Rate drastisch, verwenden Sie unterschiedliche Zeitabstände zwischen den Anfragen, ändern Sie die Zeitzone oder Region des Proxys beim Anbieter (wenn verfügbar), überprüfen Sie robots.txt.
- Das Captcha verschwindet, aber die Daten sind instabil. Lösung: Erhöhen Sie das Timeout, speichern und analysieren Sie das HTML, vergleichen Sie die Versionen von Seiten für verschiedene IPs.
✅ Überprüfung: Bei künstlicher Auslösung (z.B. häufige Anfragen über kurze Zeit) zeigen die Logs Pausen und Rotationen, danach folgen erfolgreiche Antworten ohne Captcha.
Ergebnisüberprüfung
Checkliste
- Python ist installiert, Abhängigkeiten sind vorhanden.
- Das Skript ohne Proxy erhält HTML und parst den Titel.
- Das Skript mit mobilem Proxy gibt den Status 200 zurück.
- IP-Rotation ist aktiviert und überprüft worden.
- Wiederholungen bei Fehlern funktionieren, Timeouts sind konfiguriert.
- Es gibt eine Behandlung für Anzeichen eines Captchas.
- Daten werden erwartungsgemäß in eine Datei gespeichert oder in der Konsole ausgegeben.
Wie zu testen
- Führen Sie die Basisanfrage ohne Proxy aus und stellen Sie sicher, dass das Titelparsen funktioniert.
- Aktivieren Sie den Proxy und wiederholen Sie die Anfrage, vergleichen Sie die Ergebnisse.
- Fordern Sie einen IP-Wechsel beim Anbieter an (sofern verfügbar) und wiederholen Sie die Anfrage nach 20–60 Sekunden.
- Reduzieren Sie absichtlich das Timeout auf 1–2 Sekunden und überprüfen Sie, ob Wiederholungen mit Backoff aktiviert werden und sich nach der Wiederherstellung des Timeouts wieder normalisieren.
- Laden Sie die Webseite mehrmals hintereinander und stellen Sie sicher, dass bei Anzeichen von Captchas Pausen eingelegt und, falls nötig, Rotationen ausgelöst werden.
Indikatoren für den Erfolg
- Die Erfolgsquote höher als 90 % auf „ruhigen“ Webseiten.
- Codes 429 und 5xx treten selten auf und werden durch Wiederholungen behandelt.
- Die IP-Rotation erfolgt im festgelegten Modus, ohne längere Stillstände.
Tipp: Führen Sie Metriken zu „Antwortzeiten“ und „Anzahl der Wiederholungen“ ein und protokollieren Sie sie. Dies hilft, zu verstehen, wann die Rotationsstrategie oder die Anfragerate geändert werden sollte.
Typische Fehler und Lösungen
- Problem: 407 Proxy Authentication Required. Grund: falscher Benutzername oder Passwort, falsch formatierte Proxy-URL. Lösung: Überprüfen Sie das Format http://USER:PASS@HOST:PORT, stellen Sie sicher, dass keine zusätzlichen Zeichen und Leerzeichen vorhanden sind; wenn die Authentifizierung per IP erfolgt — entfernen Sie Benutzername und Passwort.
- Problem: 403 Forbidden. Grund: Der Schutz der Webseite wurde aktiviert, ungeeigneter User-Agent oder zu häufige Anfragen. Lösung: Verwenden Sie einen mobilen User-Agent, reduzieren Sie die Anfragerate, aktivieren Sie die IP-Rotation, überprüfen Sie Accept, Accept-Language und Referer.
- Problem: 429 Too Many Requests. Grund: Höchstgrenze der Anfragerate überschritten. Lösung: Fügen Sie einen exponentiellen Backoff hinzu, erhöhen Sie die Pausen, reduzieren Sie die Häufigkeit der Rotationen und verteilen Sie die Anfragen über Tageszeiten.
- Problem: ConnectionError oder ReadTimeout. Grund: instabile Proxy-Verbindung oder überlastetes Netzwerk. Lösung: Erhöhen Sie das Timeout, wiederholen Sie mit Backoff und verwenden Sie einen Reserve-Endpunkt.
- Problem: falsches Parsing, leere Daten. Grund: die HTML-Struktur hat sich geändert oder Inhalte werden über JavaScript geladen. Lösung: Aktualisieren Sie die BeautifulSoup-Selektoren; wenn die Daten dynamisch generiert werden, untersuchen Sie die Netzwerkanfragen der Seite und verwenden Sie offizielle JSON-Endpunkte, wenn verfügbar und erlaubt.
- Problem: Captcha auf jeder Seite. Grund: aggressive Last oder verdächtige Aktivitäten. Lösung: Reduzieren Sie die Anfragerate, erhöhen Sie die Pausen, verwenden Sie Rotation, überprüfen Sie die Header auf Richtigkeit und befolgen Sie robots.txt.
- Problem: Sperrung nach mehreren erfolgreichen Anfragen. Grund: vorhersehbares Skriptverhalten. Lösung: Fügen Sie zufällige Verzögerungen hinzu, variieren Sie die Reihenfolge der Anfragen, mischen Sie die Proxys und aktualisieren Sie die Header.
Tipp: Speichern Sie Beispiele des HTML vor und nach einem Vorfall. Das hilft, Änderungen in der Webseite von Anzeichen eines Anti-Bot-Schutzes schnell zu unterscheiden.
Erweiterte Möglichkeiten
Fortgeschrittene Einstellungen
- Sitzungen und Cookies: Verwenden Sie requests.Session für das automatische Speichern von Cookies, dies ahmt das Verhalten eines echten Browsers nach.
- Header: Fügen Sie gegebenenfalls Accept, Accept-Language, Referer und DNT hinzu. Ändern Sie den User-Agent aus einem Pool mobiler Agenten.
- SOCKS-Proxys: Bei Bedarf fügen Sie requests[socks] hinzu. Mobile Proxys werden jedoch meist als HTTP(S) bereitgestellt.
- Speichern in CSV oder JSON: Speichern Sie die Daten nach dem Parsing in Dateien. Das ist praktisch für Integrationen.
Beispiel eines Mini-Pipelines für die Analyse
import csv, requests, time; from bs4 import BeautifulSoup; MOBILE_UA = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"; session = requests.Session(); session.headers.update({"User-Agent": MOBILE_UA}); proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}; urls = ["https://example.com/page1", "https://example.com/page2"]; rows = []; for u in urls: r = session.get(u, proxies=proxies, timeout=45); if r.status_code == 200: s = BeautifulSoup(r.text, "lxml"); title = s.title.text.strip() if s.title else ""; rows.append({"url": u, "title": title}); time.sleep(2); open("data.csv", "w", newline="", encoding="utf-8"); with open("data.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=["url","title"]); w.writeheader(); w.writerows(rows); print("gespeichert:", len(rows))Optimierung
- Batch-Verarbeitung: Gruppieren Sie Anfragen nach Domains unter Berücksichtigung von Verzögerungen und Rotationen.
- Caching: Speichern Sie bereits empfangene Seiten lokal, um zu vermeiden, dass sie unnötig erneut angefragt werden.
- Strategie für Ausdauer: Planen Sie die Anfragezeiten zu „nicht-spitzen“ Zeiten, wenn die Webseite weniger überlastet ist.
Tipp: Wenn Sie viele Aufgaben haben, teilen Sie sie in kleine Chargen auf und führen Sie sie nacheinander aus. Das erhöht die Stabilität und verringert die Wahrscheinlichkeit von Captchas.
Tipp: Viele Anbieter von mobilen Proxys (einschließlich Lösungen wie mobileproxy.space) bieten ein Dashboard mit visuellen Statistiken an. Überprüfen Sie die Zeiten, Frequenzen und Antwortcodes — dies gibt Ihnen ein Gefühl dafür, wann eine Rotation sinnvoller ist.
FAQ
Frage: Wie finde ich heraus, ob die Anfrage wirklich über den mobilen Proxy geht? Antwort: Überprüfen Sie im Dashboard des Anbieters die aktiven Verbindungen und die aktuelle externe IP, vergleichen Sie sie mit der, die Sie in den Seitenantworten sehen. Außerdem zeigt der Anbieter normalerweise Statistiken über die Anfragen an den Endpunkt.
Frage: Wie wähle ich den User-Agent: Android oder iOS? Antwort: Wählen Sie die Plattform, für die Ihr Inhalt optimiert ist (Mobile Version der Webseite). Oft liefert der Android-Agent vorhersehbare Ergebnisse. Testen Sie beide und stellen Sie fest, wo es weniger Ablehnungen gibt.
Frage: Wie oft sollte ich die IP beim Parsen wechseln? Antwort: Grundsätzlich gilt: nicht öfter als alle 10–20 Minuten oder nach 15–25 Anfragen an die Domain. Passen Sie die Frequenz an die Belastung an, vermeiden Sie häufige Rotationen.
Frage: Was tun, wenn die Webseite Inhalte über JavaScript ausliefert? Antwort: Untersuchen Sie die Netzwerkanfragen der Seite (in den Entwicklerwerkzeugen des Browsers). Oft kommen die Daten über JSON-Endpunkte. Wenn der Zugriff legal ist und die Bedingungen nicht verletzt, verwenden Sie diese Endpunkte. Andernfalls überprüfen Sie die Regeln der Webseite.
Frage: Kann ich mehrere mobile Anbieter gleichzeitig nutzen? Antwort: Ja, wenn das für die Verteilung der Last erforderlich ist. Richten Sie Round-Robin ein und überwachen Sie die Limits jedes Anbieters.
Frage: Wie speichere ich Zugangsdaten sicher? Antwort: Verwenden Sie Umgebungsvariablen und eine .env-Datei, speichern Sie keine Geheimnisse im Repository. In der Produktion verwenden Sie Secret Manager zum Speichern von Geheimnissen.
Frage: Wie stoppe ich das Skript richtig bei massiven Fehlern? Antwort: Implementieren Sie einen Zähler für nicht erfolgreiche Versuche und eine obere Schwelle. Wenn aufeinanderfolgend N Domain-Anfragen fehlgeschlagen sind, machen Sie eine längere Pause, protokollieren Sie den Vorfall und beenden Sie den Prozess.
Frage: Brauche ich lxml, wenn der eingebaute Parser html.parser vorhanden ist? Antwort: Der eingebaute Parser eignet sich für einfache Fälle. lxml ist schneller und robuster bei teilweise fehlerhaftem HTML. Für regelmäßiges Parsen wird lxml empfohlen.
Frage: Was tun, wenn die Webseite das Layout ändert? Antwort: Speichern Sie Testseiten, fügen Sie regressionsprüfende Selektoren hinzu. Aktualisieren Sie bei Änderungen die Struktur von BeautifulSoup und schreiben Sie Adapterfunktionen für die neue Struktur.
Frage: Warum brauche ich einen mobilen Proxy, wenn ein normaler auch funktioniert? Antwort: Mobile Adressen wecken aufgrund der Besonderheiten mobiler Netzwerke und des Datenverkehrs weniger Verdacht. Das erhöht die Chance auf stabile Antworten bei angemessener Last.
Fazit
Zusammenfassung der durchgeführten Maßnahmen: Sie haben Python und die Bibliotheken Requests und BeautifulSoup installiert, das grundlegende Parsing ohne Proxy getestet, den mobilen Proxy hinzugefügt und sichergestellt, dass die Anfragen darüber laufen, die IP-Rotation auf verschiedene Weisen eingerichtet sowie Fehler- und Captcha-Handling implementiert. Jetzt haben Sie ein Grundprojekt für nachhaltiges und faires Scraping von öffentlichen Daten.
Was Sie als Nächstes tun können: Entwickeln Sie den Parser nach Ihren Zielen weiter — fügen Sie neue Selektoren hinzu, speichern Sie Daten in einer Datenbank, richten Sie einen Zeitplan für die Ausführungen ein. Fügen Sie Alarme hinzu, wenn die Erfolgsquote der Anfragen sinkt oder die Status 429 und 403 steigen. Fügen Sie eine Konfigurationsdatei für verwaltbare Parameter (Frequenz, Rotation, Timeouts) hinzu.
Wohin Sie sich entwickeln können: Lernen Sie asynchrone Anfragen in Python (aiohttp), Aufgabenwarteschlangen (Celery, RQ), Datenspeicherung und -analyse (SQLite, PostgreSQL, Pandas). Berücksichtigen Sie auch die rechtlichen Aspekte der Datenverarbeitung und der Interaktion mit Webseiten sowie den offiziellen Datenzugang über legale APIs. Für mobile Proxys nutzen Sie Funktionen, die mit denen moderner Dienste wie mobileproxy.space übereinstimmen: flexible Rotation, Statistiken, verschiedene Regionen und stabile Unterstützung.
Tipp: Speichern Sie diesen Guide und kehren Sie häufiger zu den Abschnitten Schritt 4: IP-Rotation und Schritt 5: Fehler, Timeouts und Wiederholungen zurück. Sie bieten den größten Gewinn an Stabilität und helfen, Ausfallzeiten zu vermeiden.
⚠️ Achtung: Überprüfen Sie immer robots.txt und die Nutzungsbedingungen der Zielwebseiten. Wenn die Regeln automatisiertes Datensammeln verbieten, respektieren Sie die Verbote und suchen Sie nach legalen Alternativen, wie beispielsweise offenen oder kostenpflichtigen APIs.