Scrape Etsy za pomocą Pythona: wyszukiwanie, produkty, sklepy i recenzje

Ostatnia aktualizacja: April 28, 2026
Scrape Etsy za pomocą Pythona: wyszukiwanie, produkty, sklepy i recenzje

Etsy ma ponad 100 milionów aktywnych ofert, 5,6 miliona sprzedawców i około 450 milionów wizyt miesięcznie. To ogromna pula publicznie dostępnych danych o cenach, trendach, recenzjach i konkurencji — a jeśli kiedykolwiek próbowałeś je zbierać ręcznie, wiesz, ile to kosztuje nerwów.

Kiedyś spędziłem weekend na ręcznym katalogowaniu produktów konkurencji do projektu badania rynku. Przy numerze 30 zacząłem kwestionować każdą życiową decyzję, która doprowadziła mnie do tego arkusza kalkulacyjnego. Rzecz w tym, że dane z Etsy są niezwykle cenne do analizy cen, rozwoju produktów, odkrywania nisz i benchmarkingu sprzedawców — ale tylko wtedy, gdy da się je realnie pozyskać na dużą skalę. Właśnie o tym jest ten przewodnik: jeden poradnik pokazujący, jak scrapować Etsy w Pythonie we wszystkich czterech głównych typach stron (wyniki wyszukiwania, strony produktów, strony sklepów i recenzje), a także szczere omówienie zabezpieczeń Etsy przed botami oraz bezkodowej alternatywy dla osób, które wolałyby całkiem pominąć skryptowanie.

Co to znaczy scrapować Etsy za pomocą Pythona?

Web scraping, mówiąc najprościej, polega na napisaniu kodu, który odwiedza strony internetowe i automatycznie wyciąga interesujące Cię dane — nazwy produktów, ceny, opisy, zdjęcia, oceny, recenzje, informacje o sklepie — a następnie porządkuje je w strukturze takiej jak arkusz kalkulacyjny lub baza danych.

Python jest językiem pierwszego wyboru do takich zadań. Jest przyjazny dla początkujących, ma ogromną społeczność i bogaty ekosystem bibliotek stworzonych do scrapowania: Requests (do pobierania stron), BeautifulSoup (do parsowania HTML), Selenium i Playwright (do automatyzacji przeglądarki) oraz pandas (do porządkowania i eksportu danych). Python konsekwentnie plasuje się w czołowej trójce najpopularniejszych języków w corocznej ankiecie deweloperów Stack Overflow, a jego biblioteki do scrapowania należą do najczęściej pobieranych w PyPI.

Gdy scrapujesz Etsy, pobierasz dane z HTML-a (a czasem ukrytego JSON-a), który Etsy wysyła do Twojej przeglądarki. Do wyciągnięcia mogą być między innymi:

  • nazwy produktów, ceny, opisy, zdjęcia i warianty
  • informacje o sprzedawcy/sklepie (nazwa, liczba sprzedaży, lokalizacja, ocena)
  • oceny i pełne treści recenzji
  • wyniki wyszukiwania, kategorie i sygnały trendów

Po co scrapować Etsy? Praktyczne zastosowania, które przekładają się na ROI

Scrapowanie Etsy to nie tylko ćwiczenie techniczne — to przewaga konkurencyjna. Niezależnie od tego, czy jesteś sprzedawcą, product managerem, czy analitykiem danych, uporządkowane dane z Etsy pod ręką mogą bezpośrednio wpłynąć na wyniki finansowe.

etsy_stats_4f1f4d51c3.png

Przykład użyciaCo scrapujeszKto zyskujeWpływ na biznes
Analiza cen konkurencjiWyniki wyszukiwania + ceny produktówOperacje e-commerce, sprzedawcyDynamiczne ceny mogą średnio zwiększyć przychody o 5–22%
Odkrywanie nisz i trendówWyniki wyszukiwania, popularne ofertyZałożyciele, analitycyWcześnie wyłapuj trendujące nisze (np. „preppy pajamas” zanotowały wzrost wyszukiwań o +1 112%)
Rozwój i ulepszanie produktuRecenzje, szczegóły produktuZespoły produktoweJedna marka naczyń kuchennych odzyskała pozycję #1 Best Seller w 60 dni, korzystając z danych o sentymencie recenzji
SEO i badanie słów kluczowychWyniki wyszukiwania, tytuły/tagi produktówZespoły marketingoweWskazuj słowa kluczowe o wysokim popycie i niskiej konkurencji
Benchmarking sprzedawcówStrony sklepów, liczby sprzedażyZespoły sprzedaży, analitycyBuduj listy potencjalnych klientów już od 0,01–0,10 USD za rekord zamiast kupować gotowe listy
Monitorowanie zapasów i stanów magazynowychDostępność produktówOperacje e-commerceSzybciej reaguj na zmiany stanów magazynowych konkurencji

Każdy z tych przypadków użycia wymaga danych z innych typów stron Etsy — dlatego ten poradnik obejmuje wszystkie cztery.

Oszczędność czasu: ręcznie vs. automatycznie

  • Ręczne researchowanie Etsy: 30–45 minut na produkt (50–75 godzin dla 100 produktów)
  • Automatyczne scrapowanie: 100 ofert w 2–5 minut
  • Scrapowanie z użyciem AI jest 30–40% szybsze i osiąga nawet 99,5% dokładności

Etsy API vs. web scraping: co wybrać?

Zanim napiszesz choć jedną linię kodu, warto zadać sobie pytanie: czy powinienem użyć oficjalnego API Etsy, czy bezpośrednio scrapować stronę? To pytanie widzę bez przerwy na forach, a odpowiedź zależy od tego, jakich danych potrzebujesz.

Co Etsy API potrafi, a czego nie

Etsy oferuje API v3 z uwierzytelnianiem OAuth 2.0. Działa ono do pobierania danych z własnego sklepu — ofert, zamówień, paragonów. Ma jednak realne ograniczenia:

  • Dane konkurencji: API jest w praktyce ograniczone do Twojego własnego sklepu. Nie pobierzesz cen, sprzedaży ani ofert innego sprzedawcy.
  • Recenzje: Nie ma solidnego endpointu do masowego pobierania pełnych tekstów recenzji.
  • Limity zapytań: Domyślnie 10 żądań/sekundę, 10 000 żądań/dzień. Limit offsetu to 12 000 rekordów.
  • Użycie AI/ML: Jawnie odrzucane w procesie przeglądu aplikacji.
  • Dokumentacja: Powszechne są skargi społeczności — słabe przykłady, przestarzałe endpointy, wolne wsparcie.

Kiedy web scraping jest lepszym wyborem

Jeśli potrzebujesz danych o konkurencji, sentymentu recenzji, analizy między sklepami albo danych wykraczających poza to, co udostępnia API, scraping jest właściwą drogą. W zamian musisz zmierzyć się z zabezpieczeniami Etsy przed botami (więcej o tym za chwilę) i poświęcić czas na konfigurację.

Tabela porównawcza: API vs. scraping vs. no-code

KryteriumOficjalne API EtsyWeb scraping w PythonieThunderbit (no-code)
Dostęp do cen produktów✅ (ograniczony zestaw pól)✅ Pełny HTML/JSON-LD✅ AI wyciąga dowolne widoczne pole
Dane o recenzjach❌ Niedostępne masowo✅ Przez endpoint recenzji/HTML✅ Scrapowanie podstron
Dane sklepu konkurencji❌ Tylko własny sklep✅ Dowolny publiczny sklep✅ Dowolny publiczny sklep
Wymagana autoryzacja✅ OAuth 2.0⚠️ Pliki cookie dla danych po zalogowaniu⚠️ Scrapowanie w przeglądarce po zalogowaniu
Ryzyko blokady przez botyBrakWYSOKIE (DataDome)Obsługiwane (natywnie w przeglądarce)
Czas konfiguracjiŚredni (klucze API, OAuth)Wysoki (kod + proxy)Około 2 minuty

Jeśli potrzebujesz danych o konkurencji, recenzji albo analizy między sklepami, API po prostu tego nie zapewnia. I to jest szczera prawda.

Wybierz podejście w Pythonie, zanim napiszesz choć jedną linię kodu

Pytanie, które stale widzę na Reddicie i Stack Overflow: „Czy powinienem użyć Requests + BeautifulSoup, Selenium, proxy API, czy czegoś zupełnie innego?”. Właściwa odpowiedź zależy od Twojego poziomu, budżetu i zastosowania.

PodejścieNajlepsze dlaKrzywa naukiObsługuje JS?Obsługa anty-botKoszt
Requests + BeautifulSoupDeweloperzy chcący pełnej kontroliŚredniaRęczna (nagłówki, proxy)Darmowe + koszty proxy
Selenium / PlaywrightStrony mocno oparte na JS, przepływy logowaniaWysokaCzęściowa (odcisk przeglądarki)Darmowe + koszty proxy
Usługi proxy APISkala + obejście anty-botŚrednia✅ (przez API)✅ Wbudowaneod 49 USD/mies.
Thunderbit (no-code)Osoby nietechniczne, szybkie pobieranieBardzo niska✅ (natywnie w przeglądarce)✅ (sesja przeglądarki)Dostępny darmowy plan

Jeśli chcesz pełnej kontroli i dobrze czujesz się w Pythonie, wybierz Requests + BeautifulSoup. Jeśli potrzebujesz renderowania JS lub przepływów logowania, użyj Selenium. Jeśli chcesz na dużą skalę omijać zabezpieczenia anty-bot, rozważ usługę proxy. A jeśli chcesz dane z Etsy bez pisania i utrzymywania kodu, warto przyjrzeć się Thunderbit — wrócę do tego za chwilę.

Jak Etsy się broni: zrozumienie ochrony DataDome przed botami

Większość poradników o scrapowaniu powie po prostu: „użyj proxy” i na tym koniec. To za mało w przypadku Etsy. Etsy korzysta z DataDome, jednego z najbardziej agresywnych systemów anty-botowych w sieci. Własne studium przypadku DataDome pokazuje Etsy jako historię sukcesu, zaznaczając, że scraperzy odpowiadali kiedyś za około 1% kosztów obliczeniowych Etsy.

etsy_antibot_5431142c9c.png

Czym jest DataDome i jak działa?

DataDome nie sprawdza tylko adresu IP. Działa wielowarstwowo:

  • Odcisk TLS (JA3): Biblioteka requests w Pythonie ma charakterystyczną sygnaturę TLS, którą DataDome potrafi natychmiast wykryć.
  • Analiza nagłówków/protokołu HTTP: Sprawdza kompletne, spójne nagłówki przeglądarki — brakujące lub źle uporządkowane nagłówki to sygnał ostrzegawczy.
  • Fingerprinting JavaScript (protokół Picasso): Uruchamia wyzwania JS w przeglądarce, aby potwierdzić, że jesteś prawdziwym użytkownikiem.
  • ML behawioralne: Analizuje ponad 35 sygnałów na żądanie, przy ponad 85 000 modelach per site.
  • Ocena reputacji IP: Adresy z centrów danych są natychmiast oznaczane.
  • Weryfikacja ciasteczek: Plik cookie datadome musi być obecny i poprawny.

Jak rozpoznać, że zostałeś zablokowany, i jak to sprawdzić

Jedna z najczęstszych pułapek: dostajesz odpowiedź 200 OK, ale HTML to w rzeczywistości strona CAPTCHA, a nie dane, których potrzebujesz. Inne sygnały:

  • błędy 403 Forbidden
  • pętle przekierowań
  • treść odpowiedzi zawiera obiekt JavaScript dd albo HTML slider CAPTCHA

Zawsze sprawdzaj treść odpowiedzi, a nie tylko kod statusu. Szybki test:

if "captcha" in resp.text.lower() or "datadome" in resp.text.lower():
    print("Zablokowano! Zamiast danych otrzymano stronę CAPTCHA.")

Nagłówki i ciasteczka, które zmniejszają wykrywalność

Nie ma gwarancji, że nie zostaniesz zablokowany, ale realistyczne nagłówki i zarządzanie cookies bardzo pomagają:

session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/133.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Sec-Ch-Ua": '"Chromium";v="133", "Not-A.Brand";v="99", "Google Chrome";v="133"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Upgrade-Insecure-Requests": "1",
})

Ważne też:

  • Zachowuj cookies między żądaniami, używając requests.Session().
  • Dodawaj losowe opóźnienia (2–7 sekund) między żądaniami.
  • Symuluj ścieżkę odsyłaczy: najpierw odwiedź stronę główną, potem wyszukiwanie, potem strony produktów.
  • Przy większej skali rotacja residential proxy jest niezbędna. Adresy z centrów danych są oznaczane niemal natychmiast.

Te techniki zmniejszają wykrywalność, ale jej nie eliminują. Przy dużej skali prawdopodobnie będziesz potrzebować usługi proxy albo podejścia opartego na przeglądarce.

Konfiguracja środowiska Python do scrapowania Etsy

Zanim zaczniesz:

  • Poziom trudności: średni
  • Czas potrzebny: około 30–60 minut (konfiguracja + pierwszy scrape)
  • Czego potrzebujesz: Python 3.8+, pip, edytor kodu, przeglądarka Chrome (do inspekcji w DevTools)

Instalacja zależności

Utwórz folder projektu, skonfiguruj środowisko wirtualne i zainstaluj potrzebne biblioteki:

mkdir etsy-scraper && cd etsy-scraper
python -m venv venv
source venv/bin/activate  # W systemie Windows: venv\Scripts\activate

pip install requests beautifulsoup4 lxml pandas
  • requests — pobiera strony internetowe
  • beautifulsoup4 — parsuje HTML
  • lxml — szybszy parser HTML (opcjonalny, ale zalecany)
  • pandas — porządkuje dane i eksportuje je do CSV/Excel

Jeśli później potrzebujesz automatyzacji przeglądarki (do logowania lub stron mocno opartych na JS), zainstaluj też:

pip install selenium

Zrozum strukturę strony Etsy, zanim napiszesz kod

Oto wskazówka, która oszczędza mnóstwo czasu: Etsy osadza ustrukturyzowane dane produktów w tagach <script type="application/ld+json"> na większości stron. Te dane JSON-LD są już uporządkowane — nazwa produktu, cena, ocena, obrazy — więc nie musisz walczyć z kruchymi selektorami CSS dla każdego pola.

Otwórz dowolną stronę produktu Etsy, kliknij prawym przyciskiem, wybierz „View Page Source” i wyszukaj application/ld+json. Znajdziesz blok z @type: Product, który zawiera większość potrzebnych danych. Strony wyników wyszukiwania mają @type: ItemList.

Selektory CSS nadal są przydatne jako zapasowe rozwiązanie (dla danych, których nie ma w JSON-LD, takich jak szczegóły wysyłki czy tekst recenzji), ale JSON-LD powinien być pierwszym miejscem, od którego zaczniesz.

Krok 1: scrapowanie wyników wyszukiwania Etsy w Pythonie

Wyniki wyszukiwania są punktem startowym dla większości projektów scrapujących Etsy — niezależnie od tego, czy monitorujesz niszę, śledzisz ceny konkurencji, czy budujesz bazę produktów.

Zbuduj adres URL wyszukiwania

Adresy wyszukiwania Etsy mają taki wzór:

https://www.etsy.com/search?q={keyword}&ref=pagination&page={page_number}

Dla zapytań wielowyrazowych zakoduj spacje w URL (np. handmade+jewelry albo handmade%20jewelry). Parametr ref=pagination sprawia, że żądanie bardziej przypomina prawdziwą nawigację w przeglądarce.

Dodatkowe przydatne parametry: order (most_relevant, price_asc, price_desc, date_desc), min_price, max_price, ship_to, free_shipping=true. Każda strona zwraca 48 pozycji.

Wyślij żądanie i przeparsuj HTML

import requests
from bs4 import BeautifulSoup
import json
import time
import random

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}

def scrape_etsy_search(query, max_pages=3):
    all_products = []
    for page in range(1, max_pages + 1):
        url = f"https://www.etsy.com/search?q={query}&ref=pagination&page={page}"
        resp = requests.get(url, headers=headers, timeout=30)
        if "captcha" in resp.text.lower():
            print(f"Zablokowano na stronie {page}. Spróbuj dodać opóźnienia lub proxy.")
            break
        soup = BeautifulSoup(resp.text, "lxml")
        for script in soup.find_all("script", type="application/ld+json"):
            data = json.loads(script.string)
            if data.get("@type") == "ItemList":
                for item in data.get("itemListElement", []):
                    all_products.append({
                        "name": item.get("name"),
                        "url": item.get("url"),
                        "image": item.get("image"),
                        "price": item.get("offers", {}).get("price"),
                        "currency": item.get("offers", {}).get("priceCurrency"),
                        "position": item.get("position"),
                    })
        time.sleep(random.uniform(2, 5))
    return all_products

Wyciąganie danych ofert z JSON-LD

Tablica itemListElement daje nazwę, URL, obraz, cenę i walutę każdej oferty. Jeśli potrzebujesz także ocen gwiazdkowych lub liczby wyników (nie zawsze obecnych w JSON-LD), użyj selektorów CSS jako zapasowych:

  • karta oferty: .v2-listing-card
  • tytuł: h3.v2-listing-card__title
  • cena: span.currency-value
  • link: a.listing-link (href)

Obsługa paginacji

Przechodź przez kolejne strony i dodawaj losowe opóźnienie między żądaniami. Etsy zwykle zwraca do 20–250 stron, zależnie od zapytania.

results = scrape_etsy_search("handmade+jewelry", max_pages=5)
print(f"Scrapowano {len(results)} produktów.")

Przy scrapowaniu 5 stron zajęło mi to w testach około 20 sekund — zamiast ponad 30 minut ręcznego kopiowania i wklejania.

Krok 2: scrapowanie stron produktów Etsy w Pythonie

Gdy masz listę URL-i produktów z wyszukiwania, kolejnym krokiem jest pobranie szczegółowych danych z każdej strony oferty.

Pobierz stronę produktu

def scrape_etsy_product(url):
    resp = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(resp.text, "lxml")
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "Product":
            offers = data.get("offers", {})
            price = offers.get("price") or offers.get("lowPrice")
            rating_data = data.get("aggregateRating", {})
            return {
                "name": data.get("name"),
                "description": data.get("description", "")[:500],
                "brand": data.get("brand", {}).get("name") if isinstance(data.get("brand"), dict) else data.get("brand"),
                "category": data.get("category"),
                "price": price,
                "currency": offers.get("priceCurrency"),
                "availability": offers.get("availability"),
                "rating": rating_data.get("ratingValue"),
                "review_count": rating_data.get("reviewCount"),
                "images": data.get("image", []),
                "sku": data.get("sku"),
                "material": data.get("material"),
            }
    return None

Obsługa wariantów cenowych

Niektóre produkty mają pojedyncze offers.price. Inne (z wariantami, takimi jak rozmiar czy kolor) używają offers.lowPrice i offers.highPrice. Powyższy kod obsługuje oba przypadki, przechodząc z price na lowPrice.

Parsowanie dodatkowych pól przez selektory CSS

Dla danych, których nie ma w JSON-LD — informacji o wysyłce, opcji wariantów, pełnych szczegółów sprzedawcy — potrzebujesz selektorów CSS:

  • tytuł: h1[data-buy-box-listing-title]
  • warianty: select[data-selector-id] lub div[data-option-set]
  • wysyłka: div.wt-text-caption w pobliżu sekcji wysyłki

Kompromis jest taki, że JSON-LD jest czystszy i stabilniejszy przy zmianach układu strony. Selektory CSS są bardziej kruche, ale obejmują więcej pól.

Krok 3: scrapowanie stron sklepów Etsy w Pythonie

To sekcja, którą większość konkurencyjnych poradników pomija całkowicie — a jest prawdopodobnie najcenniejsza dla zespołów sprzedaży i analityków konkurencji.

Zbuduj URL sklepu i pobierz stronę

def scrape_etsy_shop(shop_name):
    url = f"https://www.etsy.com/shop/{shop_name}"
    resp = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(resp.text, "lxml")

    # Metadane sklepu z HTML (nie z JSON-LD)
    sales_el = soup.select_one("div.shop-sales-reviews a")
    rating_el = soup.find("input", {"name": "initial-rating"})
    location_el = soup.select_one("div.shop-location")

    shop_data = {
        "name": shop_name,
        "sales": sales_el.text.strip() if sales_el else None,
        "rating": rating_el["value"] if rating_el else None,
        "location": location_el.text.strip() if location_el else None,
    }

    # Oferty z JSON-LD
    listings = []
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "ItemList":
            for item in data.get("itemListElement", []):
                listings.append({
                    "name": item.get("name"),
                    "url": item.get("url"),
                    "price": item.get("offers", {}).get("price"),
                })
    shop_data["listings"] = listings
    return shop_data

Co można wyciągnąć ze stron sklepu

JSON-LD na stronach sklepu ma @type: ItemList — obejmuje listę produktów, ale nie metadane poziomu sklepu, takie jak liczba sprzedaży, lokalizacja czy ocena. Do tego potrzebujesz selektorów CSS:

Punkt danychSelektorUwagi
Nazwa sklepuh1 lub meta titleZwykle w tytule strony
Łączna liczba sprzedażydiv.shop-sales-reviews aTekst typu „12 345 sales”
Ocena gwiazdkowawartość input[name="initial-rating"]Liczba od 1 do 5
Lokalizacjadiv.shop-locationMiasto, kraj
Członek oddiv.shop-infoData w tekście

Dane o sklepie są wyjątkowo cenne przy budowaniu list potencjalnych klientów, benchmarkingu konkurencji lub identyfikowaniu najlepiej sprzedających się ofert w niszy.

Krok 4: scrapowanie recenzji Etsy w Pythonie

Recenzje należą do najcenniejszych — i najtrudniejszych — punktów danych na Etsy. Pełny tekst recenzji, oceny i daty nie znajdują się w początkowym HTML strony; ładują się przez wewnętrzny endpoint API.

Podejście 1: odkrycie wewnętrznego endpointu API recenzji Etsy

Otwórz stronę produktu w Chrome, uruchom DevTools (F12), przejdź do zakładki Network i przewiń do sekcji recenzji. Zobaczysz żądanie POST do czegoś w rodzaju:

https://www.etsy.com/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews

Ten endpoint zwraca fragmenty HTML zawierające karty recenzji. Aby z niego skorzystać, potrzebujesz:

  • listing_id — numerycznego identyfikatora z URL produktu
  • shop_id — wyciągniętego z HTML strony produktu przy użyciu regexu
  • csrf_nonce — wyciągniętego z tagu <meta> na stronie

Wyciąganie identyfikatorów i tokenu CSRF

import re

def get_review_params(product_url):
    resp = requests.get(product_url, headers=headers)
    html = resp.text
    listing_id = product_url.split("/")[-1].split("?")[0]
    shop_id_match = re.search(r'"shopId"\s*:\s*(\d+)', html)
    shop_id = shop_id_match.group(1) if shop_id_match else None
    soup = BeautifulSoup(html, "lxml")
    csrf_meta = soup.find("meta", {"name": "csrf_nonce"})
    csrf = csrf_meta["content"] if csrf_meta else None
    return listing_id, shop_id, csrf

Scrapowanie recenzji z paginacją

def scrape_reviews(listing_id, shop_id, csrf, max_pages=5):
    session = requests.Session()
    session.headers.update(headers)
    all_reviews = []
    for page in range(1, max_pages + 1):
        payload = {
            "specs": {
                "deep_dive_reviews": {
                    "module_path": "neu/specs/deep_dive_reviews",
                    "listing_id": listing_id,
                    "shop_id": shop_id,
                    "page": page,
                }
            }
        }
        resp = session.post(
            "https://www.etsy.com/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews",
            json=payload,
            headers={"x-csrf-token": csrf, "Content-Type": "application/json"},
        )
        data = resp.json()
        html_fragment = data.get("output", {}).get("deep_dive_reviews", "")
        review_soup = BeautifulSoup(html_fragment, "lxml")
        for card in review_soup.select("div.review-card"):
            rating_el = card.find("input", {"name": "rating"})
            text_el = card.select_one("div.wt-text-body")
            user_el = card.select_one("a[data-review-username]")
            date_el = card.select_one("p.wt-text-body-small")
            all_reviews.append({
                "rating": rating_el["value"] if rating_el else None,
                "text": text_el.text.strip() if text_el else None,
                "reviewer": user_el.text.strip() if user_el else None,
                "date": date_el.text.strip() if date_el else None,
            })
        time.sleep(random.uniform(2, 5))
    return all_reviews

Podejście 2: parsowanie recenzji z HTML (fallback)

Jeśli podejście API zawiedzie (np. z powodu problemów z tokenem CSRF), możesz przeparsować pierwszą stronę recenzji bezpośrednio z HTML strony produktu. Ograniczenie jest takie, że w statycznym HTML-u znajduje się tylko początkowy pakiet recenzji. Aby pobrać więcej, potrzebujesz API albo narzędzia do automatyzacji przeglądarki, takiego jak Selenium.

Jak pobierać dane z wymagającego logowania: scrapowanie własnego sklepu Etsy

To luka, której nie omawia żaden inny poradnik, a jest bardzo potrzebna — zwłaszcza sprzedawcom Etsy, którzy chcą wyciągać własne zamówienia, przychody i statystyki.

Problem polega na tym, że sam requests nie ma dostępu do panelu Etsy, bo nie przenosi ciasteczek sesji logowania.

Opcja 1: Selenium z ręcznym logowaniem i przechwyceniem cookies

Użyj Selenium, aby otworzyć przeglądarkę, zalogować się ręcznie (albo zautomatyzować logowanie), a potem kontynuować scrapowanie już jako uwierzytelniony użytkownik:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.etsy.com/signin")
# Zaloguj się ręcznie w oknie przeglądarki, a potem:
input("Naciśnij Enter po zalogowaniu...")

cookies = driver.get_cookies()
# Teraz używaj driver.get() do przechodzenia po stronach panelu i scrapowania

Możesz też zapisać cookies z sesji Selenium i ponownie użyć ich z requests.Session() dla szybszego, lżejszego scrapowania po pierwszym logowaniu.

Opcja 2: eksport cookies z przeglądarki do użycia z Requests

Użyj rozszerzenia do przeglądarki (takiego jak „EditThisCookie”), aby wyeksportować aktywne cookies sesji Etsy, a następnie wczytaj je do sesji Requests:

import requests

session = requests.Session()
# Dodaj cookies wyeksportowane z przeglądarki
session.cookies.set("uaid", "YOUR_UAID_VALUE", domain=".etsy.com")
session.cookies.set("user_prefs", "YOUR_USER_PREFS_VALUE", domain=".etsy.com")
# ... dodaj inne cookies sesji w razie potrzeby

resp = session.get("https://www.etsy.com/your/orders", headers=headers)

Najprostsza droga: tryb scrapowania w przeglądarce Thunderbit

Ponieważ Thunderbit działa wewnątrz Twojej przeglądarki Chrome, automatycznie dziedziczy aktywną sesję Etsy. Bez kodu uwierzytelniającego, bez eksportu cookies — po prostu przejdź do swojego panelu Etsy i scrapuj. To naprawdę przydatne do wyciągania zamówień, przychodów, statystyk i innych danych dostępnych tylko dla sprzedawcy, bez żadnego skryptowania.

Scrapuj swój panel Etsy z AI

Eksport i wykorzystanie danych z Etsy

Zapis do CSV lub JSON

import pandas as pd

df = pd.DataFrame(results)
df.to_csv("etsy_products.csv", index=False, encoding="utf-8")
df.to_json("etsy_products.json", orient="records", indent=2)

Dobre praktyki: dodawaj daty w nazwach plików, używaj kodowania UTF-8 i obsługuj znaki specjalne w nazwach produktów (sprzedawcy Etsy uwielbiają emotikony i znaki diakrytyczne).

Eksport do Google Sheets, Airtable lub Notion

Dla użytkowników Pythona biblioteki takie jak gspread (Google Sheets) lub API Airtable pozwalają wysyłać dane programowo. Ale jeśli korzystasz z Thunderbit, wszystkie eksporty — do Google Sheets, Excela, Airtable i Notion — są darmowe i dostępne jednym kliknięciem. Bez kluczy API, bez konfiguracji OAuth.

Pomiń kod: jak scrapować Etsy z Thunderbit (alternatywa no-code)

Nie każdy chce pisać skrypty w Pythonie, utrzymywać konfiguracje proxy czy debugować selektory CSS o 2 w nocy. Jeśli to brzmi jak Ty, oto jak pobrać dane z Etsy za pomocą Thunderbit.

Zainstaluj rozszerzenie Thunderbit do Chrome

Wejdź do Chrome Web Store i zainstaluj Thunderbit. Załóż darmowe konto — darmowy plan daje 6 stron/miesiąc, a wszystkie eksporty są bezpłatne.

Użyj AI Suggest Fields na dowolnej stronie Etsy

Przejdź do strony wyszukiwania, produktu lub sklepu Etsy. Kliknij „AI Suggest Fields” na pasku bocznym Thunderbit. AI przeanalizuje stronę i zaproponuje kolumny — nazwę produktu, cenę, ocenę, obrazy, nazwę sklepu, tagi, informacje o wysyłce. W razie potrzeby dostosuj lub dodaj kolumny.

Kliknij Scrape i wyeksportuj dane

Kliknij „Scrape”, aby pobrać dane z bieżącej strony. W przypadku wyników wielostronicowych użyj scrapowania z paginacją Thunderbit. Aby wzbogacić listę URL-i produktów o szczegóły z każdej strony produktu (opisy, recenzje, wysyłka), użyj scrapowania podstron — Thunderbit odwiedzi każdy link i automatycznie pobierze dodatkowe dane.

Eksport do Excela, Google Sheets, Airtable lub Notion — wszystko bezpłatnie.

Kiedy Thunderbit wygrywa z Pythonem przy scrapowaniu Etsy

  • Nie trzeba ustawiać proxy ani pisać kodu anty-bot. Thunderbit działa w Twojej prawdziwej przeglądarce Chrome, więc dziedziczy sesję i dla DataDome wygląda jak zwykły użytkownik.
  • AI automatycznie dopasowuje się do zmian układu strony. Nie ma kruchych selektorów, które trzeba poprawiać po aktualizacji frontendu Etsy.
  • Świetne do jednorazowych badań, analizy konkurencji lub pracy dla osób nietechnicznych. Jeśli potrzebujesz tylko szybkiego zbioru danych, nie potrzebujesz środowiska Python.
  • Scrapowanie podstron pozwala wzbogacić listę URL-i produktów o szczegółowe dane bez pisania zagnieżdżonych pętli.

Jeśli chcesz zobaczyć to w praktyce, sprawdź kanał Thunderbit na YouTube.

Porównanie kosztów Python vs. Thunderbit przez 6 miesięcy

CzynnikPython DIYThunderbit
Czas konfiguracji8–20 godzinPoniżej 5 minut
Koszt 6 miesięcy (w tym praca, proxy)2 720–9 450 USD90–228 USD
Miesięczna konserwacja4–10+ godzin (aktualizacje selektorów = 80%+ narzutu)0–1 godzina
Obsługa anty-botResidential proxy przy 85× normalnym koszcie kredytuOparte na przeglądarce, natywnie omija DataDome
Jakość danychWysoka (przy wysiłku)Wysoka (napędzana AI)

Nie twierdzę, że Python to zły wybór — jeśli potrzebujesz pełnej kontroli, własnej logiki lub integracji z większym pipeline’em, kod nadal jest królem. Ale dla większości użytkowników biznesowych, którzy po prostu potrzebują danych z Etsy, rachunek ROI przemawia za narzędziem no-code.

Wskazówki prawne i etyczne dotyczące scrapowania Etsy

Przy każdym wpisie o scrapowaniu pytają mnie o legalność, więc krótka wersja brzmi:

  • Warunki korzystania z Etsy wyraźnie zabraniają automatycznego dostępu. Jednocześnie Etsy opiera się głównie na egzekwowaniu technicznym (DataDome), a nie na procesach sądowych — nie są znane pozwy specyficzne dla Etsy wymierzone w scraperów.
  • Scrapuj tylko publicznie dostępne dane. Nie obchodź autoryzacji i nie uzyskuj dostępu do prywatnych paneli sprzedawcy, które nie należą do Ciebie.
  • Stosuj rozsądne tempo żądań. Opóźnienia 2–7 sekund między żądaniami i bez „młócenia” serwerów Etsy.
  • Szanuj robots.txt. Etsy dopuszcza strony wyszukiwania, ale ogranicza niektóre ścieżki.
  • Obsługuj dane osobowe odpowiedzialnie zgodnie z przepisami o prywatności, takimi jak RODO/GDPR.
  • Skonsultuj się z prawnikiem przy projektach scrapowania na skalę komercyjną.

Więcej kontekstu znajdziesz w naszym wpisie o prawnych konsekwencjach web scrapingu — w tym Meta v. Bright Data (2024), gdzie uznano legalność pobierania publicznych danych.

Podsumowanie: najważniejsze wnioski

Omówiliśmy tu naprawdę sporo. Oto najważniejsze rzeczy, z którymi chciałbym, żebyś wyszedł:

  • Ustrukturyzowane dane JSON-LD z Etsy sprawiają, że wyciąganie danych jest prostsze niż parsowanie surowego HTML-a w większości przypadków.
  • DataDome to realna przeszkoda — przy scrapowaniu w Pythonie na dużą skalę używaj poprawnych nagłówków, opóźnień, zarządzania cookies i residential proxy.
  • API Etsy jest ograniczone. Jeśli potrzebujesz recenzji, sklepów konkurencji albo analizy między sprzedawcami, scraping to praktyczna droga.
  • Thunderbit oferuje alternatywę no-code, która natywnie obsługuje anty-bot i uwierzytelnianie — warto wypróbować, jeśli chcesz dane z Etsy bez utrzymywania skryptów.
  • Scrapuj zawsze odpowiedzialnie i szanuj warunki Etsy.

Jeśli chcesz zacząć bez pisania kodu, wypróbuj Thunderbit za darmo. Albo użyj kodu Pythona z tego poradnika, aby zbudować własny scraper — i niech Twoje selektory nigdy nie psują się w piątkowe popołudnie.

Po więcej poradników o scrapowaniu zajrzyj do naszego przewodnika po scraperze Etsy oraz zestawienia najlepszych AI web scraperów.

Wypróbuj Thunderbit, aby szybciej scrapować dane z Etsy Get Started Free

FAQ

1. Czy scrapowanie Etsy w Pythonie jest legalne?

Scrapowanie publicznie dostępnych danych jest ogólnie dopuszczalne na gruncie nowszych orzeczeń sądowych (np. Meta v. Bright Data, hiQ v. LinkedIn). Jednak warunki korzystania z Etsy zabraniają automatycznego dostępu, więc zawsze przed scrapowaniem przejrzyj ich ToS i robots.txt. W przypadku użycia na dużą skalę lub komercyjnego skonsultuj się z prawnikiem.

2. Czy mogę scrapować Etsy bez blokad?

Etsy korzysta z DataDome, jednego z najtrudniejszych systemów anty-botowych. Realistyczne nagłówki, opóźnienia między żądaniami, utrzymywanie cookies i rotacja residential proxy pomagają ograniczyć liczbę blokad. Podejście Thunderbit oparte na przeglądarce omija większość wykrywania, ponieważ działa w Twojej prawdziwej sesji Chrome.

3. Czy Etsy ma API, którego mogę użyć zamiast scrapowania?

Tak — Etsy oferuje API v3, ale jest ono głównie ograniczone do danych z Twojego własnego sklepu i nie zapewnia solidnego dostępu do recenzji. Większość zastosowań związanych z analizą konkurencji i sklepów między sobą wymaga scrapowania.

4. Jakich bibliotek Pythona potrzebuję do scrapowania Etsy?

Minimum: requests, beautifulsoup4, pandas (do eksportu) i json (wbudowany). Dla stron mocno opartych na JS lub wymagających logowania dodaj selenium. Do szybszego parsowania HTML użyj lxml.

5. Jak dokładnie scrapować recenzje Etsy?

Recenzje Etsy ładują się przez wewnętrzny endpoint API (/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews). Musisz wyciągnąć listing ID, shop ID i token CSRF ze strony produktu, a potem wysłać POST do endpointu z paginacją. Jako alternatywę możesz przeparsować pierwszy pakiet recenzji z HTML strony produktu — obie metody są w tym poradniku opisane krok po kroku.

Dowiedz się więcej

Shuai Guan
Shuai Guan
CEO w Thunderbit | Ekspert ds. automatyzacji danych AI Shuai Guan jest CEO Thunderbit oraz absolwentem wydziału inżynierii University of Michigan. Czerpiąc z niemal dekady doświadczenia w branży technologicznej i architekturze SaaS, specjalizuje się w przekuwaniu złożonych modeli AI w praktyczne, niewymagające kodowania narzędzia do استخراج danych. Na tym blogu dzieli się szczerymi, sprawdzonymi w boju spostrzeżeniami na temat web scrapingu i strategii automatyzacji, które pomogą Ci tworzyć mądrzejsze, oparte na danych procesy pracy. Gdy nie optymalizuje przepływów danych, z tą samą dbałością o szczegóły oddaje się swojej pasji do fotografii.
Spis treści

Zbierz dane ze strony, po prostu o to prosząc

Powiedz, czego potrzebujesz, prostym angielskim. A najlepiej: nie mów nic.

Wypróbuj Thunderbit darmowe
Wyodrębniaj dane dzięki AI
Łatwo przenoś dane do Google Sheets, Airtable lub Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week