Zurück zum Blog

Parser liefert leere Felder, Proxy ist unschuldig: So beheben Sie Layout-Drift

Der Parser hat nichts zurückgegeben, Sie wechseln den Proxy – dabei lag das Problem im Redesign der Website. Lassen Sie uns besprechen, wie man in fünf Minuten einen Bann von einem Drift im Layout unterscheidet, wie die adaptiven Selektoren von Scrapling funktionieren (Elementabdruck in SQLite und Suche nach Ähnlichkeit in 2,46 ms) und warum das Referenzbild aus demselben Geo aufgenommen werden muss, aus dem Sie später die Daten sammeln.

📅5. September 2026
Parser liefert leere Felder, Proxy ist unschuldig: So beheben Sie Layout-Drift

Der Parser arbeitete ein halbes Jahr, und heute sind leere Zeilen in die Datenbank eingeflossen. Der erste Gedanke — gesperrt, ich muss den Proxy wechseln. Sie ändern den Pool, erhöhen die Qualität der IPs, zahlen für Wohnsitzproxies statt für Rechenzentrumsproxies — und die Felder bleiben trotzdem leer. Denn der Grund lag nicht an der Sperrung: Die Website hat auf ein neues Layout umgestellt, und Ihr CSS-Selektor ist an nichts mehr gebunden.

Das ist der teuerste Typ von Fehler, denn er bleibt stumm. Eine Sperre ist sofort sichtbar: 403, CAPTCHA, Umleitung. Das Drift des Layouts lässt nichts fallen — HTTP 200, Seite erhalten, Traffic bezahlt, und am Ende None. Lassen Sie uns besprechen, wie man in fünf Minuten das eine vom anderen unterscheidet und wie man aufhört, Selektoren nach jedem Redesign manuell neu zu schreiben.

Wer braucht das

Ein Leitfaden für diejenigen, die den Parser länger als einen Sprint in Produktion haben: Überwachung der Preise von Wettbewerbern, Sammlung von Bewertungen, Aggregation von Stellenangeboten, tägliche Exporte für Analysen. Wenn Sie das Skript einmal ausführen und dann wegwerfen — betrifft Sie das Drift des Layouts nicht. Wenn das Skript monatelang über Cron läuft, ist das Ihre Hauptausgabe für die Wartung.

Das Ausmaß des Problems ist nicht erfunden. Laut Schätzungen der Analysten von GroupBWT verursachen unkontrollierte strukturelle Änderungen an Websites etwa 40–60% wiederkehrende Kosten für die Wartung von Scrapers in großen Projekten. In bestimmten Branchen benötigen 10–15% der Crawler wöchentlich Reparaturen — aufgrund von DOM-Verschiebungen, Fingerprinting und Throttling von Endpunkten. Das heißt, die Reparatur von Selektoren konkurriert preislich mit dem Umgehen von Anti-Bot-Maßnahmen, während ihr viel weniger Aufmerksamkeit geschenkt wird.

Der Hintergrund ist dabei nicht freundlich: Im Bericht von Apify „State of Web Scraping 2026“ haben 65,8% der Befragten die Nutzung von Proxys erhöht, 58,3% berichteten von steigenden Proxy-Kosten im Jahresvergleich, und mehr als 62% — von einem allgemeinen Anstieg der Infrastrukturkosten, hauptsächlich aufgrund verstärkter Bot-Abwehr. Vor diesem Hintergrund ist es doppelt ärgerlich, bezahlten Traffic auf Seiten zu verbrennen, von denen Sie sowieso nichts abrufen.

Schritt 1. Unterscheidung zwischen Sperre und Drift des Layouts

Die Diagnose dauert einige Minuten und erfolgt strikt der Reihenfolge nach — andernfalls kann man leicht den falschen Fehler „reparieren“.

  1. Überprüfen Sie den Antwortcode und die Größe des Körpers. 403, 429, 503, Umleitung auf die Überprüfungsseite oder ein Körper von 2–5 KB — das ist Anti-Bot. HTTP 200 und eine vollständige Seite von 200–800 KB — die Website hat Sie hereingelassen, es liegt nicht am Proxy.
  2. Speichern Sie den Roh-HTML auf der Festplatte und öffnen Sie ihn mit Ihren Augen. Nicht im Debugger, sondern im Browser. Wenn das Produkt/Bewertung/Preis vorhanden ist, der Parser sie aber nicht sieht — das ist Drift des Layouts.
  3. Finden Sie den benötigten Text durch Suchen in der Datei. Ist im HTML vorhanden, aber nicht über Ihren Selektor zugänglich — das Markup hat sich geändert. Ist es überhaupt nicht vorhanden — der Inhalt wird per Skript geladen, ein Browser-Engine ist erforderlich, kein HTTP-Request.
  4. Vergleichen Sie mit dem vorherigen erfolgreichen Export. Diffen Sie das alte und das neue HTML derselben URL: Normalerweise sieht man sofort die neue Wrapper-Klasse, den umgezogenen Block oder den Austausch von id gegen data-*.
  5. Überprüfen Sie, ob die Website Ihnen eine andere Version der Seite gegeben hat. Darüber — separat weiter unten, denn hier hat der Proxy doch etwas damit zu tun.

Wenn nach dem dritten Punkt die Diagnose „Markup ist verschoben“ lautet, macht es keinen Sinn, den Proxy zu wechseln. Ein Parser ist erforderlich, der in der Lage ist, ein Element zu finden, selbst wenn der Selektor abgelaufen ist.

Schritt 2. Was sind adaptive Selektoren

Die Idee ist einfach: Anstatt sich fest an die Zeile .product-card > h3.title zu binden, speichert die Bibliothek einmal das „Porträt“ des benötigten Elements und sucht beim nächsten Start nach dem Element auf der Seite, das diesem Porträt am ähnlichsten ist.

Am praktischsten ist dies in Scrapling umgesetzt — einem offenen Python-Framework von Karim Shoaib. Das Projekt wurde im Oktober 2024 veröffentlicht und hatte bis September 2026 über 78.000 Sterne auf GitHub gesammelt; die letzte Veröffentlichung zum Zeitpunkt des Schreibens ist v0.4.15 vom 23. August 2026, die Commits erfolgen täglich. Es wird Python 3.10+ benötigt.

Die Mechanik der adaptiven Suche funktioniert so. Wenn Sie den Selektor mit auto_save=True aufrufen, speichert Scrapling den Fingerabdruck des Elements:

  • Name des Tags, Text und alle Attribute mit ihren Werten;
  • Namen der Nachbartags;
  • Weg zum Element — nur nach den Namen der Tags;
  • Tag, Attribute und Text des Elternteils.

Der Fingerabdruck wird in einer lokalen SQLite-Datenbank abgelegt und mit dem Paar „Domain + Identifikator“ verknüpft. Die Domain wird aus der URL der Seite entnommen (oder über den Parameter adaptive_domain festgelegt), der Identifikator ist standardmäßig die Zeile des Selektors selbst — oder Ihr eigener, wenn Sie identifier= übergeben.

Wenn sich das Layout ändert und der normale Selektor nichts zurückgibt, hebt der Aufruf mit adaptive=True den gespeicherten Fingerabdruck an und durchläuft alle Elemente der Seite, wobei eine unscharfe Ähnlichkeitsbewertung berechnet wird — bis hin zur Reihenfolge der Attribute. Das Element mit der höchsten Übereinstimmung wird zurückgegeben.

Das kostet wenig. Laut den offiziellen Benchmarks des Projekts dauert das Parsen 1,99 ms im Vergleich zu 2,01 ms bei Parsel/Scrapy, 22,93 ms bei PyQuery, 80,57 ms bei Selectolax und 1541 ms bei BeautifulSoup mit lxml. Die adaptive Suche nach einem ähnlichen Element dauert 2,46 ms im Vergleich zu 13,3 ms bei AutoScraper. Das heißt, die Versicherung gegen Redesigns fügt der Anfrage etwa zwei Millisekunden hinzu, im Kontext von Netzwerkverzögerungen von mehreren Hundert Millisekunden.

Schritt 3. Installation und Aktivierung

Die Installation hängt davon ab, ob Sie einen Browser benötigen:

  1. pip install scrapling — nur der Parser, ohne Netzwerkteil. Das reicht, wenn Sie das HTML mit Ihrem Code erhalten.
  2. pip install "scrapling[fetchers]", dann scrapling install — fügt Fetcher hinzu und lädt Browser mit Abhängigkeiten herunter.
  3. Zusätzlich: [ai] — MCP-Server, [rag] — Wrapper für RAG, [shell] — interaktive Konsole, [all] — alles auf einmal. Es gibt ein fertiges Image pyd4vinci/scrapling.

Danach — zwei Durchläufe. Der erste auf dem aktiven Layout speichert den Fingerabdruck, der zweite kann bereits ein Redesign überstehen:

  1. Referenzdurchlauf. Erstellen Sie ein Selector-Objekt mit adaptive=True und übergeben Sie unbedingt url — andernfalls wird die Domain in den Schlüssel "default" verschoben, und die Fingerabdrücke verschiedener Websites vermischen sich. Rufen Sie den benötigten Selektor mit auto_save=True auf.
  2. Produktiver Durchlauf. Der gleiche Selektor, aber mit adaptive=True. Solange das Markup intakt ist, wird der normale Weg funktionieren. Wenn es kaputt geht — wird die Ähnlichkeitssuche aktiviert.
  3. Protokollieren Sie Abweichungen. Der Moment, in dem der normale Selektor nichts zurückgibt, der adaptive jedoch etwas gefunden hat, ist ein Signal „Website umgezogen“, das muss im Monitoring sichtbar sein und darf nicht stillschweigend ignoriert werden.

Ein wichtiger Punkt zur Überschreibung: Die Speicherung wird nicht akkumuliert. Ein erneutes auto_save für dasselbe Paar „Domain + Identifikator“ überschreibt den vorherigen Fingerabdruck. Daher wird der Referenzabdruck auf einer eindeutig korrekten Seite aufgenommen und nicht in einer Schleife über den gesamten Pool von URLs.

Schritt 4. Proxys: Wo sie doch eine Rolle spielen

Wir haben damit begonnen, dass das Drift des Layouts nichts mit Proxys zu tun hat. Das ist genau zur Hälfte richtig, und die andere Hälfte kostet Geld.

Die Website kann Ihnen ein anderes Markup aufgrund des Proxy geben. Lokalisierung, Sprache und Land ändern das Seitenlayout: andere Reihenfolge der Blöcke, andere Klassen, andere Formate für Preise und Daten. Das ist keine Hypothese — im Scrapling gibt es eine anschauliche Korrektur: In Version 0.4.12 wurde die erzwungene Lokalisierung en-US aus StealthyFetcher entfernt, weil die aufgezwungene Lokalisierung nicht mit dem tatsächlichen Geo übereinstimmte und das Verhalten störte. Daher die praktische Regel: Erstellen Sie den Referenzabdruck aus demselben Geo, aus dem Sie später Daten sammeln. Ein Fingerabdruck, der über eine deutsche IP aufgenommen wurde, wird schlechter mit der Seite übereinstimmen, die über eine brasilianische erhalten wurde — und Sie erhalten einen falschen Alarm „Website hat das Layout geändert“.

Praktische Folgerungen:

  • Wenn der Pool multinationale ist — trennen Sie die Fingerabdrücke über adaptive_domain, indem Sie einen Schlüssel in der Form „Domain + Land“ festlegen. Andernfalls wird ein Eintrag in SQLite ständig durch Versionen aus verschiedenen Geos überschrieben.
  • Für lange Szenarien halten Sie ein Land und eine Sitzung für die gesamte Aufgabe. Wie man das umsetzt, wird ausführlich im Material über Sticky-Sessions und wann man sie verwenden sollte behandelt.
  • A/B-Tests und schrittweise Rollouts bieten gleichzeitig zwei aktive Layouts auf derselben Domain. Hier ist die adaptive Suche besonders nützlich: Sie wird das Element aus beiden Zweigen extrahieren, während ein harter Selektor zufällig in der Hälfte der Anfragen nichts zurückgibt.

Proxys in Scrapling können auf allen Ebenen festgelegt werden. Für schnelle HTTP-Anfragen haben Fetcher und AsyncFetcher den Parameter proxies. Für Sitzungen gibt es ProxyRotator, dem eine Liste von Adressen übergeben wird — er wird in FetcherSession eingesetzt. Browser-Sitzungen DynamicSession und StealthySession akzeptieren Proxys auf Sitzungsebene, damit die IP während des Szenarios nicht wechselt.

Eine weitere Sache, die sowohl den Pool als auch die Nerven schont, wurde in Version 0.4.12 eingeführt — AutoThrottle: Die Bibliothek passt selbstständig die Pausen zwischen den Anfragen an die Antworten des Servers an, verdoppelt die Verzögerung bei einer Sperrung und respektiert den Header Retry-After. Das ist genau das Verhalten, das sorgfältiges Scraping von der naiven Überlastung mit Rückversuchen unterscheidet.

Fallstricke

  • Committen Sie SQLite mit Fingerabdrücken nicht in git. Darüber warnt die Dokumentation ausdrücklich. Verwenden Sie außerdem auto_save nicht auf Seiten mit persönlichen Daten — der Text und die Attribute des Elements gelangen in den Fingerabdruck.
  • Adaptive Suche ist kein Ersatz für Monitoring. Sie wird das „ähnlichste“ Element zurückgeben, aber das ähnlichste ist nicht immer das richtige. Wenn die Website den Preis mit Rabatt und den Preis ohne Rabatt vertauscht hat, ist die Ähnlichkeit hoch, die Daten sind jedoch falsch. Halten Sie Überprüfungen auf Wertebereiche und den Anteil leerer Felder im Export.
  • Stille Fehler sind teurer als laute. Solange der Selektor stillschweigend None zurückgibt, läuft die Pipeline weiterhin über die Seiten und verbrennt bezahlten Traffic. Über die tatsächlichen Kosten eines Gigabytes, aus dem keine Daten extrahiert wurden, gibt es eine separate Analyse — warum der Preis für Proxys pro GB irreführend ist.
  • Der Fingerabdruck altert. Nach einem bestätigten Redesign sollten Sie den Referenzabdruck erneut aufnehmen, andernfalls wird die nächste Änderung der Website bereits als veraltetes Porträt betrachtet, und die Genauigkeit wird sinken.
  • Wenn der Inhalt überhaupt nicht im HTML vorhanden ist — hilft die Adaptivität nicht, ein Browser-Fetcher ist erforderlich. In 0.4.15 wurden die Browser-Tabs zwischen den Anfragen wiederverwendet, und die Methode close_pages() schließt sie zwangsweise; dort wurden auch Hängungen im Headless-Modus behoben, und die Lösung für Turnstile ist nicht mehr von der Lokalisierung des Browsers abhängig.

Welchen Proxy-Typ für diese Aufgabe wählen

Die Wahl wird nicht vom Parser, sondern von der Ziel-Website diktiert:

  • Rechenzentrumsproxies — für Websites ohne ernsthafte Anti-Bot-Maßnahmen: Dokumentationen, staatliche Register, offene Kataloge, RSS- und CSV-Feeds (für letztere wurden in 0.4.13 XMLFeedSpider und CSVFeedSpider mit automatischer Gzip-Dekompression hinzugefügt). Günstig und schnell, und die Stabilität des Markups ist hier normalerweise höher.
  • Wohnsitzproxies — für Marktplätze, Aggregatoren und alles, was die Ausgabe nach Geo personalisiert. Hier ist es entscheidend, den Referenzabdruck aufzunehmen und Daten aus einem Land zu sammeln, andernfalls reparieren Sie nicht den Fehler, sondern Ihre eigene Geografie.
  • Mobile Proxies — wenn die Website das mobile Layout ausgibt und es so geparst werden muss, oder wenn das Vertrauen in die IP wichtiger ist als der Preis pro Gigabyte.

Kurz gesagt

Leere Felder im Export sind zwei verschiedene Diagnosen mit unterschiedlicher Behandlung. Überprüfen Sie zuerst den Antwortcode und das rohe HTML: Wenn die Seite vollständig angekommen ist, müssen Sie den Proxy nicht wechseln, das Markup ist verschoben. Adaptive Selektoren von Scrapling beheben diese Art von Fehlern in wenigen Millisekunden pro Anfrage — speichern Sie den Fingerabdruck auf dem aktiven Layout, aktivieren Sie adaptive=True im Einsatz und protokollieren Sie die Momente des Auslösens als Signal für ein Redesign. Und halten Sie das Geo stabil: Die Hälfte der „plötzlichen Redesigns“ stellt sich in der Praxis als eine andere Sprachversion der Seite heraus, die aufgrund eines Wechsels des Ausgangslandes angekommen ist.

Wenn stabiles Geo und vorhersehbare Sitzungen genau das sind, was Ihrem Parser fehlt, schauen Sie sich Wohnsitzproxies von ProxyCove an: Auswahl des Landes, Sticky-Sitzungen und Bezahlung für tatsächlich genutzten Traffic.