Smarter Preis-Tracker mit Python und Selenium

Mein Ziel war es, den Preis eines bestimmten Tommy Hilfiger T-Shirts auf Otto.de kontinuierlich zu verfolgen. Das System sollte autonom im Hintergrund laufen, die Daten zuverlässig speichern und mir auf Knopfdruck eine klare Übersicht über die Preisentwicklung geben.


Der technische Werkzeugkasten

Für dieses Projekt habe ich auf eine bewährte Kombination von Technologien gesetzt:

  • Python: Als flexible und leistungsstarke Sprache für das gesamte Backend.

  • Selenium & Undetected ChromeDriver: Für das Webscraping auf einer modernen Webseite, die sich gegen einfache Bots schützt.

  • SQLite: Als leichtgewichtige, dateibasierte Datenbank zur persistenten Speicherung der Preisdaten.

  • Matplotlib: Zur Erstellung aussagekräftiger Diagramme des Preisverlaufs.

  • Bash Scripting: Um ein benutzerfreundliches Command-Line-Interface (CLI) für die einfache Steuerung zu schaffen.


Der Ablauf: Von der Idee zur fertigen Lösung

1. Die größte Hürde: Unerkannt bleiben

Moderne Webshops wie Otto.de setzen Techniken ein, um automatisierte Zugriffe (Bots) zu erkennen und zu blockieren. Ein einfaches requests-Skript reicht hier nicht aus. Deshalb habe ich Selenium in Kombination mit dem Undetected ChromeDriver verwendet. Dieser spezialisierte Treiber imitiert das Verhalten eines echten menschlichen Nutzers so gut, dass das Scraping zuverlässig und unbemerkt funktioniert.

2. Datenerfassung im 30-Minuten-Takt

Das Herzstück des Projekts ist das price_monitor.py-Skript. Mithilfe der schedule-Bibliothek wird alle 30 Minuten eine Funktion aufgerufen, die folgende Schritte ausführt:

  1. Startet eine Chrome-Instanz.

  2. Navigiert zur Produkt-URL.

  3. Extrahiert den Preis, die Währung und die Verfügbarkeit.

  4. Behandelt mögliche Fehler (z.B. wenn das Produkt nicht verfügbar ist oder sich die Seitenstruktur ändert).

  5. Schreibt den neuen Datensatz in die SQLite-Datenbank.

  6. Beendet den Chrome-Prozess, um Ressourcen zu schonen.

3. Daten-Persistenz mit SQLite

Alle gesammelten Informationen werden in einer price_history.db-Datenbank gespeichert. Die Tabellenstruktur ist bewusst einfach, aber effektiv gehalten, um alle relevanten Informationen inklusive eventueller Fehlermeldungen zu erfassen: 

CREATE TABLE price_history (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    timestamp DATETIME NOT NULL,
    price REAL,
    currency TEXT DEFAULT 'EUR',
    availability TEXT,
    error_message TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

4. Benutzerfreundlichkeit im Fokus: Ein einfaches CLI

Um das Skript nicht jedes Mal mit komplexen Python-Argumenten aufrufen zu müssen, habe ich ein start.sh-Bash-Skript erstellt. Dieses dient als zentrale Steuereinheit und macht die Bedienung kinderleicht:

# Überwachung im Hintergrund starten
./start.sh monitor

# Einen einzelnen Preis abfragen
./start.sh check

# Die letzten Preise anzeigen
./start.sh view

# Preisverlauf als Diagramm für die letzten 7 Tage erstellen
./start.sh plot 7

# Alle Daten als CSV-Datei exportieren
./start.sh export

5. Von Daten zu Einblicken: Analyse und Visualisierung

Rohe Daten sind nur halb so nützlich. Deshalb habe ich ein zweites Skript, price_viewer.py, entwickelt, das die Datenbank ausliest und die Informationen aufbereitet. Es kann aufschlussreiche Statistiken generieren und den Preisverlauf visualisieren.

Beispiel-Statistiken:

📈 Preisstatistiken:
----------------------------------------
Gesamtanzahl Checks: 48
Niedrigster Preis: 19.99€
Höchster Preis: 24.99€
Durchschnittspreis: 22.49€
Letzter Check: 2025-08-14 14:30:00

Mit Matplotlib wird auf Befehl ein Diagramm generiert und im plots/-Ordner gespeichert, sodass ich den Preisverlauf auf einen Blick erkennen kann.

Achtung: Beispiel-Statistik != Plotdata

Professionalität im Detail: Logging, Struktur und Deployment

Ein Projekt ist nur dann wirklich gut, wenn es wartbar und robust ist. Deshalb habe ich auf folgende Aspekte besonderen Wert gelegt:

  • Umfassendes Logging: Jede Aktion, jeder Erfolg und jeder Fehler wird in einer Log-Datei (logs/price_monitor.log) protokolliert. Das ist entscheidend für die Fehlersuche.

  • Klare Projektstruktur: Code, Logs, Plots, Exporte und die Datenbank sind in separaten Ordnern organisiert. Das sorgt für Übersichtlichkeit und einfache Wartung.

  • Automatischer Start mit Systemd: Für den echten „Set-it-and-forget-it“-Betrieb habe ich eine systemd-Service-Unit konfiguriert. Damit startet das Überwachungsskript automatisch nach einem Systemneustart und wird bei Fehlern selbstständig neu gestartet.

Beispiel Logs:

2025-08-14 14:53:28,966 – INFO – Starte Preisüberwachung…
2025-08-14 14:53:30,282 – INFO – patching driver executable /home/user/.local/share/undetected_chromedriver/undetected_chromedriver
2025-08-14 14:53:31,280 – INFO – Chrome Driver erfolgreich initialisiert
2025-08-14 14:53:31,280 – INFO – Lade Seite: https://www.otto.de/p/tommy-hilfiger-t-shirt-slim-cody-v-nk-ss-mit-v-ausschnitt-und-streifen-gestreift-casual-slim-fit-baumwolle-v-ausschnitt-1737672783/?variationId=1950942428#ech=29252900&variationId=1950942428
2025-08-14 14:53:34,662 – INFO – ✅ Seite grundsätzlich geladen
2025-08-14 14:53:37,672 – INFO – 📄 Seitentitel: Tommy Hilfiger T-Shirt SLIM CODY V-NK SS mit V-Ausschnitt und Streifen gestreift, casual, slim fit, Baumwolle, V-Ausschnitt
2025-08-14 14:53:37,673 – INFO – 🔍 Starte Preissuche…
2025-08-14 14:53:37,692 – INFO – 🏷️ 1 data-price-cents Elemente gefunden
2025-08-14 14:53:37,707 – INFO – 💰 Element 0: data-price-cents=’3990′ → 39.9€
2025-08-14 14:53:37,707 – INFO – ✅ Preis über data-price-cents gefunden: 39.9€
2025-08-14 14:53:37,765 – INFO – 📦 Verfügbarkeit: lieferbar – in 1-2 Werktagen bei dir
2025-08-14 14:53:37,766 – INFO – ✅ Preis erfolgreich extrahiert: 39.9€
2025-08-14 14:53:37,778 – INFO – Preis gespeichert: 39.9€ – Verfügbarkeit: lieferbar – in 1-2 Werktagen bei dir
2025-08-14 14:53:37,779 – INFO – ✅ Preischeck erfolgreich: 39.9€
2025-08-14 14:53:37,898 – INFO – Chrome Driver geschlossen

https://grischaoverbeck.de/wp-content/uploads/2025/08/price_monitor.py

https://grischaoverbeck.de/wp-content/uploads/2025/08/price_viewer.py

https://grischaoverbeck.de/wp-content/uploads/2025/08/README.md

https://grischaoverbeck.de/wp-content/uploads/2025/08/requirements.txt

https://grischaoverbeck.de/wp-content/uploads/2025/08/start.sh

Was nun?

  • Alarm-Funktion: Implementierung von Benachrichtigungen via E-Mail, Telegram oder Push-Nachricht, wenn ein selbst definierter Wunschpreis erreicht oder unterschritten wird.

  • Anomalie-Erkennung: Das System könnte automatisch warnen, wenn der Preis ungewöhnlich stark fällt oder steigt, was auf einen Preisfehler oder einen Flash-Sale hindeuten könnte.

  • Algorithmisches Repricing zur Wettbewerbsanalyse: Anstatt nur ein Produkt zu beobachten, könnte das System die Preise aller relevanten Konkurrenten für ein bestimmtes Produkt überwachen. Eine integrierte Logik passt dann den eigenen Verkaufspreis automatisiert an definierte Regeln an. Die klassische Strategie wäre, den eigenen Preis dynamisch immer einen Cent unter den des günstigsten Mitbewerbers zu setzen, um eine Spitzenposition in Preisvergleichsmaschinen (z. B. Google Shopping, Idealo) zu sichern und die Konversionsrate zu maximieren. Dies würde eine API-Anbindung an das eigene Shopsystem (z.B. Shopify, Shopware) erfordern, um Preisänderungen in Echtzeit durchzuführen.