Etsy ist ein globaler Marktplatz für handgefertigte, Vintage- und Bastelmaterialien, und jede Suchergebnisseite ist ein öffentlicher, strukturierter Feed der aktuellen Angebote von Verkäufern: der Produkttitel, der Preis, der Shop dahinter und eine Sternebewertung. Wer Marktrecherche, Preisverfolgung oder Wettbewerbsanalyse im Handmade-Bereich betreibt, findet in diesen Angebotsdaten eines der klarsten Nachfragesignale, das ohne Account auslesbar ist. Ein Verkäufer kann beobachten, wie Konkurrenten ähnliche Artikel bepreisen; ein Käufer kann eine Kategorie auf Trends überwachen; ein Analyst kann nachverfolgen, wie sich eine Nische im Laufe der Zeit entwickelt.

Diese Anleitung zeigt, wie man Etsy-Produktangebote mit Python scraped. Sie erstellen einen kleinen, lauffähigen Scraper, der eine Etsy-Suchseite über die Crawling API abruft, je Angebot einen sauberen Datensatz parst, die Seitennavigation über mehrere Ergebnisseiten hinweg bewältigt und die Ergebnisse in JSON und CSV exportiert. Die gesamte Anleitung beschränkt sich auf öffentliche Angebotsdaten: Titel, Preise, Shop-Namen, Bewertungen und Links, die jeder auf einer Etsy-Suchseite ohne Anmeldung sehen kann.

Was Sie bauen werden

Ein Python-Skript, das eine Etsy-Suchanfrage entgegennimmt, jede gerenderte Ergebnisseite über die Crawling API abruft und je Angebotskarte einen strukturierten Datensatz extrahiert. Als durchgehendes Beispiel verwenden wir die Suchanfrage clothes, dieselbe wie in der früheren Anleitung, und lesen folgende Felder aus jeder Karte aus:

  • Title der auf der Angebotskarte angezeigte Produktname.
  • Price der gelistete Preis als Währungswert, den Etsy auf der Karte darstellt.
  • Shop der Name des Shops des Verkäufers hinter dem Angebot.
  • Rating die durchschnittliche Sternebewertung, wenn das Angebot eine zeigt.
  • Link die URL zur Detailseite des Angebots.

Warum eine einfache Anfrage auf Etsy scheitert

Wenn Sie einen einfachen HTTP-Client auf eine Etsy-Such-URL richten, erhalten Sie selten die gesuchten Angebote. Zwei Dinge wirken gegen Sie. Erstens setzt Etsy stark auf JavaScript: Die Seite liefert eine leichte Hülle und befüllt die Angebotskarten erst, wenn die Seitenskripte ausgeführt werden, sodass das anfängliche HTML häufig den Großteil des Rasters nicht enthält. Zweitens erkennt Etsy automatisierten Traffic schnell. Datacenter-IP-Bereiche und Anfragemuster, die nicht wie ein echter Browser aussehen, werden mit einem CAPTCHA, einer Zwischenseite oder einer direkten Blockade konfrontiert, bevor die Ergebnisse je erreicht werden.

Ein funktionsfähiger Etsy-Scraper braucht also zwei Dinge in einer einzigen Anfrage: einen Browser, der die Seite rendert, und eine IP, die Etsy als echten Käufer liest. Sie können das selbst mit einem Headless-Browser und einem Pool aus rotierenden Residential-Proxys zusammenstellen, aber diesen Stack in Schuss zu halten, ist der größte Teil der Arbeit. Die Crawling API bündelt beides in einem einzigen Aufruf: Sie übergeben ihr die Such-URL, sie rendert die Seite hinter einer vertrauenswürdigen Residential-IP, übernimmt die Rotation und das CAPTCHA-Lösen und liefert fertiges HTML zum Parsen zurück.

Voraussetzungen

Vor dem Schreiben von Code müssen einige Dinge vorhanden sein. Keines davon nimmt viel Zeit in Anspruch.

Grundlegendes Python. Sie sollten in der Lage sein, ein Python-Skript zu schreiben und auszuführen sowie Pakete mit pip zu installieren. Wer neu in der Sprache ist, findet in der offiziellen Python-Dokumentation oder einem Einführungskurs das Niveau, das dieses Tutorial voraussetzt.

Python 3.8 oder höher. Bestätigen Sie Ihre Version mit python --version (oder python3 --version). Falls Python nicht installiert ist, holen Sie es von python.org und stellen Sie sicher, dass Python in Ihrem System-PATH enthalten ist.

Ein Crawlbase-Konto und Token. Registrieren Sie sich für ein kostenloses Konto, öffnen Sie Ihr Dashboard und kopieren Sie Ihren Token. Da Etsy seine Angebote per JavaScript rendert, verwenden Sie für diesen Scraper den JavaScript-Token. Das kostenlose Kontingent umfasst bis zu 20.000 Anfragen ohne Kreditkarte, was zum Erstellen und Testen mehr als ausreicht. Behandeln Sie den Token wie ein Passwort und bewahren Sie ihn aus der Versionskontrolle heraus.

Projekt einrichten

Erstellen Sie eine virtuelle Umgebung, damit die Projektabhängigkeiten isoliert bleiben, und installieren Sie dann die drei Bibliotheken, die der Scraper benötigt. crawlbase ist der offizielle Client für die Crawling API, beautifulsoup4 parst das zurückgegebene HTML, damit Sie jedes Feld aus den Angebotskarten per CSS-Selektor auslesen können, und pandas macht den CSV-Export zum Einzeiler.

bash
python --version

python -m venv etsy_env
source etsy_env/bin/activate

pip install crawlbase beautifulsoup4 pandas

Unter Windows aktivieren Sie die Umgebung mit etsy_env\Scripts\activate statt der source-Zeile. Sobald die Bibliotheken installiert sind, erstellen Sie die Skriptdatei, auf der der Rest der Anleitung aufbaut:

bash
touch etsy_scraper.py

Die Etsy-Suchseite verstehen

Etsys Suchseite ist unter einer stabilen URL erreichbar, die auf der Anfrage basiert: Eine Suche nach clothes lautet https://www.etsy.com/search?q=clothes, und Sie navigieren durch Ergebnisseiten, indem Sie einen &page=-Parameter anhängen. Die Seite zeigt ein Raster von Angebotskarten, eine pro Produkt, jede mit denselben wenigen Feldern: Titel, Preis, Shop-Name, Sternebewertung und Link zur Detailseite des Angebots.

Bevor Sie Selektoren schreiben, öffnen Sie eine Suchseite in Ihrem Browser, klicken Sie mit der rechten Maustaste auf eine Angebotskarte und wählen Sie "Untersuchen". Etsy bündelt jedes Ergebnis in einem Listenelement unter einem Container für Suchergebnisse und stellt Titel, Preis und Bewertung innerhalb dieser Karte bereit. Diese Elemente sind Ihre Ziele. Etsys Klassennamen ändern sich von Zeit zu Zeit, sodass die folgenden Selektoren zum Zeitpunkt der Erstellung dieser Anleitung funktionierten; rechnen Sie damit, die Live-Seite erneut zu inspizieren und anzupassen, wenn ein Feld leer zurückkommt.

Schritt 1: Die gerenderte Suchseite abrufen

Beginnen Sie damit, die fertige Seite zu erhalten. Importieren Sie die CrawlingAPI-Klasse, initialisieren Sie sie mit Ihrem Token, legen Sie die Such-URL fest und fordern Sie sie an. Die Statusprüfung vor dem Parsen lässt Fehler laut statt still auftreten.

python
from crawlbase import CrawlingAPI

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

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

if __name__ == "__main__":
    search_url = "https://www.etsy.com/search?q=clothes"
    html = crawl(search_url)
    print(html[:500] if html else "No HTML returned")

Die beiden Wait-Optionen sind wichtig für ein Raster, das sich beim Laden der Seite füllt. ajax_wait weist die API an, auf das Fertigstellen asynchroner Inhalte zu warten, und page_wait hält für eine feste Anzahl Millisekunden nach dem Laden an, damit spät gerenderte Karten erscheinen, bevor die Seite aufgenommen wird. Der Body wird als latin1 dekodiert, da Etsy-Seiten Zeichen enthalten können, an denen striktes UTF-8-Dekodieren scheitert. Führen Sie das Skript aus und Sie sollten echtes Angebots-Markup sehen, keine Herausforderungsseite. Das bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben.

Crawlbase Crawling API

Dieser einzelne crawl-Aufruf verbirgt den schwierigen Teil: Etsy benötigt eine gerenderte Seite hinter einer vertrauenswürdigen IP, und die beiden _wait-Optionen helfen nur, wenn die Anfrage selbst durchkommt. Die Crawling API nimmt Ihren Token, führt die Suchseite in einem echten Browser aus, rotiert serverseitig durch Residential-IPs und übernimmt das CAPTCHA-Lösen, dann liefert sie fertiges HTML. Sie müssen selbst keine Headless-Browser-Flotte und keinen Proxy-Pool betreiben. Testen Sie es auf einer Etsy-Such-URL mit dem kostenlosen Kontingent von bis zu 20.000 Anfragen.

Schritt 2: Angebotskarten mit BeautifulSoup parsen

Mit gerendertem HTML laden Sie es in BeautifulSoup, finden alle Angebotskarten und lesen jedes Feld per Selektor aus. Etsy gruppiert Ergebnisse in einer geordneten Liste unter dem Suchergebnis-Container, mit einem Listenelement pro Karte. Innerhalb jeder Karte befinden sich Titel, Preis, Shop und Bewertung in eigenen Elementen, und der Angebots-Link ist der Anker der Karte. Umschließen Sie jede Karte in einem try/except, damit ein fehlerhaftes Angebot den Lauf nicht abbricht.

python
from bs4 import BeautifulSoup

CONTAINER = "div.search-listings-group div[data-search-results-container] ol li"

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

def parse_link(card):
    a = card.select_one("a.listing-link[href]")
    return a["href"] if a else None

def scrape_listings(html):
    soup = BeautifulSoup(html, "html.parser")
    cards = soup.select(CONTAINER)
    results = []
    for card in cards:
        try:
            title = text_of(card, "div.v2-listing-card__info h3.v2-listing-card__title")
            if not title:
                continue
            results.append({
                "title": title,
                "price": text_of(card, "div.n-listing-card__price p.lc-price span.currency-value"),
                "shop": text_of(card, "div.v2-listing-card__info p.v2-listing-card__shop span"),
                "rating": text_of(card, "div.shop-name-with-rating span.larger_review_stars > div"),
                "link": parse_link(card),
            })
        except Exception as e:
            print(f"Skipped a card: {e}")
    return results

Der text_of-Helfer fragt ein Element innerhalb einer Karte ab und gibt None zurück, wenn es fehlt, anstatt bei einem .get_text()-Aufruf auf nichts zu werfen. Das macht die Extraktion robust, wenn ein Feld fehlt, was häufig vorkommt, da nicht jedes Angebot eine Bewertung zeigt. Der Titel kommt aus h3.v2-listing-card__title, der Preis aus dem span.currency-value innerhalb des Preisblocks, der Shop-Name aus dem Shop-Element der Angebotskarte und die Bewertung aus dem Review-Stars-Block. Der Container-Selektor sowie die Selektoren für Titel, Preis und Bewertung wurden direkt aus der früheren Anleitung übernommen; Shop und Link sind die beiden zusätzlichen Felder, die diese Version hinzufügt.

Selectors drift

Etsys Klassennamen für Angebotskarten (die Titelklasse, der Preis-Span, der Bewertungsblock) werden neu generiert und ändern sich ohne Vorankündigung. Betrachten Sie die obigen Selektoren als Ausgangspunkt, nicht als Vertrag. Wenn ein Feld für jede Karte als None zurückkommt, inspizieren Sie eine Live-Suchseite in den Entwicklertools Ihres Browsers und aktualisieren Sie den Selektor. Regelmäßige Selektor-Wartung ist bei jedem Produktions-Scraper normal.

Schritt 3: Paginierung über Ergebnisseiten hinweg verwalten

Eine Suchseite ist eine Stichprobe; der vollständige Ergebnissatz erstreckt sich über viele Seiten. Etsy teilt Suchergebnisse in nummerierte Seiten auf, und Sie navigieren durch sie, indem Sie &page=N an die Such-URL anhängen. Um einen vollständigen Datensatz zu erhalten, lesen Sie die Gesamtseitenanzahl von der ersten Seite ab und gehen dann jede Seite nacheinander durch. Eine kurze Verzögerung zwischen Anfragen gibt dem Lauf ein ruhiges Tempo, damit Etsy nicht in einem engen Loop überlastet wird.

python
import time

PAGINATION = 'div[data-appears-component-name="search_pagination"] nav ul.search-pagination li:nth-last-child(3) a'

def get_total_pages(html):
    soup = BeautifulSoup(html, "html.parser")
    el = soup.select_one(PAGINATION)
    try:
        return int(el.get_text(strip=True)) if el else 1
    except ValueError:
        return 1

def scrape_all_pages(query, max_pages=5):
    search_url = f"https://www.etsy.com/search?q={query}"
    first = crawl(search_url)
    if not first:
        return []
    total = min(get_total_pages(first), max_pages)
    all_listings = scrape_listings(first)
    print(f"page 1: {len(all_listings)} listings (of {total} pages)")
    for page in range(2, total + 1):
        html = crawl(f"{search_url}&page={page}")
        if not html:
            break
        found = scrape_listings(html)
        all_listings.extend(found)
        print(f"page {page}: {len(found)} listings")
        time.sleep(2)
    return all_listings

get_total_pages liest die Seitenanzahl aus dem Paginierungs-Steuerelement: Der Legacy-Selektor zielt auf den drittletzten Paginierungs-Link, also die letzte nummerierte Seite vor den Weiter- und Ende-Pfeilen. Er fällt auf 1 zurück, wenn das Steuerelement fehlt oder der Text keine Zahl ist, damit ein einziges Ergebnis ohne Paginierung weiterhin funktioniert. Die max_pages-Obergrenze hält einen Testlauf begrenzt, während Sie entwickeln, und das time.sleep(2) zwischen Anfragen gibt dem Crawl-Lauf ein ruhiges Tempo, damit Sie nicht für schnell aufeinanderfolgende Anfragen markiert werden.

Schritt 4: Skript zusammensetzen und JSON und CSV exportieren

Jetzt verbinden Sie Abrufen, Parsen und Paginierung zu einem lauffähigen Skript und schreiben dann die Datensätze in JSON und CSV, damit Sie sie in ein Notebook oder eine Tabelle laden können. JSON bewahrt die Struktur für Code; die mit pandas erstellte CSV öffnet sich direkt in jedem Tabellenkalkulationswerkzeug.

python
import json
import time
import pandas as pd
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"})
CONTAINER = "div.search-listings-group div[data-search-results-container] ol li"
PAGINATION = 'div[data-appears-component-name="search_pagination"] nav ul.search-pagination li:nth-last-child(3) a'

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 3000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("latin1")
    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 parse_link(card):
    a = card.select_one("a.listing-link[href]")
    return a["href"] if a else None

def scrape_listings(html):
    soup = BeautifulSoup(html, "html.parser")
    results = []
    for card in soup.select(CONTAINER):
        try:
            title = text_of(card, "div.v2-listing-card__info h3.v2-listing-card__title")
            if not title:
                continue
            results.append({
                "title": title,
                "price": text_of(card, "div.n-listing-card__price p.lc-price span.currency-value"),
                "shop": text_of(card, "div.v2-listing-card__info p.v2-listing-card__shop span"),
                "rating": text_of(card, "div.shop-name-with-rating span.larger_review_stars > div"),
                "link": parse_link(card),
            })
        except Exception as e:
            print(f"Skipped a card: {e}")
    return results

def get_total_pages(html):
    soup = BeautifulSoup(html, "html.parser")
    el = soup.select_one(PAGINATION)
    try:
        return int(el.get_text(strip=True)) if el else 1
    except ValueError:
        return 1

def scrape_all_pages(query, max_pages=5):
    search_url = f"https://www.etsy.com/search?q={query}"
    first = crawl(search_url)
    if not first:
        return []
    total = min(get_total_pages(first), max_pages)
    listings = scrape_listings(first)
    print(f"page 1: {len(listings)} listings (of {total} pages)")
    for page in range(2, total + 1):
        html = crawl(f"{search_url}&page={page}")
        if not html:
            break
        found = scrape_listings(html)
        listings.extend(found)
        print(f"page {page}: {len(found)} listings")
        time.sleep(2)
    return listings

def export(rows, name="etsy_listings"):
    with open(f"{name}.json", "w", encoding="utf-8") as f:
        json.dump(rows, f, indent=2, ensure_ascii=False)
    pd.DataFrame(rows).to_csv(f"{name}.csv", index=False)
    print(f"Saved {len(rows)} listings to {name}.json and {name}.csv")

def main():
    rows = scrape_all_pages("clothes", max_pages=5)
    if rows:
        export(rows)

if __name__ == "__main__":
    main()

Führen Sie das vollständige Skript mit python etsy_scraper.py aus. Es ruft jede gerenderte Suchseite ab, parst eine Zeile pro Angebot, navigiert bis zu max_pages durch die Ergebnisseiten und schreibt sowohl etsy_listings.json als auch etsy_listings.csv. Die CSV aus einem pandas-DataFrame zu erstellen bedeutet, dass die Spalten automatisch den Dictionary-Schlüsseln folgen, sodass die beiden Exporte nie auseinanderlaufen.

Wie die Ausgabe aussieht

Sie erhalten eine saubere Liste von Angebots-Datensätzen in Seitenreihenfolge, bereit zum Schreiben in JSON, CSV oder eine Datenbank.

json
[
  {
    "title": "Women's Christian Sweatshirt, Bible Verse Shirts, Faith Based Tshirts",
    "price": "13.85",
    "shop": "FaithfulThreadsCo",
    "rating": "4.8",
    "link": "https://www.etsy.com/listing/1234567890/womens-christian-sweatshirt"
  },
  {
    "title": "Thankful Super Soft Sweatshirt, Thanksgiving Sweatshirt, Friendsgiving Shirt",
    "price": "29.99",
    "shop": "CozyFallPrints",
    "rating": "4.9",
    "link": "https://www.etsy.com/listing/9876543210/thankful-super-soft-sweatshirt"
  }
]

Der Preis kommt als reiner Währungswert an, den Etsy auf der Karte rendert. Wenn Sie eine Zahl zur Analyse benötigen, können Sie ihn nach dem Entfernen von Tausendertrennzeichen in einen Float umwandeln. Wenn Sie die Daten lieber in einem abfragbaren Format als in Flat-Files speichern möchten, lassen sich dieselben Zeilen-Dictionaries mit einem kurzen sqlite3-Insert direkt in eine SQLite-Tabelle eintragen, was die frühere Anleitung als Alternative zu CSV beschrieben hatte.

Skalierung auf mehrere Suchanfragen

Eine Suchanfrage ist eine Demo; ein echter Rechercheauftrag läuft über viele. Etsy liefert eine Suchseite für jeden beliebigen Suchbegriff, also können Sie zum Vergleich von Nischen eine Liste von Anfragen führen und den paginierten Scraper für jede ausführen, wobei die Ausgabe nach Anfragename getrennt wird. Dosieren Sie die Anfragen, damit Sie nicht alles mit voller Geschwindigkeit crawlen.

python
QUERIES = ["clothes", "ceramic mug", "leather wallet"]

def scrape_queries(queries, max_pages=3):
    everything = {}
    for query in queries:
        print(f"scraping: {query}")
        everything[query] = scrape_all_pages(query, max_pages=max_pages)
        time.sleep(3)
    return everything

Die Ausgabe nach Anfrage zu strukturieren hält jedes Ergebnis-Set getrennt, was Sie beim Vergleich von Kategorien wollen. Um Trends im Zeitverlauf zu verfolgen, führen Sie den Job regelmäßig aus, stempeln jeden Export mit dem Datum und vergleichen aufeinanderfolgende Snapshots, um zu sehen, wie sich Preise und Bewertungen verschoben haben. Für eine tiefergehende Behandlung, wie man aus einem solchen Feed einen Preisdatensatz macht, lesen Sie Wie man Web-Scraping für Price Intelligence nutzt.

Geblockt bleiben verhindern

Auch wenn das Rendering gehandhabt wird, beobachtet Etsy scrapertypischen Traffic. Einige Gewohnheiten halten einen Lauf gesund, und sie gelten für jedes schwierige kommerzielle Ziel.

  • Dosieren Sie Ihre Anfragen. Verteilen Sie Anfragen mit einer Verzögerung zwischen Seiten und Anfragen, anstatt alles mit voller Geschwindigkeit zu crawlen. Planen Sie umfangreichere Jobs außerhalb der Stoßzeiten, um die Last auf Etsys Servern zu reduzieren.
  • Setzen Sie auf Rotation. Ein Pool aus Residential-IPs verteilt Anfragen über viele Adressen echter Nutzer, sodass keine einzelne ein Rate-Limit auslöst. Die Crawling API erledigt das für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, den Sie richtig machen müssen.
  • Behalten Sie nur, was Sie brauchen. Speichern Sie die Angebots-Felder, die Ihr Projekt benötigt, und verwerfen Sie den Rest. Überprüfen Sie Ihre Selektoren regelmäßig, damit der Scraper mit Markup-Änderungen Schritt hält.

Das umfassende Playbook zur Blockvermeidung finden Sie unter Wie man Websites scraped, ohne geblockt zu werden, und für die Parse-Seite deckt der Leitfaden BeautifulSoup in Python nutzen die Bibliothek ausführlich ab. Wenn Sie einen vollständigen Recherche-Workflow aufbauen, zeigt Wie man E-Commerce-Produktrecherche automatisiert, wo ein Angebots-Feed wie dieser einzuordnen ist.

Ob das Scrapen von Etsy erlaubt ist, hängt von Etsys Nutzungsbedingungen, Ihrer Jurisdiktion und dem Verwendungszweck der Daten ab. Etsys Bedingungen schränken den automatisierten Zugriff ein, sodass Scraping unabhängig von der Sorgfalt Ihrer Werkzeuge gegen diese Bedingungen verstoßen kann. Keiner der hier gezeigten Code ändert das; er lässt lediglich den technischen Teil funktionieren. Lesen Sie Etsys Nutzungsbedingungen und die robots.txt und behandeln Sie beides als Grenze dessen, was Sie sammeln. Bei kommerziellem oder wettbewerbsbezogenem Gebrauch wird das rechtliche Bild komplexer, und in einem solchen Fall ist es ratsam, einen Rechtsexperten zu Ihrem spezifischen Fall zu konsultieren.

Einige Linien, an denen man festhalten sollte. Sammeln Sie nur öffentliche Daten: die Angebotstiteln, Preise, Shop-Namen, Bewertungen und Angebots-Links, die jeder auf einer Suchseite ohne Account sehen kann. Halten Sie Ihr Anfragevolumen niedrig genug, damit Sie Etsys Server nicht belasten, und respektieren Sie die Privatsphäre der Verkäufer: Vermeiden Sie personenbezogene Daten, einschließlich allem, was mit identifizierbaren Käufern oder Verkäufern jenseits des öffentlichen Shop-Namens in einem Angebot verbunden ist. Verbreiten Sie nicht die Produktfotos oder Beschreibungen, die Verkäufern gehören, und versuchen Sie nicht, auf etwas hinter einem Login zuzugreifen oder eine Herausforderung zu umgehen, zu der Sie nicht berechtigt sind.

Diese Anleitung ist bewusst auf öffentliche Etsy-Suchangebote beschränkt, weil das die Grenze ist, die die Arbeit vertretbar macht. Für lizenzierten oder umfangreichen Zugriff bietet Etsy eine offizielle Open API für Entwickler an, die das richtige Werkzeug ist, wenn Sie große Mengen, garantierte Struktur oder kommerzielle Rechte benötigen. Wenn Ihr Projekt mehr als öffentliche Angebotsdaten erfordert, ist diese offizielle API oder eine Datenvereinbarung der richtige Weg, kein ausgefeilterer Scraper.

Zusammenfassung

Wichtigste Erkenntnisse

  • Etsy-Suchseiten sind ein öffentlicher Angebots-Feed. Die Ergebnisseite jeder Anfrage enthält Titel, Preis, Shop und Bewertung, was sie für Marktrecherche und Preisverfolgung nützlich macht.
  • Sie brauchen Rendering und eine vertrauenswürdige IP gemeinsam. Etsy füllt das Angebots-Raster clientseitig und blockiert Bot-Traffic, weshalb die Crawling API die Seite in einem Aufruf hinter einer Residential-IP rendert.
  • BeautifulSoup übernimmt die Extraktion. Iterieren Sie die Listenelemente der Suchergebnisse und ordnen Sie Titel, Preis, Shop, Bewertung und Link den aktuellen Selektoren zu, wobei diese Selektoren mit der Zeit abweichen können.
  • Paginierung handhaben und in JSON und CSV exportieren. Lesen Sie die Seitenanzahl ab, gehen Sie jede Ergebnisseite mit einer Verzögerung durch und schreiben Sie beide Dateien, damit die Daten in Code oder eine Tabelle geladen werden können.
  • Bleiben Sie bei öffentlichen Daten. Respektieren Sie Etsys Nutzungsbedingungen und robots.txt, bevorzugen Sie die offizielle Etsy Open API für lizenzierte oder umfangreiche Daten und berühren Sie niemals Konten, personenbezogene Daten oder verkäufereigene Medien.

Häufig gestellte Fragen

Warum gibt eine einfache Anfrage keine Angebote von Etsy zurück?

Zwei Gründe. Etsy füllt einen Großteil des Angebots-Rasters clientseitig beim Laden der Seite, sodass eine rohe Anfrage oft eine Hülle ohne die meisten Karten liefert. Dazu kommt, dass Etsy Traffic, der nicht wie ein echter Browser aussieht, herausfordert oder blockiert. Das Rendern der Seite über die Crawling API hinter einer vertrauenswürdigen IP löst beides, weshalb der Scraper hier seine Anfrage mit gesetzten ajax_wait- und page_wait-Parametern darüber leitet.

Wie scraped man eine bestimmte Etsy-Suchanfrage?

Jede Etsy-Suche hat ihre eigene URL, die auf der Anfrage basiert, zum Beispiel https://www.etsy.com/search?q=clothes. Ändern Sie den q-Wert zu Ihrer gewünschten Suchanfrage, und navigieren Sie durch Ergebnisseiten, indem Sie &page=N anhängen. Um viele Anfragen abzudecken, halten Sie eine Liste davon vor und durchlaufen den paginierten Scraper mit einer kurzen Verzögerung zwischen den Anfragen.

Welche Felder kann ich aus einer Etsy-Angebotskarte extrahieren?

Aus jeder Suchergebnis-Karte zieht dieser Scraper den Produkttitel, den Preis (den Währungswert, den Etsy rendert), den Shop-Namen, die Sternebewertung und den Angebots-Link. Die frühere Anleitung erwähnte auch Produktbeschreibungen und Bilder als verfügbar auf Etsy; Sie können diese hinzufügen, indem Sie die Karte inspizieren und die passenden Selektoren zum Parse-Schritt hinzufügen.

Wie handhabe ich die Paginierung beim Scrapen von Etsy?

Lesen Sie die Gesamtseitenanzahl aus dem Paginierungs-Steuerelement auf der ersten Ergebnisseite ab, dann iterieren Sie von Seite 2 bis zu dieser Gesamtzahl und hängen Sie jedes Mal &page=N an die Such-URL an. Der Scraper hier begrenzt die Anzahl mit einem max_pages-Argument, damit ein Testlauf begrenzt bleibt, und schläft zwischen Anfragen, damit Sie Etsy nicht in einem engen Loop überlasten.

Wie speichere ich die gescrapten Etsy-Daten?

Das Skript schreibt sowohl eine JSON-Datei, die die Struktur für Code bewahrt, als auch eine CSV, die aus einem pandas-DataFrame erstellt wird und direkt in einer Tabelle geöffnet werden kann. Dieselben Zeilen-Dictionaries lassen sich mit einem kurzen sqlite3-Insert auch in eine SQLite-Tabelle eintragen, wenn Sie einen abfragbaren Speicher statt Flat-Files möchten.

Wie vermeide ich, beim Scrapen von Etsy geblockt zu werden?

Halten Sie Ihre pro-IP-Anfragefrequenz niedrig, fügen Sie eine Verzögerung zwischen Seiten und Anfragen ein und leiten Sie durch rotierende Residential-IPs, damit keine einzelne Adresse ein Rate-Limit auslöst. Die Crawling API verwaltet Rotation, einen vertrauenswürdigen IP-Pool und CAPTCHA-Behandlung für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, in den Sie investieren müssen. Beobachten Sie die Statuscodes und treten Sie einen Schritt zurück, wenn Herausforderungen auftreten.

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