Eine Produktseite zu aktualisieren und Zahlen in eine Tabelle zu kopieren funktioniert, bis Sie mehr als eine Handvoll Artikel verfolgen. Es ist langsam, leicht zu vergessen, und schlimmer noch, es sagt Ihnen, was ein Preis gerade ist, aber nichts darüber, ob sich diese Zahl bewegt hat, um wie viel oder ob es wichtig ist. Das interessante Signal in Produktdaten ist die Änderung, nicht der Snapshot, und Sie sehen Änderungen nur, wenn Sie dieselben Felder nach einem Zeitplan sammeln und sie im Zeitverlauf vergleichen.
Diese Anleitung baut ein kleines, ausführbares KI-Produktüberwachungstool in Python. Es scraped öffentliche Produktseiten nach einem Timer mit Crawlbase, speichert jedes Auslesen, vergleicht das neue Auslesen mit dem letzten, um bedeutsame Bewegungen bei Preis, Lagerbestand und Bewertung zu erkennen, und übergibt diese Änderungen dann einem LLM, das eine kurze, einfachsprachige Benachrichtigung schreibt. Alles hier bleibt bei öffentlichen Produktdaten: Preise, Verfügbarkeit und Bewertungen, die jeder Besucher ohne Einloggen sieht. Keine Konten, keine Warenkörbe, keine personenbezogenen Daten.
Was das Tool von Anfang bis Ende tut
Denken Sie an das System als ein Relais mit vier Stationen. Erstens ruft Crawlbase eine Produktseite ab und gibt saubere strukturierte Felder zurück, sodass Sie kein fragiles HTML von Hand parsen müssen. Zweitens wird jedes Auslesen mit einem Zeitstempel in einem lokalen Speicher geschrieben, was Ihnen die Historie gibt, von der die Änderungserkennung abhängt. Drittens vergleicht ein Diff-Schritt das neueste Auslesen mit dem vorherigen und entscheidet, ob sich etwas genug bewegt hat, um darauf zu achten. Viertens, wenn es eine echte Änderung gibt, verwandelt ein LLM die rohen Vorher/Nachher-Zahlen in eine einzeilige Zusammenfassung, die Sie in Slack, per E-Mail oder in einem Log ablegen können.
Die Planungsschleife kapselt alle vier, sodass das Ganze eigenständig läuft, einmal pro Stunde oder einmal pro Tag, ohne dass Sie es beobachten. Diese Schleife ist der Teil, der aus einem einmaligen Scrape echtes Monitoring macht. Dieselbe Form liegt den meisten eCommerce-Web-Scraping-Arbeiten zugrunde: sammeln, speichern, vergleichen, handeln.
Voraussetzungen
Sie müssen kein Experte sein, aber etwas Vorarbeit hilft. Sie sollten in der Lage sein, ein Python-Skript zu lesen und zu bearbeiten, eine HTTP-Anfrage zu senden und das zurückkommende JSON zu prüfen, und eine Datei von Ihrem Terminal aus auszuführen. Ein ungefähres Verständnis davon, wie ein LLM auf einen strukturierten Prompt reagiert, ist für den Zusammenfassungsschritt nützlich, obwohl der Code die Verkabelung für Sie übernimmt.
Auf der Tooling-Seite brauchen Sie drei Dinge: Python 3.9 oder neuer lokal installiert, ein Crawlbase-Konto mit einem API-Token und einen API-Schlüssel für den LLM Ihrer Wahl für den Zusammenfassungsschritt (das Beispiel verwendet einen OpenAI-kompatiblen Endpunkt, den die meisten Anbieter exponieren). Neue Crawlbase-Konten erhalten bis zu 20.000 kostenlose Anfragen: 1.000 bei der Anmeldung und mehr, während Sie die Onboarding-Schritte abschließen, was reichlich ist, um das gegen einige echte Produkte zu bauen und zu testen.
Projekt einrichten
Erstellen Sie einen Ordner, eine virtuelle Umgebung und installieren Sie die zwei Bibliotheken, auf die das Tool setzt: den Crawlbase-Client für das Scraping und den openai-Client für den Zusammenfassungsschritt (er spricht mit jeder OpenAI-kompatiblen API).
python --version mkdir product-monitor && cd product-monitor python -m venv .venv source .venv/bin/activate pip install crawlbase openai
Halten Sie beide Schlüssel aus dem Code heraus. Lesen Sie sie aus Umgebungsvariablen, damit nichts Geheimes in einem Commit landet. Setzen Sie sie einmal in Ihrer Shell, bevor Sie irgendetwas ausführen.
export CRAWLBASE_TOKEN="your_crawlbase_token" export LLM_API_KEY="your_llm_api_key"
Schritt 1: Produktdaten mit Crawlbase sammeln
Die erste Station ruft eine Produktseite ab und gibt die Felder zurück, die uns interessieren. Der sauberste Weg für einen unterstützten Shop ist die Crawling API, die einen gepflegten Parser serverseitig ausführt und Ihnen strukturiertes JSON statt rohem HTML gibt. Sie rufen denselben Endpunkt wie die Crawling API auf und fügen einen scraper-Parameter hinzu, der den gewünschten Parser benennt. Speichern Sie das als collect.py.
import os from crawlbase import ScraperAPI scraper = ScraperAPI({"token": os.environ["CRAWLBASE_TOKEN"]}) def collect_product(url): # 'amazon-product-details' is one of the maintained parsers. response = scraper.get(url, {"scraper": "amazon-product-details"}) body = response["json"]["body"] reading = { "url": url, "name": body.get("name"), "price": body.get("rawPrice"), "currency": body.get("currency"), "in_stock": body.get("inStock"), "rating": body.get("rating"), } if reading["price"] is None or reading["name"] is None: raise ValueError(f"Parse returned no price/name for {url}") return reading
Wenn der Shop, den Sie verfolgen, nicht zu den unterstützten Parsern gehört, steigen Sie auf die Crawling API herunter und parsen Sie das HTML selbst, oder generieren Sie einen zielspezifischen Extraktor. Crawlbase erledigt in jedem Fall den schwierigen Teil der Anfrage: Es rotiert IPs, verwaltet Header und rendert JavaScript wenn eine Seite es braucht, sodass Sie eine echte Antwort statt einer Blockseite erhalten.
Die Scraper API und die Crawling API verwenden standardmäßig einen schnellen statischen Abruf. Wenn eine Produktseite ihren Preis oder Lagerbestand clientseitig rendert (bei modernen Storefronts üblich), übergeben Sie "ajax_wait": "true" und ein "page_wait" in Millisekunden, damit der Inhalt lädt, bevor das HTML zurückgegeben wird. Beginnen Sie bei 5000 ms und erhöhen Sie, wenn ein Feld leer zurückkommt.
Schritt 2: Jedes Auslesen mit einem Zeitstempel speichern
Änderungserkennung braucht Gedächtnis, also geht jedes Auslesen mit dem Zeitpunkt seiner Erfassung auf die Festplatte. Eine einzelne SQLite-Datei reicht aus und hält das gesamte Tool abhängigkeitsarm. Speichern Sie das als store.py.
import sqlite3 from datetime import datetime, timezone DB = "readings.db" def init_db(): con = sqlite3.connect(DB) con.execute( """CREATE TABLE IF NOT EXISTS readings ( url TEXT, name TEXT, price REAL, currency TEXT, in_stock INTEGER, rating REAL, taken_at TEXT)""" ) con.commit() con.close() def save_reading(r): con = sqlite3.connect(DB) con.execute( "INSERT INTO readings VALUES (?, ?, ?, ?, ?, ?, ?)", (r["url"], r["name"], r["price"], r["currency"], int(bool(r["in_stock"])), r["rating"], datetime.now(timezone.utc).isoformat()), ) con.commit() con.close() def last_two(url): con = sqlite3.connect(DB) con.row_factory = sqlite3.Row rows = con.execute( "SELECT * FROM readings WHERE url = ? ORDER BY taken_at DESC LIMIT 2", (url,), ).fetchall() con.close() return [dict(row) for row in rows]
last_two gibt das neueste Auslesen und das davor zurück, was alles ist, was der Diff-Schritt braucht. Wenn Sie später eine vollständige Preishistorie zum Visualisieren möchten, hält die Tabelle bereits jede Zeile; wählen Sie einfach alle davon für eine URL geordnet nach taken_at.
Schritt 3: Bedeutsame Änderungen erkennen
Hier gehen die meisten naiven Monitore schief: Sie benachrichtigen bei jedem kleinen Schwanken, also schalten Sie sie innerhalb eines Tages stumm. Die Lösung ist ein Schwellenwert. Behandeln Sie eine Preisbewegung nur dann als Änderung, wenn sie einen von Ihnen festgelegten Prozentsatz überschreitet, und markieren Sie immer die Dinge, die binär sind, wie wenn ein Produkt nicht mehr vorrätig ist. Speichern Sie das als detect.py.
PRICE_THRESHOLD = 0.03 # 3% move counts as meaningful def detect_changes(current, previous): changes = [] old_price, new_price = previous["price"], current["price"] if old_price and new_price: delta = (new_price - old_price) / old_price if abs(delta) >= PRICE_THRESHOLD: changes.append({ "field": "price", "old": old_price, "new": new_price, "pct": round(delta * 100, 1), }) if previous["in_stock"] != current["in_stock"]: changes.append({ "field": "in_stock", "old": bool(previous["in_stock"]), "new": bool(current["in_stock"]), }) if previous["rating"] and current["rating"]: if abs(current["rating"] - previous["rating"]) >= 0.2: changes.append({ "field": "rating", "old": previous["rating"], "new": current["rating"], }) return changes
Passen Sie die Schwellenwerte an das Produkt an. Ein Massenartikel, der den ganzen Tag um ein paar Cent schwankt, braucht ein breiteres Preisband; ein hochpreisiger Artikel, bei dem ein 3%-Rückgang echtes Geld ist, braucht ein engeres. Der Punkt ist, dass die Regel in einfachem Code steht, den Sie lesen und anpassen können, nicht im Urteil eines Modells vergraben.
Der Monitor ist nur so zuverlässig wie die Daten, die ihn speisen. Die Scraper API gibt saubere strukturierte Produktfelder von unterstützten Shops zurück, mit IP-Rotation, Header-Verwaltung und JavaScript-Rendering serverseitig behandelt, sodass ein geplanter Job weiterhin echte Auslesungen zurückgibt statt Blockseiten. Richten Sie es zuerst auf eine öffentliche Produktseite im kostenlosen Kontingent und bauen Sie die Schleife darum.
Schritt 4: Mit einem LLM zusammenfassen und benachrichtigen
Eine Liste von Änderungs-Dicts ist korrekt, aber auf einen Blick nicht lesbar. Die Aufgabe des LLM hier ist eng, und das ist bewusst: die strukturierten Änderungen in einen kurzen, genauen Satz umwandeln. Das Modell auf eine enge, strukturierte Eingabe zu beschränken ist das, was es davon abhält, abzudriften oder Details zu erfinden. Speichern Sie das als alert.py.
import os import json from openai import OpenAI client = OpenAI(api_key=os.environ["LLM_API_KEY"]) def summarize_changes(product_name, changes): prompt = ( f"Product: {product_name}\n" f"Detected changes (JSON): {json.dumps(changes)}\n\n" "Write one short sentence summarizing what changed. " "State only what the data shows. Do not speculate or " "add numbers that are not present." ) response = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "You summarize product data changes factually."}, {"role": "user", "content": prompt}, ], temperature=0.1, ) return response.choices[0].message.content.strip() def send_alert(message): # Swap this for Slack, email, or a webhook in production. print(f"[ALERT] {message}")
Niedrige temperature und eine Anweisung, nur das zu nennen, was die Daten zeigen, halten die Zusammenfassung an die Zahlen gebunden, die Sie übergeben haben. Wenn Sie lieber nicht von einem gehosteten Modell abhängen möchten, leiten Sie denselben Aufruf durch einen selbst gehosteten oder alternativen OpenAI-kompatiblen Endpunkt, indem Sie die Basis-URL des Clients ändern; der Rest der Funktion bleibt unverändert. Um die Benachrichtigung wirklich zu liefern, ersetzen Sie das print in send_alert durch einen Slack-Webhook-Post oder einen E-Mail-Versand.
Schritt 5: Die Schleife zusammenführen
Verbinden Sie nun die vier Stationen zu einem einzigen Durchgang über Ihre Beobachtungsliste. Jeder Lauf sammelt ein frisches Auslesen, speichert es, vergleicht es mit dem vorherigen und benachrichtigt nur, wenn der Diff etwas findet. Speichern Sie das als monitor.py.
from collect import collect_product from store import init_db, save_reading, last_two from detect import detect_changes from alert import summarize_changes, send_alert WATCHLIST = [ "https://www.example-store.com/product/abc", "https://www.example-store.com/product/xyz", ] def run_once(): init_db() for url in WATCHLIST: try: reading = collect_product(url) except Exception as exc: print(f"Skipped {url}: {exc}") continue save_reading(reading) history = last_two(url) if len(history) < 2: continue # first reading, nothing to compare current, previous = history[0], history[1] changes = detect_changes(current, previous) if changes: summary = summarize_changes(reading["name"], changes) send_alert(summary) if __name__ == "__main__": run_once()
Führen Sie es zweimal mit einer Lücke dazwischen aus (oder füllen Sie die Tabelle mit zwei Auslesungen vor) und Sie werden sehen, wie die Benachrichtigung ausgelöst wird, wenn sich etwas bewegt hat. Ein einzelner Durchgang gegen ein stabiles Produkt gibt nichts aus, was genau das ist, was Sie wollen: Stille, wenn es keine Neuigkeiten gibt.
python monitor.py # [ALERT] The price of "Acme Widget" dropped 7.4% from $129 to $119, and it is back in stock.
Schritt 6: Den Lauf planen
Monitoring bedeutet, nach einem Timer zu laufen, ohne dass Sie den Befehl eintippen. Schleifen Sie nicht für immer im Python-Prozess und rufen Sie sleep auf; das stirbt in dem Moment, in dem die Maschine neu startet, und gibt Ihnen keine Logs. Übergeben Sie den Zeitplan stattdessen Ihrem Betriebssystem. Unter Linux oder macOS sieht ein Cron-Eintrag, der das Skript stündlich ausführt, so aus.
# crontab -e, then add (runs at the top of every hour): 0 * * * * cd /path/to/product-monitor && .venv/bin/python monitor.py >> monitor.log 2>&1
Unter Windows erledigt der Task Scheduler dieselbe Aufgabe: Zeigen Sie einen einfachen Task auf die Python-Executable innerhalb Ihrer virtuellen Umgebung mit monitor.py als Argument und setzen Sie den Trigger auf Ihr gewünschtes Intervall. Wählen Sie in jedem Fall eine Kadenz, die dazu passt, wie schnell sich die Daten tatsächlich bewegen. Stündlich ist gut für schnell wechselnde Preise; einmal täglich reicht für Lagerbestand und Bewertungen aus und ist schonender für Ihr Anfrage-Budget.
Wenn Ihre Beobachtungsliste auf mehr als eine Handvoll Produkte anwächst, beginnt eine synchrone Schleife, die eine URL auf einmal abruft, zu schleppen. Verlagern Sie die Erfassung zu diesem Zeitpunkt auf den asynchronen Crawler, der Ergebnisse an einen Webhook weiterleitet, wenn Seiten fertig sind, sodass Sie nicht auf jede Anfrage blockieren. Die breitere Strategie hinter der zeitlichen Verfolgung von Mitbewerberpreisen behandelt Web Scraping für Preisintelligenz; großflächiges eCommerce-Scraping beschreibt, wie dieselbe Pipeline im Volumen standhält.
Die Daten am Fließen halten
Ein geplanter Scraper ist ein Scraper, der unbeaufsichtigt weiter funktionieren muss, also ist die Datenschicht der Ort, wo Zuverlässigkeit am meisten zählt. Crawlbase rotiert bereits IPs und verwaltet Header hinter jeder Anfrage, was dazu beiträgt, einen sich wiederholenden Job vor einer Markierung als Bot zu schützen. Wenn Sie feinere Kontrolle über das Routing benötigen oder Ihren eigenen HTTP-Client durch einen rotierenden Pool senden möchten, exponiert der Smart AI Proxy dasselbe Netzwerk als Standard-Proxy-Endpunkt. Beobachten Sie Ihre Lauf-Logs auf Statuscodes, die von Erfolg abweichen: Eine plötzliche Reihe von Herausforderungen oder Fehlern ist das Signal, Ihre Kadenz zu verlangsamen oder die Rotation zu erweitern, nicht härter zu wiederholen.
Wichtigste Erkenntnisse
- Die Änderung überwachen, nicht den Snapshot. Der Wert liegt im Vergleich von Auslesungen im Zeitverlauf, was bedeutet, dass Sie jedes Auslesen mit einem Zeitstempel speichern müssen.
- Crawlbase ist die zuverlässige Datenschicht. Die Crawling API gibt saubere strukturierte Felder zurück, und IP-Rotation plus Rendering halten einen geplanten Job vor Blockierungen.
- Einen Schwellenwert verwenden, um bedeutsame Bewegungen zu erkennen. Ein prozentuales Band beim Preis plus binäre Prüfungen beim Lagerbestand halten Benachrichtigungen als Signal, nicht als Rauschen.
- Das LLM eng halten. Übergeben Sie ihm den strukturierten Diff, bitten Sie um einen sachlichen Satz bei niedriger Temperature, und es fasst zusammen statt zu erfinden.
- Das Betriebssystem planen lassen. Cron oder der Task Scheduler schlägt eine In-Prozess-Sleep-Schleife; wählen Sie eine Kadenz, die dazu passt, wie schnell sich die Daten bewegen.
- Bei öffentlichen Daten bleiben. Nur Preise, Lagerbestand und Bewertungen; keine Konten, Warenkörbe oder personenbezogene Daten.
Häufig gestellte Fragen
Was ist ein KI-Produktüberwachungstool?
Es ist ein Programm, das öffentliche Produktseiten nach einem Zeitplan beobachtet, Schlüsselfelder wie Preis, Lagerbestand und Bewertung jedes Mal aufzeichnet und ein KI-Modell verwendet, um bedeutsame Änderungen zu markieren und zu erklären. Die Scraping-Schicht hält die Daten zuverlässig fließend, und die KI-Schicht verwandelt rohe Vorher/Nachher-Zahlen in eine kurze, lesbare Benachrichtigung, damit Sie auf das reagieren, was sich bewegt hat, statt Tabellen zu lesen.
Brauche ich die Crawling API oder die Scraper API dafür?
Verwenden Sie die Scraper API, wenn der Shop, den Sie verfolgen, einer der gepflegten Parser ist, da sie direkt strukturierte Produktfelder zurückgibt und Sie davon befreit, Extraktionscode zu schreiben. Verwenden Sie die Crawling API, wenn Sie das rohe HTML selbst parsen müssen oder die Seite nicht von einem Parser abgedeckt wird. Beide teilen dasselbe Netzwerk, also funktionieren IP-Rotation und Rendering auf beide Weisen; der Unterschied liegt nur darin, ob Crawlbase die Seite für Sie parst.
Wie entscheidet das Tool, was als bedeutsame Änderung gilt?
Durch Schwellenwerte, die Sie in einfachem Code festlegen, nicht durch das Urteil des Modells. Das Beispiel behandelt eine Preisbewegung nur dann als bedeutsam, wenn sie ein prozentuales Band überschreitet (standardmäßig 3%), markiert immer ein Produkt, das nicht mehr vorrätig oder wieder vorrätig wird, und markiert eine Bewertungsverschiebung von 0,2 oder mehr. Diese Zahlen pro Produkt enger oder weiter zu stellen ist der Weg, Benachrichtigungen nützlich statt konstant zu halten.
Wird die KI Zahlen halluzinieren, wenn sie die Benachrichtigung schreibt?
Das Risiko besteht bei offenen Prompts, weshalb der Zusammenfassungsschritt eng gehalten wird. Das Modell erhält nur den strukturierten Diff, läuft bei niedriger Temperature und wird angewiesen, nur das zu nennen, was die Daten zeigen, und keine Zahlen hinzuzufügen, die nicht vorhanden sind. Diese Struktur ist das, was den Satz an Ihren tatsächlichen Auslesungen statt an erfundenen Details hält.
Was passiert, wenn ein Shop sein Seitenlayout ändert?
Wenn Sie die Crawling API verwenden, absorbiert der gepflegte Parser die meisten Layoutverschiebungen für Sie, was ein Grund ist, warum es sich lohnt, ihn zu verwenden, wo er verfügbar ist. Wenn Sie HTML selbst über die Crawling API parsen, kann eine Layoutänderung Ihre Selektoren brechen, und die Lösung besteht darin, die Live-Seite erneut zu untersuchen und sie zu aktualisieren. Da Crawlbase immer die vollständige Seite zurückgibt, passen Sie die Parsing-Logik an statt die Anfrage neu aufzubauen.
Wie oft sollte der Monitor laufen?
Passen Sie die Kadenz daran an, wie schnell sich die Daten bewegen, und an Ihr Anfrage-Budget. Stündlich eignet sich für schnell wechselnde Preise; einmal täglich reicht für Lagerbestand und Bewertungen aus und verwendet weit weniger Anfragen. Das Planen über Cron oder den Windows Task Scheduler ermöglicht es Ihnen, das Intervall pro Job zu setzen, und Sie können verschiedene Produkte in verschiedenen Raten ausführen, wenn einige wichtiger sind als andere.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.

