Scarnox · Blog

Preisüberwachung mit Web-Scraping: ein praxisnaher Leitfaden

Preisüberwachung bedeutet, den Preis eines Produkts auf einer Reihe von Seiten nach Zeitplan zu prüfen und das Gesehene festzuhalten, damit du über die Zeit vergleichen kannst. Händler, Marktplätze und Analysten nutzen sie alle. Preis-Scraping gehört außerdem zu den häufigsten Wegen, wie ein Scraper auf ein Captcha trifft, deshalb lohnt es sich, das Design richtig anzugehen. Dieser Leitfaden behandelt, was du überwachen solltest, wie du Zahlen aus Seiten parst, die nie zum Parsen gedacht waren, wie du Änderungen speicherst und darauf Alarme auslöst und wie du dich dabei an die Regeln einer Seite hältst.

Beginne mit einer Quelle, die du nutzen darfst

Prüfe vor dem Schreiben von Code, ob die Seite einen offiziellen Weg zu den Daten anbietet: einen Produkt-Feed, eine API oder ein Partnerprogramm. Diese sind zuverlässiger als Scraping und beseitigen den größten Teil des rechtlichen und technischen Risikos. Scraping ist der Ausweg für öffentliche Seiten, für die es keinen offiziellen Weg gibt, und die Nutzungsbedingungen sowie robots.txt gelten trotzdem. Der rechtliche Überblick behandelt die allgemeinen Fragen.

Architektur in fünf Teilen

Ein zuverlässiger Monitor hat fünf Teile. Wenn du sie getrennt hältst, lässt er sich leichter debuggen:

  1. Scheduler. Entscheidet, welche Produktseiten wann besucht werden. Verteile die Besuche über den Tag, statt alles in derselben Minute zu prüfen.
  2. Fetcher. Lädt die Seite mit höflichem Tempo, Wiederholungen und einem Cache herunter.
  3. Parser. Zieht den Preis, den Währungskontext und den Lagerstatus heraus.
  4. Speicher. Hält jede Beobachtung mit Zeitstempel fest, damit du einen Verlauf hast.
  5. Alarm. Vergleicht den neuen Wert mit dem letzten und benachrichtigt dich, wenn er eine Schwelle überschreitet, die du gesetzt hast.

Preise aus unordentlichen Seiten parsen

Preise erscheinen in vielen Formen: mit Tausendertrennzeichen, mit Dezimalkomma, mit einer Beschriftung vor der Zahl oder über mehrere Elemente verteilt. Halte den Parser klein und teste ihn gegen echte Beispiele. Hier ist eine Version, die vom gängigen Format ausgeht, mit Kommas als Tausendertrennzeichen und einem Punkt als Dezimaltrennzeichen. Normalisiere andere Formate, bevor du sie aufrufst.

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """Gibt die erste Zahl im Text als Decimal zurück, oder None."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

Verwende Decimal, nicht float, für alles, was du vergleichst oder summierst. Rundungsfehler bei Fließkommazahlen können dazu führen, dass zwei gleiche Preise unterschiedlich aussehen. Bewahre den Rohtext neben dem geparsten Wert auf, damit du einen Parser-Fehler später beheben kannst, ohne jede Seite erneut abzurufen.

Verlauf speichern und Änderungen erkennen

Ein einzelner Preis ist eine Momentaufnahme. Der Wert eines Monitors liegt im Verlauf. Speichere eine Zeile pro Beobachtung mit Produkt-ID, Quelle, Zeitstempel, geparstem Wert und Rohtext. Dann ist der Alarm ein einfacher Vergleich mit der vorherigen Zeile. Alarmiere nur bei bedeutenden Änderungen, etwa einem Rückgang über einen festgelegten Prozentsatz oder wenn ein Produkt nicht mehr vorrätig ist, damit du nicht mit Rauschen überflutet wirst.

Varianten und Bundles behandeln

Eine Produktseite zeigt oft mehrere Preise: einen pro Größe oder Farbe, einen Bundle-Preis, einen Mitgliederpreis oder einen Preis, der erst nach einer Auswahl erscheint. Entscheide vor dem Bauen, was der Monitor erfassen soll. Ein gängiger Ansatz ist, die Varianten-ID zusammen mit dem Preis zu speichern, damit eine Änderung bei einer Größe nicht wie eine Änderung am ganzen Produkt aussieht. Sei vorsichtig bei "ab"-Preisen und durchgestrichenen Originalpreisen, denn ein Parser, der die falsche Zahl erwischt, erzeugt Fehlalarme. Speichere den Beschriftungstext neben jedem Wert, damit du prüfen kannst, was gelesen wurde, wenn ein Alarm falsch wirkt.

Höflich planen

Prüfe jedes Produkt in einem Intervall, das dazu passt, wie oft sich sein Preis tatsächlich ändert. Ein Produkt, dessen Preis sich täglich ändert, braucht keine stündliche Prüfung. Füge jedem Besuch etwas Jitter hinzu, begrenze die Anzahl der Anfragen pro Seite und Stunde und cache Ergebnisse für das gewählte Intervall. Diese Gewohnheiten halten deine Last niedrig und deine Daten konsistent.

Wenn die Seite dich blockiert

Preisseiten sind häufige Ziele für automatisierten Zugriff, daher siehst du vielleicht eine Sperre, ein Rate-Limit oder ein Captcha. Gehe bei einem 429 oder 503 zurück, und besuche eine Seite nicht mehr, die dich immer wieder abweist. Wenn ein Captcha auf einer Seite erscheint, die du automatisieren darfst, ist der aktuell live verfügbare Captcha-Typ bei Scarnox PopularCaptcha. Der PopularCaptcha-Python-Leitfaden zeigt den Token-Ablauf. Lies Scrapen ohne blockiert zu werden, bevor du mehr Technik hinzufügst, denn ein sauberes Tempo löst meist mehr als jedes zusätzliche Werkzeug.

Manche Seiten rendern ihre Preise mit JavaScript. Für diese folge dem Vorgehen in JavaScript-Websites scrapen.

Verantwortungsvoll scrapen

Nächste Schritte

Starte mit kostenlosem Testguthaben, ohne Karte: Konto erstellen und probiere den PopularCaptcha-Ablauf auf einer Seite aus, die du automatisieren darfst. Aktuelle Preise findest du auf der Preisseite.