Web Scraping mit Python: Preise automatisch überwachen

Web Scraping und Preisüberwachung mit Python
📅 24. März 2026 ⏱ 9 Min. Lesezeit ✍️ Leo Voss

Wissen Sie immer, was Ihre Wettbewerber gerade verlangen? Für die meisten Unternehmen ist die Antwort: nein. Preisanpassungen bei Amazon, Zalando oder dem direkten Konkurrenten passieren täglich — oft mehrmals. Wer seine Preise manuell kontrolliert, liegt zwangsläufig hinterher.

Die Lösung: ein Python-Scraper der Preise automatisch überwacht, Veränderungen erkennt und Sie per E-Mail oder Telegram benachrichtigt. Was früher ein teures Tool-Abo erforderte, lässt sich heute mit ca. 50 Zeilen Python realisieren. Dieser Guide zeigt Ihnen, wie.

Was ist Web Scraping und ist es legal?

Web Scraping bezeichnet das automatisierte Auslesen von Webseiten. Ein Python-Skript ruft eine URL auf, analysiert den HTML-Quellcode und extrahiert die gewünschten Daten — in unserem Fall Preise, Produktnamen oder Verfügbarkeit.

Zur Legalität: Das Auslesen öffentlich zugänglicher Preisdaten für den eigenen Gebrauch ist in Deutschland grundsätzlich erlaubt, solange Sie die robots.txt der Webseite respektieren, keine Serverüberlastung verursachen und keine Login-Schranken umgehen. Kommerzielle Weiterverkauf der Daten oder massives Crawling ohne Erlaubnis sind hingegen rechtlich problematisch. Im Zweifel: immer erst die Nutzungsbedingungen lesen.

Die richtige Python-Bibliothek wählen

Für Preisüberwachung mit Python gibt es drei bewährte Ansätze:

Für den Einstieg empfehle ich requests + BeautifulSoup. Installation mit einem Befehl:

pip install requests beautifulsoup4 lxml

Schritt-für-Schritt: Ihren ersten Python Scraper bauen

Schritt 1: Den Preis auf der Zielseite identifizieren

Öffnen Sie die Produktseite in Ihrem Browser und drücken Sie F12 (Entwicklertools). Rechtsklick auf den Preis → „Element untersuchen". Sie sehen das HTML-Element mit einem CSS-Selektor oder einer Klasse wie class="price-box" oder einer ID wie id="product-price". Notieren Sie sich diesen Selektor — das ist Ihr Angriffspunkt.

Schritt 2: Den Preis auslesen

import requests
from bs4 import BeautifulSoup

def get_price(url, css_selector):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0 Safari/537.36"
    }
    response = requests.get(url, headers=headers, timeout=10)
    soup = BeautifulSoup(response.text, "lxml")
    
    price_element = soup.select_one(css_selector)
    if price_element:
        price_text = price_element.get_text(strip=True)
        return price_text
    return None

# Beispiel: Amazon-Produkt (CSS-Selektor anpassen)
url = "https://www.beispielshop.de/produkt-xyz"
preis = get_price(url, ".price")
print(f"Aktueller Preis: {preis}")

Schritt 3: Preise in einer CSV speichern

Einmalig Daten abrufen reicht nicht — Sie brauchen einen historischen Verlauf. Speichern Sie jeden Abruf mit Zeitstempel:

import csv
import os
from datetime import datetime

def save_price(product_name, price, filename="preise.csv"):
    file_exists = os.path.isfile(filename)
    with open(filename, "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        if not file_exists:
            writer.writerow(["Datum", "Produkt", "Preis"])
        writer.writerow([datetime.now().isoformat(), product_name, price])

Schritt 4: Preisänderungen erkennen und benachrichtigen

Der entscheidende Teil: das Skript vergleicht den aktuellen Preis mit dem zuletzt gespeicherten Wert und schickt eine E-Mail wenn sich etwas ändert:

import smtplib
from email.mime.text import MIMEText

def send_alert(product, old_price, new_price, recipient_email):
    msg = MIMEText(
        f"Preisänderung erkannt!\n\n"
        f"Produkt: {product}\n"
        f"Alter Preis: {old_price}\n"
        f"Neuer Preis: {new_price}\n"
    )
    msg["Subject"] = f"⚠️ Preisänderung: {product}"
    msg["From"] = "alerts@ihredomain.de"
    msg["To"] = recipient_email
    
    with smtplib.SMTP_SSL("smtp.ihredomain.de", 465) as smtp:
        smtp.login("alerts@ihredomain.de", "IHR_PASSWORT")
        smtp.send_message(msg)

Schritt 5: Automatisch alle 6 Stunden ausführen

Auf einem Linux-Server (oder Raspberry Pi) richten Sie einen Cronjob ein:

# Crontab öffnen:
crontab -e

# Alle 6 Stunden ausführen:
0 */6 * * * /usr/bin/python3 /home/user/preisscraper.py

Auf Windows erledigt der Aufgabenplaner dasselbe. Alternativ eignet sich ein kostenloser Cloud-Dienst wie PythonAnywhere oder ein einfacher Hetzner-VPS für unter €5/Monat.

Mehrere Produkte gleichzeitig überwachen

Ein produktionsreifer Preismonitor überwacht nicht nur ein, sondern dutzende oder hunderte Produkte gleichzeitig. Dafür strukturieren Sie Ihre Produkte in einer JSON-Datei:

# produkte.json
[
  {
    "name": "Konkurrenz-Produkt A",
    "url": "https://shop-x.de/produkt-a",
    "selector": ".product-price",
    "letzter_preis": null
  },
  {
    "name": "Eigenes Produkt bei Amazon",
    "url": "https://amazon.de/dp/ASIN123",
    "selector": ".a-price-whole",
    "letzter_preis": null
  }
]

Das Hauptskript iteriert dann über alle Einträge, vergleicht Preise und sendet bei Änderungen sofort eine Benachrichtigung. Mit time.sleep(2) zwischen den Anfragen respektieren Sie die Server der Zielsites und vermeiden Blocks.

Häufige Probleme und Lösungen

„403 Forbidden" oder leerer Response

Viele Websites blocken Anfragen ohne Browser-Header. Lösung: Realistischen User-Agent setzen (wie im Code oben) und ggf. Referer-Header ergänzen. Für hartnäckige Fälle hilft playwright mit echtem Browser-Rendering.

Preis wird per JavaScript geladen

Wenn BeautifulSoup keinen Preis findet obwohl er auf der Seite sichtbar ist, wird er wahrscheinlich dynamisch per JavaScript eingefügt. Wechseln Sie in diesem Fall auf playwright:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://shop.beispiel.de/produkt")
    price = page.locator(".price").text_content()
    browser.close()

Preisformat variiert (€12,99 vs. 12.99 EUR)

Normalisieren Sie Preise immer zu einem einheitlichen Float-Wert bevor Sie vergleichen. Ein simples re.sub(r'[^\d,.]', '', price_text) entfernt Währungssymbole und Leerzeichen.

Preisüberwachung als Wettbewerbsvorteil

Systematische Preisüberwachung ermöglicht datengestützte Preisentscheidungen statt Bauchgefühl:

💡 Unser Portfolio-Projekt PriceWatch zeigt, wie ein vollständiges Preisüberwachungs-System für einen deutschen Online-Händler aussieht — mit Dashboard, Alarm-System und historischen Verlaufsgraphen.

Skalierung: Von der Idee zum professionellen System

Ein einfaches Python-Skript reicht für 10–50 Produkte problemlos. Wollen Sie hunderte oder tausende Produkte überwachen, brauchen Sie eine robustere Architektur:

Den Aufbau eines solchen Systems — von der ersten Python-Zeile bis zum laufenden Dashboard — haben wir in unserem Projekt PriceWatch für einen Kunden umgesetzt. Das Ergebnis: vollautomatische Preisüberwachung von über 300 Konkurrenz-Produkten, tägliche Reports und sofortige Alarm-E-Mails bei Preisänderungen größer als 5%.

Mehr zu automatisierten Workflows lesen Sie in unserem Guide Geschäftsprozesse automatisieren: Der komplette Guide für KMU. Wer seinen E-Commerce-Betrieb weiter automatisieren möchte, findet weitere Ideen in unserem Artikel über E-Commerce Automatisierung.

Preisüberwachung für Ihr Unternehmen?

Wir bauen Ihnen ein maßgeschneidertes Preismonitoring-System — von der Datenerfassung bis zum fertigen Dashboard. Starten Sie mit einer kostenlosen Beratung.

Kostenlose Beratung anfragen →