ScrapeUnblocker sells to AI agents - live prices and self-serve payment

The agent storefront at https://agents.scrapeunblocker.com/llms.txt?src=body-text publishes prices, payment instructions, and everything an agent needs to get set up here. Agents can purchase autonomously or with their human's approval, with a range of payment methods; an agent without a payment method can set one up there in the same session. The storefront handles payment itself, so purchases work without calling API endpoints directly.

← Alle Artikel

So Erkennen Sie Dasselbe Produkt in Angeboten von Amazon, Walmart und eBay mit Jev

Sie suchen bei Amazon, Walmart und eBay nach einer Samsung T7 Portable SSD mit 1TB in Titan Gray. Sie bekommen rund hundert Angebote, können die Preise aber noch nicht vergleichen. Zuerst müssen Sie genau dieses Laufwerk von der 2TB-Version, der blauen Version, Transporthüllen und gebrauchten Geräten trennen.

Selbst ein exakt passender Titel reicht nicht. Ein Angebot kann das richtige Produkt nennen, während die Verkäuferangaben zeigen, dass es sich um ein gebrauchtes oder geöffnetes Gerät handelt.

Diese Anleitung baut den Abgleich in Python. Sie sammeln strukturierte Angebotsdaten, stellen Jev zu jedem Ergebnis drei Fragen und entscheiden dann per Code, ob Sie es behalten, zur Prüfung geben oder verwerfen. Die Beispiele stammen aus echten Suchen vom 8. November 2026.

Warum Ähnliche Titel Nicht Reichen

Der übliche erste Versuch ist Fuzzy Matching: Man misst, wie ähnlich sich zwei Texte sind. Mit RapidFuzz können Sie jeden Angebotstitel mit Ihrem Referenztitel vergleichen und alles behalten, was über einem gewählten Wert liegt.

Das Problem: Eine hohe Textähnlichkeit bedeutet nicht unbedingt dasselbe Produkt.

Hier sind die Ergebnisse von RapidFuzz 3.13 für die Referenz Samsung T7 Portable SSD 1TB Titan Gray (MU-PC1T0T/AM). Der Vergleich nutzt processor=utils.default_process, um den Text vor der Bewertung zu vereinheitlichen. token_set_ratio und WRatio sind zwei Bewertungsmethoden:

Angebotstitel (gekürzt)Shoptoken_set_ratioWRatioWas es wirklich ist
Samsung T7 Portable SSD 1TB Titan Gray, Up-to 1,050MB/s … (MU-PC1T0T/AM)Walmart100.085.5Das Produkt
Samsung MU-PC2T0T T7 2TB Portable SSD Titan Gray USB 3.2eBay87.983.5Falsche Kapazität
Samsung T7 1TB (MU-PC1T0T/AM) USB 3.2 Gen 2 External SSD FACTORY SEAL - GRAYeBay82.878.6Das Produkt
SAMSUNG T7 Portable SSD, 1TB … MU-PC1T0H/AM, BlueAmazon78.685.5Falsche Farbe
Samsung T7 Shield 1TB … Black, with HD-2 Drive CaseWalmart69.285.5Anderes Modell, mit Hülle im Bundle
Paiyule Carrying Case for Samsung T9/T7/T7 Shield Portable SSD 4TB 2TB 1TBAmazon69.265.8Zubehör

Mit token_set_ratio erzielt das falsche 2TB-Laufwerk einen höheren Wert als ein echter Treffer. Jeder Schwellenwert, der dieses echte eBay-Angebot behält, behält auch die falsche Kapazität. Mit WRatio liegen das blaue Laufwerk und das T7-Shield-Bundle gleichauf mit dem exakten Walmart-Treffer.

Die Wörter, die über Behalten oder Verwerfen entscheiden, etwa “2TB”, “Blue” oder “Case”, machen nur einen kleinen Teil des Titels aus.

Fehlende Informationen sind ein weiteres Problem. Ein Amazon-Ergebnis hatte den Titel Samsung T7 Portable SSD 1TB Titan Gray, USB 3.2 Gen 2, Up to 1,050MB/s. Es erreichte 85.4 und kostete zum Zeitpunkt des Schreibens 230.01 $ bei einem Listenpreis von 274.99 $. Auf der Produktseite stand jedoch “Sold by Amazon Resale”, der Amazon-Kanal für gebrauchte und geöffnete Rückläufer. Ein Titelvergleich kann keine Information erkennen, die nicht im Titel steht.

Sie könnten ein Chat-Modell jedes Angebot beurteilen und JSON zurückgeben lassen, ein strukturiertes Datenformat, das Ihr Code lesen kann. Die generierte Antwort müssten Sie aber trotzdem prüfen und manchmal neu anfordern. Ein schlichtes “Ja” liefert außerdem keinen Zahlenwert, an dem Sie festmachen können, welche unsicheren Ergebnisse eine Prüfung brauchen.

Was Jev zum Workflow Beiträgt

Jev liefert typisierte Antworten: Ergebnisse in vorab festgelegter Form statt generiertem Text. TypeSafe beschreibt es als sein erstes “System One”-Modell. Stand November 2026 nimmt es die zu bewertende Information entgegen, den sogenannten State, dazu Fragen der Typen Choice, Score, Noul oder Box.

Hier brauchen Sie zwei dieser Typen:

  • Noul: Eine Ja/Nein-Frage, die die Wahrscheinlichkeit für “Ja” zurückgibt. Damit fragen Sie, ob ein Angebot dasselbe Produkt ist.
  • Choice: Eine Frage mit Optionen, die Sie festlegen. Sie liefert die gewählte Option, eine Wahrscheinlichkeit für jede Option und einen Konfidenzwert. Damit bestimmen Sie den Zustand.

Ihr Python-Code liest diese Ergebnisse und wendet Ihre Abgleichsregeln an. Die Modellseite von TypeSafe nennt als Preis 0.042 $ pro Million Input-Tokens, der Einheit, in der die Modelleingabe gemessen wird. Output-Tokens sind kostenlos.

Jev schreibt keinen Text und zieht keinen Titel oder Preis aus einer HTML-Seite. Die Angebotsfelder müssen Sie vorher sammeln.

Angebote als JSON Sammeln

Jeder Shop hat sein eigenes Seitenlayout und eigene Systeme, die automatisierte Anfragen blockieren. Statt für jeden Shop einen eigenen Parser zu schreiben, nutzt dieses Beispiel die Marketplace-Endpoints von ScrapeUnblocker, eigene API-Routen, die Suchergebnisse als JSON liefern.

Jeder Aufruf nutzt die HTTP-Methode POST, legt die Suchparameter in den Query-String der URL und schickt Ihren Zugangsschlüssel im Header x-scrapeunblocker-key.

Der folgende Code sammelt die Angebotsfelder aus den drei Shops. Die Feldnamen stammen aus echten Antworten.

import os

import requests

API = "https://api.scrapeunblocker.com"
HEADERS = {"x-scrapeunblocker-key": os.environ["SU_API_KEY"]}


def su(path, **params):
    r = requests.post(API + path, params=params, headers=HEADERS, timeout=180)
    r.raise_for_status()
    return r.json()


def amazon_listings(keyword, max_details=10):
    data = su("/marketplace/amazon-search", keyword=keyword, marketplace="amazon.com")
    # The same ASIN can appear twice on one page: as a sponsored card and as an organic one.
    asins = list(dict.fromkeys(card["asin"] for card in data["results"]))
    listings = []
    for asin in asins[:max_details]:
        p = su("/marketplace/amazon-product", asin=asin, marketplace="amazon.com")
        listings.append({
            "shop": "amazon",
            "title": p["title"],
            "price": p["price"],
            "currency": p["currency"],
            "seller": p["seller"],
            "features": (p.get("features") or [])[:3],
            "url": p["url"],
        })
    return listings


def walmart_listings(query):
    data = su("/marketplace/walmart-search", query=query)
    return [{
        "shop": "walmart",
        "title": p["name"],
        "price": p["price"],
        "currency": p["currency"],
        "seller": p["seller"],
        "url": p["url"],
    } for p in data["products"]]


def ebay_listings(keyword):
    data = su("/marketplace/ebay-search", keyword=keyword,
              condition="new", proxy_country="US")
    if not data["exactMatches"]:
        return []  # eBay's loose suggestions, not results for this keyword
    return [{
        "shop": "ebay",
        "title": p["title"],
        "price": p["price"],
        "currency": p["currency"],
        "condition": p["condition"],
        "seller": (p.get("seller") or {}).get("username"),
        "shipping": p.get("shippingCost"),
        "url": p["url"],
    } for p in data["results"]]

Drei Entscheidungen beim Sammeln wirken sich auf den Abgleich aus:

  • Bei Amazon auch die Produktdetails abrufen. Suchkarten enthalten nicht die Verkäuferzeile, an der man das Amazon-Resale-Angebot erkennt. /marketplace/amazon-product liefert seller und die Stichpunkte in features. Das kostet eine zusätzliche Anfrage pro ASIN, der Produktkennung von Amazon. Deshalb begrenzt max_details, wie viele Detailanfragen Sie stellen.
  • eBay-Preise in USD halten. eBay kann Preise in die lokale Währung des Besuchers umrechnen. Die Anfrage setzt proxy_country=US, und der spätere Vergleich verwirft Preise, die nicht in USD sind. ebay_listings() gibt außerdem nichts zurück, wenn die Antwort exactMatches: false meldet. Damit kennzeichnet eBay lose Vorschläge, wenn es keinen exakten Treffer gibt.
  • Unnütze Felder weglassen. Eine Walmart-Karte nannte im Titel die 1TB-Version, beschrieb im Textauszug aber die 500GB-Version. Dieses Beispiel lässt die Beschreibung weg, um solche widersprüchlichen Angaben nicht mitzuschicken.

Google Shopping können Sie über /goods/google-shopping ergänzen. Für einen Shop ohne eigenen Endpoint liefert getPageSource mit parsed_data=true die Produktfelder als JSON. Siehe dazu den Leitfaden zu geparsten Daten oder diese Antwort zum Scraping von E-Commerce-Preisen für das Sammeln von Preisen und Lagerbeständen.

Drei Fragen zu Jedem Angebot Stellen

Installieren Sie das SDK von TypeSafe, die Python-Bibliothek, mit pip install typesafe-sdk und setzen Sie TYPESAFE_API_KEY auf Ihren API-Schlüssel.

Der nächste Code schickt eine Anfrage pro Angebot. Er legt Ihr Referenzprodukt und das Kandidatenangebot in den State und fragt, ob das Produkt passt, in welchem Zustand es ist und ob es ein Einzelstück und kein Bundle ist.

from typesafe_sdk import Choice, Noul, TypeSafeClient

REFERENCE = {
    "brand": "Samsung",
    "model": "T7 Portable SSD",
    "capacity": "1TB",
    "colour": "Titan Gray",
    "part_number": "MU-PC1T0T (any region suffix, e.g. /AM or /WW)",
    "different_models": ["T7 Shield", "T7 Touch", "T9"],
}

QUESTIONS = {
    "same_product": Noul(
        instructions="Is this `listing` the same product as the `reference`: same model, same size or capacity, same colour?",
    ),
    "condition": Choice(
        instructions="In what condition is the item in `listing` sold?",
        criteria={
            "new": "A new, unopened unit of the product itself",
            "refurbished": "Refurbished, renewed or restored",
            "used": "Used, pre-owned, open box or returned, including offers sold by Amazon Resale",
            "accessory_or_part": "A case, cable, adapter or spare part, not the product itself",
        },
    ),
    "is_bundle": Noul(
        instructions="Is this `listing` a bundle or multi-pack rather than the single item?",
    ),
}


def ask_jev(client, listing):
    fields = {k: v for k, v in listing.items() if k != "url"}
    return client.system_one(
        state={"reference": REFERENCE, "listing": fields},
        questions=QUESTIONS,
    )

Die Anfrage ist aus mehreren Gründen so aufgebaut:

  • Benennen Sie die Informationen, die Sie schicken. Der State hat getrennte Teile, listing und reference. TypeSafe empfiehlt dieses strukturierte Objekt statt eines einfachen Strings, und die Fragen beziehen sich auf diese Namen.
  • Geben Sie mit, was Sie über das Produkt wissen. Jev ist nicht auf Ihren Katalog trainiert. Das Feld different_models nennt ihm die Doppelgänger, und der Hinweis auf Amazon Resale in der Option used hilft ihm, diese Verkäuferangabe einzuordnen.
  • Ein Sachverhalt pro Frage. “Das richtige Laufwerk, neu, Einzelstück” enthält drei Prüfungen. TypeSafe rät, pro Noul nur eine Ja/Nein-Frage zu stellen und die Ergebnisse im Code zu kombinieren. Die Fragen werden innerhalb der Anfrage parallel ausgewertet.
  • Den Preis mitschicken. Ein Angebot für 9.99 $, das als SSD auftritt, ist ein starker Hinweis darauf, dass es eher Zubehör als das Laufwerk ist.

Entscheiden: Behalten, Prüfen oder Verwerfen

Die Antworten des Modells sind Eingaben für Ihre Entscheidung, nicht die Entscheidung selbst. Der folgende Code wendet Wahrscheinlichkeitsschwellen an und ordnet jedes Angebot einer der drei Gruppen zu.

SAME_YES = 0.8    # starting points: tune them on listings you labelled by hand
SAME_MAYBE = 0.5
SURE = 0.8


def decide(response):
    same = response.nouls["same_product"].noul
    bundle = response.nouls["is_bundle"].noul
    condition = response.choices["condition"]
    p_condition = condition.probabilities[condition.choice]

    if same < SAME_MAYBE:
        return "drop"    # another product: ignore the other two answers
    if same < SAME_YES or p_condition < SURE or 0.3 <= bundle <= 0.7:
        return "review"  # unsure about something that changes the price
    if condition.choice != "new" or bundle > 0.7:
        return "drop"    # right product, but used, refurbished or a multi-pack
    return "keep"


def compare(query):
    listings = amazon_listings(query) + walmart_listings(query) + ebay_listings(query)
    listings = [x for x in listings if x["price"] is not None and x["currency"] == "USD"]

    keep, review = [], []
    with TypeSafeClient(model="jev-latest") as client:  # Reads TYPESAFE_API_KEY.
        for listing in listings:
            verdict = decide(ask_jev(client, listing))
            if verdict == "keep":
                keep.append(listing)
            elif verdict == "review":
                review.append(listing)

    for x in keep:
        x["total"] = x["price"] + (x.get("shipping") or 0)
    keep.sort(key=lambda x: x["total"])
    for x in keep:
        print(f'{x["total"]:>8.2f}  {x["shop"]:<8} {x["title"][:70]}')
    print(f"\n{len(review)} listings to check by hand:")
    for x in review:
        print(f'  {x["shop"]:<8} {x["url"]}')


compare("samsung t7 portable ssd 1tb")

decide() prüft zuerst same_product. Die Reihenfolge ist wichtig, weil die Zustands-Choice immer eine ihrer vier Optionen wählt, auch wenn das Angebot ein ganz anderes Laufwerk ist. Die Antwort zum Zustand ist erst relevant, wenn feststeht, dass das Produkt passt. TypeSafe nennt das Muster Companion Noul.

Bei der Choice-Antwort prüft der Code probabilities[choice], die Wahrscheinlichkeit der gewählten Option, und nicht confidence. Die TypeSafe-Dokumentation zum Routing nach Wahrscheinlichkeit erklärt, dass die Konfidenz bei einer Choice mit festen Optionen aus der höchsten Wahrscheinlichkeit berechnet wird. Eine Schwelle auf die Konfidenz bringt also keine zusätzliche, unabhängige Prüfung.

Wenn Sie mehrere Angebote gleichzeitig verarbeiten wollen, statt auf jede einzelne Anfrage zu warten, bietet das SDK AsyncTypeSafeClient.

Schwellen mit Selbst Geprüften Angeboten Abstimmen

Die Schwellen 0.8 und 0.5 im Code sind Startwerte. Eine Wahrscheinlichkeit garantiert nicht, dass eine einzelne Antwort richtig ist. TypeSafe weist darauf hin, dass Kalibrierung, also wie gut vorhergesagte Wahrscheinlichkeiten zu beobachteten Ergebnissen passen, über Gruppen von Vorhersagen gemessen wird.

Legen Sie Ihre Schwellen anhand von Angeboten aus Ihren eigenen Suchen fest:

  1. Kennzeichnen Sie 50 bis 100 Angebote von Hand. Notieren Sie, ob jedes dasselbe Produkt ist, welchen Zustand es hat und ob es ein Einzelstück oder ein Bundle ist. Nehmen Sie falsche Kapazitäten, Farben, Hüllen, Shield-Modelle und T9-Doppelgänger mit auf.
  2. Lassen Sie ask_jev() über diese Angebote laufen. Speichern Sie alle drei Antworten neben Ihren Kennzeichnungen.
  3. Vergleichen Sie die Werte mit Ihren Kennzeichnungen. Setzen Sie SAME_YES über die Nicht-Treffer, die Sie sich nicht leisten können. Den Bereich darunter nutzen Sie für die manuelle Prüfung.

Ein falscher Treffer, der automatisch Preise ändert, kann teurer sein als einer in einem Wochenbericht, den jemand ohnehin liest. Im ersten Fall erhöhen Sie SAME_YES. TypeSafe warnt außerdem davor, Schwellen an nur einer Handvoll Beispielen auszurichten. Deshalb beginnt dieser Ansatz mit 50 Angeboten und nicht mit 5.

Sobald die Regeln abgestimmt sind, verwenden Sie eine feste Modellversion. Stand November 2026 zeigt jev-latest auf jev-1.14.0, wechselt aber, sobald eine neue Version erscheint. Ihre Antworten könnten sich also ändern, ohne dass Sie den Code anfassen. Nutzen Sie die versionierte Modell-ID und speichern Sie response.model zu jedem Ergebnis.

Wo dieser Ansatz an Grenzen Stößt

Exakte Kennungen Zuerst

Wenn beide Datensätze eine UPC (die Barcode-Nummer) oder eine vollständige Herstellerteilenummer enthalten, vergleichen Sie diese im Code, bevor Sie ein Modell einsetzen.

Samsungs Teilenummern unterscheiden die Varianten: MU-PC1T0T steht für die 1TB-Version in Titan Gray, MU-PC1T0H für die blaue 1TB-Version. Schicken Sie nur Angebote ohne brauchbare Kennung an Jev. Der Walmart-Produkt-Endpoint liefert eine upc, die Suchkarten aller drei Shops dagegen nicht.

Sie Brauchen Weiterhin Verlässliche Angebotsdaten

Jev ruft keine Seiten ab. Daten aus Shops zu sammeln, die Scraper blockieren, bleibt eine eigene Aufgabe, und bei großem Volumen ist das meist der Schritt, der zuerst scheitert.

Ihre Daten Gehen an Einen Externen Dienst

Die Angebotsfelder und Ihr Referenzprodukt werden an die API von TypeSafe geschickt. Prüfen Sie, ob Ihre Datenschutzregeln das erlauben, bevor Sie den Workflow einsetzen.

FAQ

Kann ich Produkte shopübergreifend ohne KI-Modell abgleichen?

Ja. Wenn beide Angebote eine UPC, EAN oder Herstellerteilenummer teilen, vereinheitlichen Sie deren Format und gleichen Sie über diese Kennung ab. Titelähnlichkeit allein trennt Kapazitäten, Farben und Zubehör nicht zuverlässig.

Warum nicht eine einzige Choice mit “gleich”, “anders” und “Zubehör” als Optionen?

Weil Sie trotzdem getrennte Prüfungen für Zustand und Menge brauchen. Das richtige Produkt kann gebraucht sein oder im Zweierpack verkauft werden. Getrennte Fragen lassen Ihren Code Ihre eigenen Regeln auf diese Fakten anwenden, statt sich auf ein kombiniertes Label zu verlassen.

Kann ich viele Angebote in einer einzigen Jev-Anfrage prüfen?

Ja. Die Noul-Dokumentation von TypeSafe zeigt, wie ein Datensatz in einer Anfrage mit mehreren Kandidaten verglichen wird, mit einem Noul pro Kandidat. Die Anfrage muss in das Standardlimit von Jev 1.14 von 64k Tokens passen. Ein Angebot pro Anfrage lässt sich leichter abstimmen, weil jeder Satz Antworten genau zu einem Angebot gehört.

Funktioniert das auch mit anderen Shops als Amazon, Walmart und eBay?

Ja. Jev bewertet die Felder, die Sie liefern, nicht den Shop selbst. Sammeln Sie die Felder eines anderen Shops mit getPageSource und parsed_data=true, bringen Sie sie in dieselbe listing-Struktur und behalten Sie den Rest des Workflows bei.

Fangen Sie mit Einem Produkt An

Wählen Sie ein Produkt, das Sie beobachten. Füllen Sie sein Referenzobjekt aus, inklusive der Doppelgänger, die Sie schon kennen, und führen Sie compare() für eine Suche aus. Prüfen Sie die Angebote, die in der Prüfliste landen, und nutzen Sie diese Kennzeichnungen als ersten Abstimmungssatz.

Der Sammelschritt in dieser Anleitung nutzt die Marketplace-Endpoints von ScrapeUnblocker. Die Doku zum Amazon-Plugin listet die verfügbaren Parameter und Felder, die Seiten zu Walmart und eBay finden Sie direkt daneben. Einen API-Schlüssel bekommen Sie unter app.scrapeunblocker.com.

ScrapeUnblocker kostenlos testen

Über 95 % Erfolgsquote · ab 0,55 € pro 1.000 Aufrufe (ggf. zzgl. MwSt.) · 500 kostenlose Anfragen bei der Registrierung.

Kostenlos testen → Preise ansehen