Groupon betreibt täglich Tausende von lokalen Angeboten aus den Bereichen Gastronomie, Reisen, Wellness und Einzelhandel, und jedes Angebot enthält genau die strukturierten Daten, die ein Deal-Tracking-Tool, ein Preis-Beobachter oder ein Wettbewerbsforschungs-Dashboard benötigt: einen Titel, den rabattierten Preis, den Originalpreis, die Ersparnis, den Gültigkeitsbereich des Angebots und einen Link zum Angebot. Der Haken ist, dass Groupon seine Kategorieseiten im Browser mit JavaScript aufbaut, sodass eine einfache HTTP-Anfrage statt der gesuchten Angebote eine fast leere Hülle liefert.

Dieser Leitfaden zeigt Ihnen, wie Sie Groupon mit Python auf zuverlässige Weise scrapen. Sie bauen einen kleinen, ausführbaren Scraper, der eine gerenderte Kategorieseite über das Crawling API abruft, jede Deal-Karte mit BeautifulSoup parst und saubere strukturierte Ausgabe druckt. Die gesamte Anleitung beschränkt sich auf öffentliche Angebotsdaten, und der Abschnitt zur Rechtmäßigkeit gegen Ende ist kein Boilerplate, also lesen Sie ihn, bevor Sie dies auf echtes Volumen anwenden.

Was Sie bauen werden

Ein Python-Skript, das eine öffentliche Groupon-Kategorie-URL nimmt, das gerenderte HTML über das Crawling API abruft und für jedes Angebot auf der Seite einen strukturierten Datensatz extrahiert. Wir verwenden eine Stadtangebote-Seite als laufendes Beispiel und ziehen diese Felder aus jeder Karte:

  • Titel die Angebots-Überschrift, zum Beispiel "55-Minuten Paarmassage".
  • Aktueller Preis der rabattierte Preis, den Sie tatsächlich zahlen.
  • Originalpreis der durchgestrichene Listenpreis.
  • Rabatt die Ersparnis, abgeleitet aus den beiden Preisen.
  • Ort die Adresse oder der Bereich, in dem das Angebot gilt.
  • Link die URL der einzelnen Angebotsseite.

Warum ein einfacher Abruf bei Groupon scheitert

Wenn Sie eine Groupon-Kategorie-URL mit einem einfachen HTTP-Client aufrufen, erhalten Sie eine Antwort mit Status 200 und fast keine Angebotsdaten im Body. Zwei Dinge arbeiten gegen Sie. Erstens rendert Groupon seine Deal-Karten im Browser mit JavaScript, sodass das anfängliche HTML ein Rahmen ist, der sich erst nach dem Ausführen der Seitenskripte füllt. Zweitens kennzeichnet Groupon automatisierten Datenverkehr schnell: Datacenter-IPs und Anfragemuster, die nicht wie ein echter Browser aussehen, werden herausgefordert oder blockiert, bevor sie jemals die gerenderten Karten erreichen.

Ein funktionierender Groupon-Scraper benötigt daher zwei Dinge in einer Anfrage: einen Browser, der die Seite tatsächlich rendert, und eine IP, die die Plattform als echten Besucher liest. Sie können das selbst mit einem Headless-Browser plus einem Pool von rotierenden Residential-Proxies zusammenstellen, aber das Zusammenfügen und Gesundhalten dieser Teile ist das meiste der Arbeit. Das Crawling API faltet beides in einen einzigen Aufruf: Sie senden ihm die URL mit einem JavaScript-Token, es rendert die Seite hinter einer vertrauenswürdigen IP und gibt fertiges HTML zum Parsen zurück.

Warum das JS-Token

Crawlbase bietet zwei Token-Typen. Das normale Token ruft statisches HTML ab; das JavaScript (JS) Token rendert die Seite zuerst in einem echten Browser. Groupon wird clientseitig gerendert, daher benötigen Sie hier das JS-Token. Das normale Token gibt denselben leeren Rahmen zurück, den ein einfacher Abruf zurückgeben würde, und es gibt nichts daraus zu parsen. Sie können mit bis zu 20.000 kostenlosen Anfragen starten, keine Kreditkarte erforderlich.

Voraussetzungen

Sie benötigen ein paar Dinge, bevor Sie Code schreiben. Keines davon dauert lange.

Grundlegendes Python. Sie sollten damit vertraut sein, ein Python-Skript zu schreiben und auszuführen sowie Pakete mit pip zu installieren. Wenn BeautifulSoup neu für Sie ist, behandelt unser Leitfaden zur Verwendung von BeautifulSoup in Python die Parse-Grundlagen, die dieses Tutorial voraussetzt.

Python 3.8 oder höher. Bestätigen Sie Ihre Version mit python --version. Falls Sie es nicht haben, installieren Sie es von python.org oder über eine Distribution wie Anaconda.

Ein Crawlbase-Konto und ein JS-Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihr JavaScript (JS) Token von der Konto-Dokumentationsseite. Behandeln Sie das Token wie ein Passwort: Es authentifiziert Ihre Anfragen, also halten Sie es aus der Versionskontrolle heraus.

Das Projekt einrichten

Erstellen Sie eine virtuelle Umgebung, damit Projektabhängigkeiten isoliert bleiben, und installieren Sie dann die beiden Bibliotheken, die der Scraper benötigt.

bash
python --version

python -m venv groupon_env
source groupon_env/bin/activate

pip install crawlbase beautifulsoup4

Unter Windows aktivieren Sie die Umgebung mit groupon_env\Scripts\activate anstelle der source-Zeile. Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist der offizielle Client für das Crawling API, und beautifulsoup4 parst das zurückgegebene HTML, damit Sie einzelne Felder per CSS-Selektor herausziehen können.

Schritt 1: Die gerenderte Kategorieseite abrufen

Beginnen Sie damit, die fertige Seite zu holen. Importieren Sie die CrawlingAPI-Klasse, initialisieren Sie sie mit Ihrem JS-Token und fordern Sie die Kategorie-URL an. Das Prüfen des Status vor dem Parsen sorgt dafür, dass Fehler laut statt still sind.

python
from crawlbase import CrawlingAPI

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['status_code']}")
    return None

if __name__ == "__main__":
    page_url = "https://www.groupon.com/local/washington-dc"
    html = crawl(page_url)
    print(html[:500] if html else "No HTML returned")

Die beiden Warte-Optionen sind wichtig für ein clientseitig gerendertes Ziel wie dieses. ajax_wait weist das API an, auf den Abschluss des asynchronen Inhalts zu warten, und page_wait wartet nach dem Laden eine feste Anzahl von Millisekunden, damit spät gerenderte Karten erscheinen, bevor die Seite erfasst wird. Fünf Sekunden sind ein vernünftiger Start; erhöhen Sie den Wert, wenn die Deal-Karten leer zurückkommen. Führen Sie das Skript mit python scraper.py aus, und Sie sollten echtes Deal-Markup sehen, nicht den leeren Rahmen, den ein einfacher Abruf zurückgibt. Das bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben.

Crawlbase Crawling API

Groupon benötigt eine gerenderte Seite hinter einer vertrauenswürdigen IP, in einem Aufruf. Das Crawling API nimmt ein JS-Token, führt die Seite in einem echten Browser aus, rotiert serverseitig durch Residential-IPs und gibt Ihnen fertiges HTML, damit Sie keine eigene Headless-Flotte und keinen Proxy-Pool betreiben müssen. Richten Sie es zuerst auf eine öffentliche Stadtangebote-Seite im kostenlosen Tier.

Schritt 2: Die Deal-Karten mit BeautifulSoup parsen

Mit fertigem HTML laden Sie es in BeautifulSoup und ziehen jedes Angebot per Selektor heraus. Groupon legt seine Deal-Karten in einer wiederkehrenden Struktur an, sodass Sie alle Karten einmal auswählen und dann dieselben Felder aus jeder herauslesen. Überprüfen Sie die aktuellen Klassennamen in den Dev-Tools Ihres Browsers auf der Live-Seite; die unten stehenden Selektoren entsprechen dem Layout zum Zeitpunkt der Erstellung.

python
from bs4 import BeautifulSoup

def text_of(card, selector):
    el = card.select_one(selector)
    return el.get_text(strip=True) if el else None

def parse_deals(html):
    soup = BeautifulSoup(html, "html.parser")
    cards = soup.select('div[data-item-type="card"] > article')
    deals = []

    for card in cards:
        link = card.select_one("a[href]")
        deals.append({
            "title": text_of(card, "h2.text-dealCardTitle"),
            "current_price": text_of(card, 'div[data-testid="green-price"]'),
            "original_price": text_of(card, 'div[data-testid="strike-through-price"]'),
            "location": text_of(card, "h2 + div span"),
            "link": link["href"] if link else None,
        })

    return deals

Der text_of-Helfer erledigt gleichzeitig zwei nützliche Dinge: Er fragt ein einzelnes Element innerhalb der Karte ab und gibt None zurück, wenn dieses Element fehlt, anstatt bei einem .get_text()-Aufruf gegen nichts zu werfen. Das hält die Extraktion robust, wenn ein Feld bei einer bestimmten Karte fehlt, was häufig vorkommt, da nicht jedes Angebot einen durchgestrichenen Originalpreis oder einen Standort auflistet. Der Link wird aus dem href eines Ankers statt aus seinem Text gelesen, daher wird er separat behandelt.

Selektoren driften

Groupons Klassennamen und data-testid-Attribute ändern sich ohne Ankündigung. Behandeln Sie die obigen Selektoren als Startvorlage, nicht als Vertrag. Wenn ein Feld bei jeder Karte als None zurückkommt, überprüfen Sie ein Live-Angebot erneut in den Dev-Tools Ihres Browsers und aktualisieren Sie den Selektor. Periodische Selektor-Wartung ist bei jedem produktiven Scraper normal, kein Zeichen dafür, dass etwas kaputt ist.

Schritt 3: Den Rabatt berechnen

Groupon druckt manchmal ein Rabatt-Badge, aber die zuverlässigste Ersparnis ist die, die Sie aus den beiden bereits extrahierten Preisen ableiten. Parsen Sie den numerischen Wert aus jedem Preisstring und berechnen Sie den Prozentsatz. Die eigene Berechnung bedeutet, dass das Feld für jede Karte konsistent ist, egal ob die Seite ein Badge zeigt oder nicht.

python
import re

def to_amount(price):
    if not price:
        return None
    match = re.search(r"[\d,.]+", price)
    return float(match.group().replace(",", "")) if match else None

def discount_percent(original, current):
    o, c = to_amount(original), to_amount(current)
    if not o or not c or o <= 0:
        return None
    return round((o - c) / o * 100)

Der to_amount-Helfer entfernt Währungssymbole und Tausendertrennzeichen, sodass sowohl "$45" als auch "$1,299.00" sauber geparst werden, und gibt None statt eines Absturzes zurück, wenn ein Preis fehlt. discount_percent prüft vor der Division auf einen Null- oder fehlenden Originalpreis, sodass eine Karte ohne durchgestrichenen Preis einfach einen None-Rabatt liefert statt eine Ausnahme auszulösen. Fügen Sie das Ergebnis mit "discount": discount_percent(original_price, current_price) in jeden Datensatz in der Schleife ein.

Schritt 4: Alles zusammenführen

Jetzt verbinden Sie das Abrufen, das Parsen und die Rabattberechnung zu einem ausführbaren Skript. Rufen Sie das gerenderte HTML ab, übergeben Sie es an den Parser, reichern Sie jeden Datensatz mit dem berechneten Rabatt an und schreiben Sie das Ergebnis in JSON.

python
import json
import re
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['status_code']}")
    return None

def text_of(card, selector):
    el = card.select_one(selector)
    return el.get_text(strip=True) if el else None

def to_amount(price):
    if not price:
        return None
    match = re.search(r"[\d,.]+", price)
    return float(match.group().replace(",", "")) if match else None

def discount_percent(original, current):
    o, c = to_amount(original), to_amount(current)
    if not o or not c or o <= 0:
        return None
    return round((o - c) / o * 100)

def parse_deals(html):
    soup = BeautifulSoup(html, "html.parser")
    cards = soup.select('div[data-item-type="card"] > article')
    deals = []

    for card in cards:
        link = card.select_one("a[href]")
        current = text_of(card, 'div[data-testid="green-price"]')
        original = text_of(card, 'div[data-testid="strike-through-price"]')
        deals.append({
            "title": text_of(card, "h2.text-dealCardTitle"),
            "current_price": current,
            "original_price": original,
            "discount": discount_percent(original, current),
            "location": text_of(card, "h2 + div span"),
            "link": link["href"] if link else None,
        })

    return deals

def main():
    page_url = "https://www.groupon.com/local/washington-dc"
    html = crawl(page_url)
    if not html:
        return
    deals = parse_deals(html)
    with open("groupon_deals.json", "w") as f:
        json.dump(deals, f, indent=2)
    print(f"Saved {len(deals)} deals")

if __name__ == "__main__":
    main()

Wie die Ausgabe aussieht

Führen Sie das vollständige Skript mit python scraper.py aus und Sie erhalten einen sauberen strukturierten Datensatz für jedes Angebot, bereit zum Schreiben in JSON, CSV oder eine Datenbank.

json
[
  {
    "title": "55-Minute Couples Massage or 50-Minute Deep Tissue Massage",
    "current_price": "$65",
    "original_price": "$95",
    "discount": 32,
    "location": "4238 Wilson Boulevard, Arlington",
    "link": "https://www.groupon.com/deals/refresh-therapeutic-massage-3"
  },
  {
    "title": "Spa Package with Glass of Wine at Spa Logic",
    "current_price": "$219",
    "original_price": "$330",
    "discount": 34,
    "location": "1721 Connecticut Avenue Northwest, Washington",
    "link": "https://www.groupon.com/deals/spa-logic-12"
  }
]

Kategorieseiten in Schleifen abrufen und Anfragen dosieren

Eine Kategorie ist ein Demo; ein echter Job läuft über mehrere Städte oder Branchen. Die Form bleibt dieselbe: Halten Sie eine Liste von Kategorie-URLs, rufen Sie jede über das Crawling API ab, parsen Sie sie mit derselben Funktion und sammeln Sie die Zeilen. Da jede Kategorieseite dieselbe Kartenstruktur teilt, funktioniert der bereits geschriebene Parser ohne Änderungen für alle. Die eine Gewohnheit, die einen langen Lauf gesund hält, ist Dosierung: Machen Sie Pausen zwischen den Anfragen, damit Sie Groupon nicht in einer engen Schleife bombardieren.

python
import time

categories = [
    "https://www.groupon.com/local/washington-dc",
    "https://www.groupon.com/local/new-york-city",
    "https://www.groupon.com/local/chicago",
]

results = []
for url in categories:
    html = crawl(url)
    if html:
        results.extend(parse_deals(html))
    time.sleep(3)

with open("groupon_deals.json", "w") as f:
    json.dump(results, f, indent=2)

Groupon lädt auch weitere Angebote hinter einem "Mehr laden"-Button statt einer nummerierten Seite. Wenn Sie die Karten unterhalb des sichtbaren Bereichs möchten, übergeben Sie eine css_click_selector-Option an das Crawling API, die auf diesen Button zeigt, und das API klickt ihn, bevor es die Seite erfasst. Überprüfen Sie den Live-Button in den Dev-Tools, um den aktuellen Selektor zu lesen, da dieses Attribut wie der Rest des Markups driftet.

Unblockiert bleiben

Auch mit gehandhabtem Rendering beobachtet Groupon scraper-ähnlichen Datenverkehr. Einige Gewohnheiten halten einen Lauf gesund, und sie gelten für jedes kommerzielle Ziel.

  • Dosieren Sie Ihre Anfragen. Kategorieseiten in einer engen Schleife zu bombardieren ist der schnellste Weg, gedrosselt zu werden. Verteilen Sie Anfragen und variieren Sie Ihre Ziele, anstatt eine Stadt mit voller Geschwindigkeit zu crawlen.
  • Setzen Sie auf Rotation. Ein Pool von Residential-IPs verteilt Anfragen über viele reale Nutzeradressen, sodass keine einzelne ein Ratenlimit auslöst. Das Crawling API handhabt dies für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, den Sie richtig machen müssen.
  • Lesen Sie die Status-Codes. Ein Lauf, der beginnt, Herausforderungen oder Fehler zurückzugeben, sagt Ihnen, dass die aktuelle Rate oder IP-Ebene nicht mehr ausreicht. Behandeln Sie das als Signal zum Zurückrudern, nicht als Lärm zum Ignorieren.

Das breitere Playbook finden Sie unter wie man Webseiten scrapt, ohne blockiert zu werden und im tieferen Einblick in wie man CAPTCHAs beim Web Scraping umgeht. Wenn Ihr Ziel wie Groupon clientseitig gerendert wird, erklärt unser Leitfaden zum Crawlen von JavaScript-Websites, warum Rendering wichtig ist. Und wenn Sie Ihren eigenen Datenverkehr lieber durch einen rotierenden Pool leiten möchten statt die verwaltete API zu nutzen, bietet der Smart AI Proxy (auch als AI Proxy bezeichnet) dieselbe Residential-IP-Rotation als Drop-in-Proxy-Endpunkt.

Ob das Scrapen von Groupon erlaubt ist, hängt von Groupons Nutzungsbedingungen, Ihrer Jurisdiktion und dem ab, was Sie mit den Daten machen. Groupons Bedingungen setzen Grenzen für automatisierten Zugriff, sodass Scraping unabhängig von der Sorgfalt Ihres Werkzeugs gegen diese Bedingungen verstoßen kann. Keiner der hier enthaltenen Code ändert das; er macht nur den technischen Teil zum Funktionieren. Lesen Sie die Groupon-Nutzungsbedingungen und die robots.txt und behandeln Sie beide als Grenze für das, was Sie erfassen.

Einige Grundsätze, an denen man festhalten sollte. Erfassen Sie nur öffentliche Angebotsdaten: Titel, aktuellen Preis, Originalpreis, Rabatt, Standort und Link, die jeder auf einer Kategorieseite ohne Konto sehen kann. Respektieren Sie die von Groupon angegebenen Ratenerwartungen und halten Sie Ihr Anfragevolumen niedrig genug, dass Sie seine Server nicht belasten. Wenn Sie die Daten kommerziell verwenden möchten, holen Sie sich die Erlaubnis oder eine offizielle Vereinbarung, anstatt anzunehmen, dass Schweigen Zustimmung ist.

Dieser Leitfaden beschränkt sich bewusst auf öffentliche Angebots- und Kategorieseiten, weil das die Linie ist, die die Arbeit vertretbar macht. Er behandelt nichts hinter einem Login, keine Konto- oder persönlichen Daten, keine Kundendetails, keine Login-geschützten Seiten oder Versuche, die Authentifizierung zu umgehen. Nur öffentliche Angebotsdaten. Wenn Ihr Projekt mehr als das erfordert, ist eine offizielle Datenvereinbarung der richtige Weg, kein ausgefeilterer Scraper.

Zusammenfassung

Wichtigste Erkenntnisse

  • Groupon wird clientseitig gerendert. Ein einfacher Abruf gibt einen leeren Rahmen zurück, daher müssen Sie die Seite rendern, bevor Sie sie parsen.
  • Sie benötigen Rendering und eine vertrauenswürdige IP zusammen. Das Crawling API mit einem JS-Token erledigt beides in einem Aufruf; ajax_wait und page_wait steuern, wie lange es auf Inhalte wartet.
  • BeautifulSoup übernimmt die Extraktion. Wählen Sie alle Deal-Karten aus, dann lesen Sie Titel, aktuellen Preis, Originalpreis, Standort und Link aus jeder, und erwarten Sie, dass die Selektoren driften.
  • Leiten Sie den Rabatt selbst ab. Beide Preise zu parsen und die Ersparnis zu berechnen ist konsistenter als das Scrapen eines Badges, das nicht immer vorhanden ist.
  • Skalieren Sie durch Schleifen über Kategorien und Dosierung. Derselbe Parser funktioniert für jede Kategorieseite, sodass ein echter Job eine Liste von URLs plus eine Pause zwischen den Anfragen ist.
  • Bleiben Sie bei öffentlichen Daten. Respektieren Sie Groupons ToS und robots.txt, und berühren Sie niemals Konten, persönliche Daten oder Login-geschützte Seiten.

Häufig gestellte Fragen

Warum gibt ein einfacher Abruf keine Angebote von Groupon zurück?

Weil Groupon seine Deal-Karten clientseitig mit JavaScript rendert. Das anfängliche HTML ist ein Rahmen, der sich erst füllt, nachdem die Seitenskripte in einem Browser ausgeführt wurden, sodass eine rohe HTTP-Anfrage Status 200 mit leeren Karten zurückgibt. Um echte Daten zu erhalten, müssen Sie die Seite zuerst rendern, was das JS-Token des Crawling API für Sie übernimmt.

Benötige ich das normale Token oder das JS-Token für Groupon?

Das JS-Token. Das normale Token ruft statisches HTML ab, was auf Groupon derselbe leere Rahmen ist, den ein einfacher Abruf zurückgibt. Das JS-Token rendert die Seite in einem echten Browser, bevor es das HTML zurückgibt, sodass die Deal-Karten vorhanden sind, wenn BeautifulSoup sie parst.

Wie scrappe ich alle Angebote unterhalb des "Mehr laden"-Buttons?

Groupon lädt zusätzliche Angebote hinter einem Button statt einer nummerierten Seite. Übergeben Sie eine css_click_selector-Option an das Crawling API mit dem CSS-Selektor des Buttons, und das API klickt ihn, bevor es die Seite erfasst, sodass die zusätzlichen Karten in dem HTML sind, das Sie parsen. Bestätigen Sie den aktuellen Selektor des Buttons in den Dev-Tools Ihres Browsers, da dieses Attribut sich im Laufe der Zeit ändert.

Meine Selektoren geben None für jede Karte zurück. Was hat sich geändert?

Fast sicher Groupons Markup. Seine Klassennamen und data-testid-Attribute ändern sich ohne Ankündigung, sodass Selektoren, die letzten Monat funktionierten, jetzt kaputt sein können. Überprüfen Sie ein Live-Angebot erneut in den Dev-Tools Ihres Browsers und aktualisieren Sie die Selektoren. Periodische Selektor-Wartung ist bei jedem produktiven Scraper normal.

Kann ich Konto- oder persönliche Daten von Groupon scrapen?

Nein, und dieser Leitfaden behandelt das nicht. Kontodetails, persönliche Daten und alles hinter einem Login liegen außerhalb öffentlicher Angebotsseiten, fallen daher nicht in den Anwendungsbereich hier und verstoßen gegen Groupons Bedingungen. Login-geschützte Inhalte zu scrapen oder die Authentifizierung zu umgehen, um darauf zuzugreifen, ist kein Teil dieses Ansatzes. Bleiben Sie bei öffentlichen Angebots- und Kategoriedaten.

Wie vermeide ich Blockierungen beim Scrapen von Groupon?

Halten Sie Ihre Anfragerate pro IP niedrig, variieren Sie Ihre Ziele statt eine Stadt in einer Schleife abzuarbeiten, und leiten Sie durch rotierende Residential-IPs, damit keine einzelne Adresse ein Ratenlimit auslöst. Das Crawling API verwaltet Rotation und einen vertrauenswürdigen IP-Pool für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, in den Sie investieren müssen. Beobachten Sie die Status-Codes und weichen Sie zurück, wenn Sie beginnen, Herausforderungen zu sehen.

Jetzt loslegen

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.

Self-Service · Kein Verkaufsgespräch erforderlich · Enterprise-Crawl-Volumen verfügbar