Mój scraper recenzji Amazon działał bez zarzutu przez sześć tygodni — aż pewnego ranka zwrócił 200 OK i stronę pełną pustki. Bez błędu, bez CAPTCHA, po prostu puste HTML tam, gdzie wcześniej znajdowały się setki recenzji.
Jeśli brzmi to znajomo, nie jesteś sam. Pod koniec 2025 roku Amazon zaczął blokować pełne strony z recenzjami za ścianą logowania, a ogromna liczba skryptów scrapingowych w Pythonie przestała działać z dnia na dzień. Ostatnie miesiące spędziłem w Thunderbit, rozwiązując ten problem z dwóch stron — budując nasz AI web scraper i jednocześnie utrzymując własny pipeline do recenzji w Pythonie — więc uznałem, że pora napisać poradnik, którego sam chciałbym mieć, gdy mój skrypt po raz pierwszy przestał działać. Ten artykuł opisuje sprawdzone podejście: uwierzytelnianie oparte na ciasteczkach, stabilne selektory odporne na zaciemnianie CSS przez Amazon, obejścia limitu 10 stron paginacji, zabezpieczenia anty-bot oraz bonusową sekcję o analizie sentymentu, która zamienia surowy tekst recenzji w realne wnioski biznesowe. A jeśli w połowie lektury pomyślisz: „wolałbym nie utrzymywać całego tego kodu”, pokażę Ci, jak Thunderbit robi to samo w około dwie minuty — bez ani jednej linijki Pythona.
Czym jest scrapowanie recenzji Amazon i dlaczego ma znaczenie?
Scrapowanie recenzji Amazon polega na programowym pobieraniu danych o opiniach klientów — ocen gwiazdkowych, treści recenzji, nazw autorów, dat, oznaczeń zakupu zweryfikowanego — ze stron produktowych Amazon. Ponieważ Amazon usunął treść recenzji ze swojego Product Advertising API już w 2010 roku i nigdy jej nie przywrócił, web scraping jest jedyną programową drogą do tych danych.
Liczby potwierdzają, że warto. 95% kupujących czyta recenzje przed zakupem, a 94% wskazuje Amazon jako główne źródło opinii o produktach. Pokazanie zaledwie 5 recenzji na stronie produktu może zwiększyć konwersję o 270%. Firmy, które systematycznie analizują sentyment w recenzjach, notują nawet o 15% wyższą retencję klientów. To nie jest abstrakcyjna data science — to wywiad konkurencyjny, sygnały do ulepszania produktu i język marketingowy, wszystko zapisane zwykłym tekstem na serwerach Amazon.
Dlaczego warto scrape’ować recenzje Amazon w Pythonie
Python nadal jest najpopularniejszym narzędziem do tego typu zadań. To najbardziej pożądany język według Stack Overflow Developer Survey 2024, a jego ekosystem — requests, BeautifulSoup, pandas, Scrapy — sprawia, że web scraping jest dostępny nawet dla osób, które nie pracują na co dzień jako programiści.
Różne zespoły wykorzystują te dane na różne sposoby:
| Zespół | Przypadek użycia | Co wyciągają |
|---|---|---|
| Produkt / R&D | Wykrywanie powtarzających się skarg, priorytetyzacja poprawek | Treść recenzji 1–2-gwiazdkowych, częstotliwość słów kluczowych |
| Sprzedaż | Monitorowanie sentymentu wobec produktów konkurencji | Oceny, trendy wolumenu recenzji |
| Marketing | Pozyskiwanie języka klientów do copy reklamowego | Pozytywne frazy z recenzji, wzmianki o funkcjach |
| Ecommerce Ops | Śledzenie sentymentu własnych produktów w czasie | Rozkład ocen, udział zakupów zweryfikowanych |
| Badania rynku | Porównywanie liderów kategorii pod kątem funkcji | Zbiory recenzji dla wielu ASIN-ów |
Jedna marka naczyń kuchennych przeanalizowała negatywne recenzje i odkryła, że 22% z nich wskazywało, iż „powłoka nieprzywierająca się ściera”, zmieniła recepturę produktu i odzyskała pozycję #1 Best Seller w ciągu 60 dni. Firma produkująca opaski do trackerów fitness wyłapała w recenzjach „podrażnienia paskiem”, zidentyfikowała problem z alergią na lateks, wypuściła wersję hipoalergiczną i obniżyła liczbę zwrotów o 40%. To właśnie taki zwrot z inwestycji sprawia, że wysiłek techniczny się opłaca.
Ściana logowania: dlaczego Twój scraper recenzji Amazon przestał działać
14 listopada 2024 roku Amazon zaczął wymagać logowania, aby zobaczyć pełną stronę recenzji produktu. Zmianę potwierdzono na forach społeczności oraz na blogach dostawców narzędzi do scrapingu. Jeśli wejdziesz na /product-reviews/{ASIN}/ w oknie incognito, zamiast danych o recenzjach zostaniesz przekierowany na stronę logowania.

Objawy są podstępne: skrypt dostaje odpowiedź 200 OK, ale treść HTML zawiera formularz logowania (name="email", id="ap_password") zamiast recenzji. Żadnego kodu błędu. Żadnej CAPTCHA. Po prostu… nic użytecznego.
Amazon zrobił to ze względów anty-botowych i regulacyjnych związanych z regionami. Egzekwowanie tego mechanizmu jest niespójne — czasami świeże okno przeglądarki pokaże kilka recenzji, zanim pojawi się blokada, szczególnie na pierwszej stronie — ale w przypadku scrapera działającego na większą skalę należy założyć, że blokada jest zawsze aktywna.
Poszczególne domeny krajowe Amazon (.de, .co.uk, .co.jp) wymuszają ten mechanizm niezależnie. Jak napisał jeden z użytkowników forum: „dla każdego kraju potrzebne jest osobne logowanie”. Twoje ciasteczka z .com nie zadziałają na .co.uk.
Recenzje wyróżnione vs. pełna lista recenzji: co nadal można pobrać bez logowania
Strony produktów Amazon (URL /dp/{ASIN}/`) nadal pokazują około 8 „wyróżnionych recenzji” bez uwierzytelnienia. Są one wybierane przez algorytm Amazon i przydają się do szybkiego sprawdzenia nastroju, ale nie da się ich sortować, filtrować ani stronicować.
Pełne strony recenzji (/product-reviews/{ASIN}/) — z sortowaniem od najnowszych, filtrowaniem po ocenie gwiazdkowej i paginacją obejmującą setki opinii — wymagają logowania.
Jeśli potrzebujesz tylko kilku recenzji do szybkiego „pulse check”, scrapuj stronę produktu. Jeśli chcesz setki albo tysiące, musisz obsłużyć uwierzytelnianie.
Czego potrzebujesz przed startem: konfiguracja Pythona i bibliotek
Zanim napiszemy kod, najpierw środowisko:
- Poziom trudności: średnio zaawansowany (swoboda w Pythonie, podstawowa znajomość HTML)
- Czas potrzebny: ok. 45 minut dla pełnego pipeline’u; ok. 10 minut dla prostego scrapingu
- Czego potrzebujesz: Python 3.8+, przeglądarka Chrome, ważne konto Amazon
Zainstaluj podstawowe biblioteki:
pip install requests beautifulsoup4 lxml pandas textblob
Opcjonalnie (do bardziej zaawansowanej analizy sentymentu):
pip install transformers torch
Czym jest ASIN? To 10-znakowy identyfikator produktu w Amazon. Znajdziesz go w każdym adresie URL produktu — na przykład w amazon.com/dp/B0BCNKKZ91 ASIN to B0BCNKKZ91. To właśnie ten identyfikator wykorzystasz w adresie recenzji.
Krok 1: Przejście przez ścianę logowania dzięki uwierzytelnianiu opartemu na ciasteczkach
Najbardziej niezawodne podejście to zalogowanie się do Amazon w przeglądarce, skopiowanie ciasteczek sesyjnych i wstrzyknięcie ich do requests.Session() w Pythonie. Dzięki temu nie uruchamiasz CAPTCHA ani SMS-owego 2FA, które często psują automatyczne logowanie przez Selenium.
Potrzebujesz tych siedmiu ciasteczek:
| Nazwa ciasteczka | Przeznaczenie |
|---|---|
session-id | Rotujący identyfikator sesji |
session-id-time | Znacznik czasu sesji |
session-token | Rotujący token sesji |
ubid-main | Identyfikator przeglądania użytkownika |
at-main | Główny token uwierzytelniający |
sess-at-main | Uwierzytelnienie przypisane do sesji |
x-main | Identyfikator powiązany z e-mailem użytkownika |
Jak wyciągnąć ciasteczka z Chrome DevTools
- Zaloguj się do amazon.com w Chrome
- Otwórz DevTools (F12 lub kliknij prawym przyciskiem → Zbadaj)
- Przejdź do Application → Storage → Cookies →
https://www.amazon.com - Znajdź w tabeli każdą nazwę ciasteczka i skopiuj jej wartość
- Zapisz je jako ciąg oddzielony średnikami dla Pythona
Skonfiguruj sesję tak:
import requests
session = requests.Session()
# Wklej tutaj wartości swoich ciasteczek
cookies = {
"session-id": "YOUR_SESSION_ID",
"session-id-time": "YOUR_SESSION_ID_TIME",
"session-token": "YOUR_SESSION_TOKEN",
"ubid-main": "YOUR_UBID_MAIN",
"at-main": "YOUR_AT_MAIN",
"sess-at-main": "YOUR_SESS_AT_MAIN",
"x-main": "YOUR_X_MAIN",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
}
session.cookies.update(cookies)
session.headers.update(headers)
Ważne: używaj tego samego obiektu session we wszystkich żądaniach. Dzięki temu ciasteczka pozostają spójne, a sesja bardziej przypomina realną przeglądarkę. Ciasteczka zwykle działają od kilku dni do kilku tygodni przy intensywnym scrapingu, ale jeśli znów zaczniesz dostawać przekierowania do logowania, odśwież je w przeglądarce.
W przypadku rynków spoza .com nazwy ciasteczek zmieniają się nieco — amazon.de używa at-acbde zamiast at-main, amazon.co.uk używa at-acbuk itd. Każdy rynek wymaga własnej, niezależnej sesji.
Krok 2: Zbudowanie żądania i parsowanie HTML recenzji za pomocą BeautifulSoup
Adres URL recenzji Amazon wygląda tak:
https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1
Główna funkcja:
from bs4 import BeautifulSoup
import time, random
def get_soup(session, url):
time.sleep(random.uniform(2, 5)) # Uprzejma pauza
response = session.get(url, timeout=15)
# Wykrycie ściany logowania
if "ap_email" in response.text or "Amazon Sign-In" in response.text:
raise Exception("Wykryto ścianę logowania — odśwież ciasteczka")
if response.status_code != 200:
raise Exception(f"HTTP {response.status_code}")
return BeautifulSoup(response.text, "lxml")
Pomaga też mały trik: zanim wejdziesz na stronę recenzji, najpierw odwiedź stronę produktu. To buduje naturalny wzorzec przeglądania w sesji.
# Najpierw strona produktu (symuluje normalne przeglądanie)
product_url = f"https://www.amazon.com/dp/{asin}"
session.get(product_url, timeout=15)
time.sleep(random.uniform(1, 3))
# Potem strona recenzji
reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
soup = get_soup(session, reviews_url)
Krok 3: Użyj stabilnych selektorów do pobierania danych o recenzjach (nie opieraj się na klasach CSS)
To miejsce, w którym większość poradników z lat 2022–2023 się rozsypuje. Amazon zaciemnia nazwy klas CSS — zmieniają się one okresowo, a jak napisał jeden sfrustrowany programista na forum: „żaden z nich nie miał nawet jednego wspólnego wzorca dla nazw klas spanów”.
Rozwiązanie: Amazon używa atrybutów data-hook na elementach recenzji i są one zaskakująco stabilne. To semantyczne identyfikatory, od których zależy front-end Amazona, więc nie są losowo zmieniane.
| Pole recenzji | Stabilny selektor (data-hook) | Kruchy selektor (class) |
|---|---|---|
| Treść recenzji | [data-hook="review-body"] | .review-text-content (zmienia się) |
| Ocena gwiazdkowa | [data-hook="review-star-rating"] | .a-icon-alt (niejednoznaczny) |
| Tytuł recenzji | [data-hook="review-title"] | .review-title (czasem działa) |
| Nazwa autora | span.a-profile-name | Relatywnie stabilna |
| Data recenzji | [data-hook="review-date"] | .review-date (zależna od regionu) |
| Zakup zweryfikowany | [data-hook="avp-badge"] | span.a-size-mini |
Kod ekstrakcji z użyciem selektorów data-hook:
import re
def extract_reviews(soup):
reviews = []
review_divs = soup.select('[data-hook="review"]')
for div in review_divs:
# Ocena gwiazdkowa
rating_el = div.select_one('[data-hook="review-star-rating"]')
rating = None
if rating_el:
rating_text = rating_el.get_text(strip=True)
match = re.search(r'(\d\.?\d?)', rating_text)
if match:
rating = float(match.group(1))
# Tytuł
title_el = div.select_one('[data-hook="review-title"]')
title = title_el.get_text(strip=True) if title_el else ""
# Treść
body_el = div.select_one('[data-hook="review-body"]')
body = body_el.get_text(strip=True) if body_el else ""
# Autor
author_el = div.select_one('span.a-profile-name')
author = author_el.get_text(strip=True) if author_el else ""
# Data i kraj
date_el = div.select_one('[data-hook="review-date"]')
date_text = date_el.get_text(strip=True) if date_el else ""
# Format: "Reviewed in the United States on January 15, 2025"
country_match = re.search(r'Reviewed in (.+?) on', date_text)
date_match = re.search(r'on (.+)$', date_text)
country = country_match.group(1) if country_match else ""
date = date_match.group(1) if date_match else ""
# Zakup zweryfikowany
verified_el = div.select_one('[data-hook="avp-badge"]')
verified = bool(verified_el)
reviews.append({
"author": author,
"rating": rating,
"title": title,
"content": body,
"date": date,
"country": country,
"verified": verified,
})
return reviews
Od miesięcy testuję ten zestaw selektorów na wielu ASIN-ach i atrybuty data-hook ani razu się nie zmieniły. Klas CSS nie można powiedzieć tego samego — w tym samym czasie rotowały co najmniej dwa razy.
Krok 4: Obsłuż paginację i limit 10 stron Amazon
Amazon ogranicza parametr pageNumber do 10 stron po 10 recenzji każda — to twardy pułap około 100 recenzji dla jednej kombinacji filtra. Przycisk „Next page” po stronie 10 po prostu znika.
Podstawowa pętla paginacji:
all_reviews = []
for page in range(1, 11):
url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break # Na tej stronie nie ma już więcej recenzji
all_reviews.extend(page_reviews)
print(f"Strona {page}: {len(page_reviews)} recenzji")
Jak pobrać więcej niż 10 stron recenzji Amazon
Sposobem obejścia jest bucketing filtrów. Każda kombinacja filterByStar i sortBy ma własne niezależne okno 10 stron.
Wartości filtra gwiazdek: one_star, two_star, three_star, four_star, five_star
Wartości sortowania: recent, helpful (domyślne)
Łącząc wszystkie 5 filtrów gwiazdkowych × 2 kolejności sortowania, możesz uzyskać dostęp do nawet 100 stron, czyli 1 000 recenzji na produkt — a w przypadku produktów z nierównym rozkładem ocen często zbliżysz się do pełnego zestawu opinii.
star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
sort_orders = ["recent", "helpful"]
all_reviews = []
seen_titles = set() # Prosta deduplikacja
for star in star_filters:
for sort in sort_orders:
for page in range(1, 11):
url = (
f"https://www.amazon.com/product-reviews/{asin}"
f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
)
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break
for review in page_reviews:
# Deduplikacja po kombinacji tytułu + autora
key = (review["title"], review["author"])
if key not in seen_titles:
seen_titles.add(key)
all_reviews.append(review)
print(f"[{star}/{sort}] Strona {page}: {len(page_reviews)} recenzji")
print(f"Łącznie unikalnych recenzji: {len(all_reviews)}")
Między bucketami będzie nakładanie się wyników, więc deduplikacja jest konieczna. Używam kombinacji tytułu recenzji + nazwy autora jako szybkiego klucza — nie jest to idealne, ale wyłapuje zdecydowaną większość duplikatów.
Krok 5: Omiń zabezpieczenia anty-botowe (rotacja, throttling, retry)
Amazon korzysta z AWS WAF Bot Control i działa on coraz agresywniej. Pojedyncze środki zaradcze (sama rotacja User-Agentów, same opóźnienia) już nie wystarczają.
| Technika | Implementacja |
|---|---|
| Rotacja User-Agentów | Losowy wybór spośród 10+ prawdziwych stringów przeglądarek |
| Exponential backoff | Opóźnienia ponownych prób 2s → 4s → 8s przy 503 |
| Throttling żądań | random.uniform(2, 5) sekund między stronami |
| Rotacja proxy | Przełączanie się między proxy residential |
| Odcisk sesji | Spójne ciasteczka + nagłówki dla jednej sesji |
| Imponowanie TLS | Użycie curl_cffi zamiast standardowego requests w produkcji |
Gotowy do produkcji wrapper retry:
import time, random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
]
def scrape_with_retries(session, url, max_retries=3):
for attempt in range(max_retries):
try:
session.headers["User-Agent"] = random.choice(USER_AGENTS)
time.sleep(random.uniform(2, 5))
response = session.get(url, timeout=15)
# Wykrywanie blokad
if "validateCaptcha" in response.url or "Robot Check" in response.text:
wait = (2 ** attempt) * 5
print(f"Wykryto CAPTCHA. Czekam {wait}s...")
time.sleep(wait)
continue
if response.status_code in (429, 503):
wait = (2 ** attempt) * 2
print(f"Limit zapytań ({response.status_code}). Czekam {wait}s...")
time.sleep(wait)
continue
if "ap_email" in response.text:
raise Exception("Ściana logowania — ciasteczka wygasły")
return BeautifulSoup(response.text, "lxml")
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"Próba {attempt + 1} nie powiodła się: {e}")
return None
Kilka słów o proxy: Amazon blokuje znane zakresy adresów IP centrów danych (AWS, GCP, Azure, DigitalOcean) na poziomie sieci. Jeśli scrape’ujesz więcej niż kilkaset stron, proxy residential są praktycznie obowiązkowe — przygotuj się na koszt rzędu 50–200+ USD miesięcznie, zależnie od skali. W mniejszych projektach (poniżej 100 żądań dziennie) często wystarcza ostrożne spowolnienie pracy z domowego IP.
Amazon analizuje też fingerprint TLS. Standardowy requests w Pythonie ma dobrze znany hash JA3, który WAF-y często blokują z góry. W scraperach produkcyjnych warto rozważyć curl_cffi, który emuluje prawdziwy stos TLS przeglądarki. Przy skali poradnikowej (kilkaset stron) requests z dobrymi nagłówkami zwykle wystarcza.
Krok 6: Eksportuj pobrane recenzje Amazon do CSV lub Excela
Gdy zbierzesz recenzje, zapisanie ich do użytecznego formatu jest proste dzięki pandas:
import pandas as pd
df = pd.DataFrame(all_reviews)
df.to_csv("amazon_reviews.csv", index=False)
print(f"Wyeksportowano {len(df)} recenzji do amazon_reviews.csv")
Przykładowy wynik:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | Najlepszy zakup w tym roku | Bateria trzyma cały dzień, ekran jest przepiękny... | January 15, 2025 | the United States | True |
| Mike T. | 2.0 | Rozczarowanie po 2 tygodniach | Port ładowania przestał działać... | February 3, 2025 | the United States | True |
| Priya K. | 4.0 | Świetny stosunek jakości do ceny | Robi wszystko, czego potrzebuję, tylko lekkie opóźnienia przy ciężkich aplikacjach... | March 10, 2025 | the United States | False |
Eksport do Excela: df.to_excel("amazon_reviews.xlsx", index=False) (wymaga openpyxl).
Do Google Sheets biblioteka gspread działa, ale wymaga 8+ kroków konfiguracji Google Cloud — utworzenia projektu, włączenia dwóch API, wygenerowania danych konta usługi, udostępnienia arkusza. Jeśli brzmi to jak więcej konfiguracji niż samo scrapowanie, to masz rację. (To jeden z tych momentów, gdy narzędzie takie jak Thunderbit, które eksportuje do Google Sheets jednym kliknięciem, zaczyna wyglądać naprawdę atrakcyjnie.)
Bonus: Dodaj analizę sentymentu do zebranych recenzji w 5 liniach Pythona
Większość poradników o scrapingu kończy się na eksporcie CSV. Ale dopiero scoring sentymentu zamienia surowe dane w decyzje biznesowe.
Najszybsza baza to TextBlob:
from textblob import TextBlob
df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
Dostajesz wynik polaryzacji od -1.0 (bardzo negatywny) do +1.0 (bardzo pozytywny) dla każdej recenzji. Przykładowy wynik:
| content (skrócone) | rating | sentiment |
|---|---|---|
| "Bateria trzyma cały dzień, ekran jest przepiękny..." | 5.0 | 0.65 |
| "Port ładowania przestał działać po..." | 2.0 | -0.40 |
| "Robi wszystko, czego potrzebuję, drobne lagi przy..." | 4.0 | 0.25 |
| "Totalny śmieć. Zwróciłem od razu." | 1.0 | -0.75 |
| "Jest okej. Nic specjalnego, ale działa." | 3.0 | 0.10 |
Najciekawsze są rozbieżności — recenzja 3-gwiazdkowa z pozytywnym językiem albo 5-gwiazdkowa z negatywnymi sformułowaniami. Takie przypadki często ujawniają niuanse opinii klientów, których same gwiazdki nie pokazują.

W przypadku jakości produkcyjnej poleca się Hugging Face Transformers. VADER był trenowany na tweetach, a nie na recenzjach produktów, a modele transformer osiągają ponad 98% dokładności w klasyfikacji recenzji w porównaniu z narzędziami leksykalnymi. Model nlptown/bert-base-multilingual-uncased-sentiment potrafi nawet przewidzieć bezpośrednio ocenę 1–5 gwiazdek:
from transformers import pipeline
clf = pipeline("sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment")
df["predicted_stars"] = df["content"].apply(
lambda x: int(clf(str(x)[:512])[0]["label"][0])
)
Recenzje Amazon mają rozkład w kształcie litery J — duży pik przy 5 gwiazdkach, mniejszy przy 1 gwiazdce i dolinę pośrodku. To oznacza, że średnia ocena często słabo oddaje rzeczywistą jakość produktu. Wydziel klasę 1-gwiazdkową i przeanalizuj ją pod kątem powtarzalnych motywów — to zwykle tam kryje się pojedyncza, naprawialna wada.
Uczciwy kompromis: Python DIY vs. płatne API do scrapingu vs. Thunderbit
Utrzymywałem scraper w Pythonie dla Amazon i mówiąc szczerze: one się psują. Selekory się zmieniają, ciasteczka wygasają, Amazon wdraża nową warstwę detekcji botów i nagle sobotni poranek zamiast analizy danych spędzasz na debugowaniu scrapera. Użytkownicy na forach opisują tę samą frustrację — skrypty DIY, które „działały w zeszłym miesiącu”, teraz wymagają ciągłych poprawek.
Tak wyglądają trzy główne podejścia w porównaniu:
| Kryterium | DIY Python (BS4/Selenium) | Płatne API do scrapingu | Thunderbit (no-code) |
|---|---|---|---|
| Czas konfiguracji | 1–3 godziny | 30 min (klucz API) | 2 minuty |
| Koszt | Za darmo (+ koszty proxy) | 50–200+ USD/mies. | Dostępny darmowy plan |
| Obsługa ściany logowania | Ręczne zarządzanie ciasteczkami | Zwykle obsługiwane | Obsługiwane automatycznie |
| Utrzymanie | Wysokie (selektory się psują) | Niskie (dostawca utrzymuje) | Zerowe (AI się adaptuje) |
| Paginacja | Wymaga własnego kodu | Wbudowana | Wbudowana |
| Obsługa wielu krajów | Osobne sesje dla każdej domeny | Zwykle wspierane | Oparte na przeglądarce = Twoja lokalizacja |
| Analiza sentymentu | Dodajesz własny kod | Czasem w zestawie | Eksport do Sheets, analiza gdzie chcesz |
| Najlepsze dla | Nauka, pełna kontrola | Skala, pipeline’y produkcyjne | Szybkie pobieranie danych, zespoły bez devów |
Python daje pełną kontrolę i naprawdę jest najlepszym sposobem, żeby zrozumieć, jak web scraping działa od środka. Płatne API (ScrapingBee, Oxylabs, Bright Data) mają sens w produkcji, gdzie ważniejszy jest uptime niż koszt. A dla zespołów, które potrzebują danych o recenzjach bez nakładu programistycznego — np. ecommerce ops monitorujący konkurencję co tydzień, marketing wyciągający język klientów do copy reklamowego — istnieje trzecia ścieżka.
Jak scrape’ować recenzje Amazon w Thunderbit (bez kodu, bez utrzymania)
Zbudowaliśmy Thunderbit właśnie po to, aby obsługiwać scenariusze, w których utrzymywanie scrapera w Pythonie jest po prostu przesadą. Przepływ wygląda tak:
- Zainstaluj rozszerzenie Thunderbit do Chrome
- Przejdź do strony recenzji produktu Amazon w przeglądarce (jesteś już zalogowany, więc ściana logowania nie stanowi problemu)
- Kliknij „AI Suggest Fields” — Thunderbit odczyta stronę i zaproponuje kolumny takie jak Autor, Ocena, Tytuł, Treść recenzji, Data, Zakup zweryfikowany
- Kliknij „Scrape” — dane zostaną pobrane natychmiast, z wbudowaną paginacją
- Wyeksportuj do Excela, Google Sheets, Airtable lub Notion
Największa zaleta jest taka, że AI Thunderbit za każdym razem odczytuje strukturę strony na nowo. Bez utrzymywania selektorów CSS, bez zarządzania ciasteczkami, bez kodu anty-botowego. Gdy Amazon zmienia HTML, AI się dostosowuje. Dla czytelników, którzy chcą dostępu programowego bez pełnego DIY, Thunderbit oferuje też Extract API — strukturalne pobieranie danych przez API z AI do wykrywania pól, bez konieczności utrzymywania selektorów.
Jeśli chcesz zgłębić temat danych z Amazon, zobacz nasze poradniki o tym, jak scrapować produkty i recenzje Amazon oraz ekstrakcji i analizie danych sprzedażowych Amazon.
Wskazówki: jak skalować scrapowanie recenzji Amazon w Pythonie
Jeśli scrapujesz recenzje dla wielu ASIN-ów, kilka praktyk oszczędzi Ci sporo nerwów:
- Przetwarzaj ASIN-y partiami z przerwami między produktami, nie tylko między stronami. Ja stosuję pauzy 10–15 sekund między ASIN-ami.
- Deduplikuj agresywnie. Przy łączeniu wielu filtrów gwiazdkowych i kolejności sortowania pojawią się nakładające się recenzje. Użyj zbioru krotek
(title, author, date)jako klucza deduplikacji. - Loguj błędy. Rejestruj, które kombinacje ASIN + strona + filtr nie powiodły się, aby móc je ponowić bez ponownego scrapowania całości.
- Dla dużych projektów zapisuj dane do bazy. Prosta baza SQLite skaluje się znacznie lepiej niż rozrastające się pliki CSV:
import sqlite3
conn = sqlite3.connect("reviews.db")
df.to_sql("reviews", conn, if_exists="append", index=False)
- Planuj cykliczne scrapowanie. Do stałego monitoringu ustaw cron job albo użyj funkcji Scheduled Scraper w Thunderbit — opisz URL i harmonogram, a resztą zajmie się system bez potrzeby utrzymywania serwera.
Po dodatkowe podejścia zajrzyj do naszych wpisów o najlepszych automatycznych narzędziach do web scrapingu oraz scrapowaniu danych ze stron do Excela.
Krótka uwaga o kwestiach prawnych i etycznych
Warunki korzystania z Amazon Conditions of Use wprost zabraniają „używania jakiegokolwiek robota, pająka, scrapera lub innej zautomatyzowanej metody dostępu do usług Amazon”. To powiedziawszy, najnowsze orzecznictwo w USA było przychylne scraperom publicznych danych. W sprawie Meta Platforms v. Bright Data (styczeń 2024) sąd federalny orzekł, że scrapowanie publicznie dostępnych danych nie narusza warunków usługi, jeśli scraper nie jest zalogowanym „użytkownikiem”.
Istotny niuans: scrapowanie za loginem (a o tym właśnie mówi ten poradnik) wchodzi w obszar prawa kontraktowego, ponieważ zakładałeś zgodę na ToS Amazon, zakładając konto. Scrapowanie publicznie widocznych wyróżnionych recenzji wiąże się z mniejszym ryzykiem prawnym niż pobieranie danych zza ściany logowania.
Praktyczne zasady: nie rozpowszechniaj komercyjnie scrapowanych danych, nie pobieraj danych osobowych użytkowników poza tym, co jest publicznie widoczne, respektuj robots.txt i skonsultuj się z prawnikiem przy dużej skali lub zastosowaniu komercyjnym. To nie jest porada prawna. Więcej o aspektach prawnych znajdziesz w naszym opracowaniu dotyczącym konsekwencji prawnych web scrapingu.
Podsumowanie: scrape’uj recenzje Amazon w Pythonie albo pomiń kod całkowicie
Szybkie podsumowanie tego przewodnika:
- Ściana logowania jest realna, ale da się ją obejść uwierzytelnianiem opartym na ciasteczkach — skopiuj 7 ciasteczek z przeglądarki i wstrzyknij je do
requests.Session() - Do ekstrakcji używaj selektorów
data-hook, a nie klas CSS, jeśli nie chcesz, by wszystko psuło się co kilka tygodni - Łącz filtry gwiazdkowe i kolejność sortowania, aby obejść limit 10 stron i uzyskać dostęp do 500+ recenzji na produkt
- Dodaj analizę sentymentu za pomocą TextBlob jako szybką bazę lub Hugging Face Transformers dla dokładności produkcyjnej
- Utrzymuj zabezpieczenia anty-botowe: throttling, rotację User-Agentów, exponential backoff i proxy residential przy większej skali
Python daje pełną kontrolę i jest najlepszym sposobem, by zrozumieć, co dzieje się „pod maską”. Ale jeśli Twój cel brzmi: „potrzebuję recenzji konkurencji w arkuszu do piątku”, a nie: „chcę zbudować produkcyjny pipeline danych”, koszt utrzymania własnego scrapera może nie być tego wart.
Thunderbit obsługuje uwierzytelnianie, selektory, paginację i eksport kilkoma kliknięciami — przetestuj darmowy plan i sprawdź, czy pasuje do Twojego workflow. W miarę jak Amazon coraz mocniej dokręca śrubę zabezpieczeń anty-botowych, narzędzia oparte na AI, które adaptują się w czasie rzeczywistym, przestaną być miłym dodatkiem, a staną się koniecznością.
Możesz też odwiedzić nasz kanał Thunderbit na YouTube, gdzie znajdziesz wideo z omówieniem workflowów scrapingu.
FAQ
1. Czy można scrape’ować recenzje Amazon bez logowania?
Tak, ale tylko około 8 „wyróżnionych recenzji” wyświetlanych na stronie szczegółów produktu (/dp/{ASIN}/). Pełne strony recenzji z sortowaniem, filtrowaniem i paginacją wymagają uwierzytelnienia od końca 2024 roku. W większości zastosowań biznesowych trzeba obsłużyć ścianę logowania.
2. Czy scrapowanie recenzji Amazon jest legalne?
Warunki korzystania Amazon zabraniają automatycznego scrapingu. Jednak najnowsze orzecznictwo w USA (Meta v. Bright Data, 2024; hiQ v. LinkedIn) wspiera scrapowanie publicznie dostępnych danych. Scrapowanie zza logowania wiąże się z większym ryzykiem prawnym, ponieważ zaakceptowałeś ToS Amazon. W przypadku zastosowań komercyjnych skonsultuj się z prawnikiem.
3. Ile recenzji Amazon mogę pobrać dla jednego produktu?
Amazon ogranicza strony recenzji do 10 na każdą kombinację sortowania i filtra gwiazdkowego. Korzystając ze wszystkich 5 filtrów gwiazdek × 2 kolejności sortowania, możesz uzyskać dostęp do nawet 100 stron (około 1 000 recenzji) na produkt. Przy filtrach słów kluczowych teoretyczny limit jest znacznie wyższy, choć przy dużej liczbie duplikatów.
4. Jaka jest najlepsza biblioteka Pythona do scrapowania recenzji Amazon?
Najczęściej używanym i najbardziej niezawodnym zestawem jest requests + BeautifulSoup do parsowania statycznego HTML. Selenium przydaje się, gdy potrzebne jest renderowanie JavaScriptu. Jeśli chcesz alternatywę no-code, która automatycznie obsługuje ścianę logowania i paginację, wypróbuj Thunderbit.
5. Jak uniknąć blokady podczas scrapowania Amazon?
Rotuj ciągi User-Agent z puli 10+ prawdziwych stringów przeglądarek, dodawaj losowe opóźnienia 2–5 sekund między żądaniami, wdrażaj exponential backoff przy błędach 503/429, korzystaj z proxy residential przy większej skali (adresy IP centrów danych są blokowane z góry) i utrzymuj spójne ciasteczka sesji między żądaniami. Jeśli chcesz podejście bez utrzymania, Thunderbit automatycznie obsługuje zabezpieczenia anty-botowe przez Twoją sesję w przeglądarce.
Dowiedz się więcej


