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.

| Przykład użycia | Co scrapujesz | Kto zyskuje | Wpływ na biznes |
|---|---|---|---|
| Analiza cen konkurencji | Wyniki wyszukiwania + ceny produktów | Operacje e-commerce, sprzedawcy | Dynamiczne ceny mogą średnio zwiększyć przychody o 5–22% |
| Odkrywanie nisz i trendów | Wyniki wyszukiwania, popularne oferty | Założyciele, analitycy | Wcześnie wyłapuj trendujące nisze (np. „preppy pajamas” zanotowały wzrost wyszukiwań o +1 112%) |
| Rozwój i ulepszanie produktu | Recenzje, szczegóły produktu | Zespoły produktowe | Jedna marka naczyń kuchennych odzyskała pozycję #1 Best Seller w 60 dni, korzystając z danych o sentymencie recenzji |
| SEO i badanie słów kluczowych | Wyniki wyszukiwania, tytuły/tagi produktów | Zespoły marketingowe | Wskazuj słowa kluczowe o wysokim popycie i niskiej konkurencji |
| Benchmarking sprzedawców | Strony sklepów, liczby sprzedaży | Zespoły sprzedaży, analitycy | Buduj listy potencjalnych klientów już od 0,01–0,10 USD za rekord zamiast kupować gotowe listy |
| Monitorowanie zapasów i stanów magazynowych | Dostępność produktów | Operacje e-commerce | Szybciej 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
| Kryterium | Oficjalne API Etsy | Web scraping w Pythonie | Thunderbit (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 boty | Brak | WYSOKIE (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ście | Najlepsze dla | Krzywa nauki | Obsługuje JS? | Obsługa anty-bot | Koszt |
|---|---|---|---|---|---|
| Requests + BeautifulSoup | Deweloperzy chcący pełnej kontroli | Średnia | ❌ | Ręczna (nagłówki, proxy) | Darmowe + koszty proxy |
| Selenium / Playwright | Strony mocno oparte na JS, przepływy logowania | Wysoka | ✅ | Częściowa (odcisk przeglądarki) | Darmowe + koszty proxy |
| Usługi proxy API | Skala + obejście anty-bot | Średnia | ✅ (przez API) | ✅ Wbudowane | od 49 USD/mies. |
| Thunderbit (no-code) | Osoby nietechniczne, szybkie pobieranie | Bardzo 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.

Czym jest DataDome i jak działa?
DataDome nie sprawdza tylko adresu IP. Działa wielowarstwowo:
- Odcisk TLS (JA3): Biblioteka
requestsw 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
datadomemusi 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
ddalbo 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]lubdiv[data-option-set] - wysyłka:
div.wt-text-captionw 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 danych | Selektor | Uwagi |
|---|---|---|
| Nazwa sklepu | h1 lub meta title | Zwykle w tytule strony |
| Łączna liczba sprzedaży | div.shop-sales-reviews a | Tekst typu „12 345 sales” |
| Ocena gwiazdkowa | wartość input[name="initial-rating"] | Liczba od 1 do 5 |
| Lokalizacja | div.shop-location | Miasto, kraj |
| Członek od | div.shop-info | Data 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.
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
| Czynnik | Python DIY | Thunderbit |
|---|---|---|
| Czas konfiguracji | 8–20 godzin | Poniżej 5 minut |
| Koszt 6 miesięcy (w tym praca, proxy) | 2 720–9 450 USD | 90–228 USD |
| Miesięczna konserwacja | 4–10+ godzin (aktualizacje selektorów = 80%+ narzutu) | 0–1 godzina |
| Obsługa anty-bot | Residential proxy przy 85× normalnym koszcie kredytu | Oparte na przeglądarce, natywnie omija DataDome |
| Jakość danych | Wysoka (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


