Mój scraper opinii z Amazonu działał bez zarzutu przez sześć tygodni — aż pewnego ranka zwrócił 200 OK i pustą stronę. Bez błędu, bez CAPTCHA, po prostu puste HTML tam, gdzie wcześniej były setki recenzji.
Jeśli brzmi to znajomo, nie jesteś sam. Pod koniec 2025 roku Amazon zaczął ukrywać pełne strony z opiniami za ekranem logowania, a ogromna liczba skryptów do scrapingu w Pythonie przestała działać z dnia na dzień. Ostatnie miesiące spędziłem w Thunderbit, pracując nad tym problemem z dwóch stron — budując nasz scraper AI i jednocześnie utrzymując własny pipeline do opinii w Pythonie — więc uznałem, że czas napisać poradnik, którego sam potrzebowałem, gdy mój skrypt pierwszy raz „umarł”. Ten wpis pokazuje działające podejście: uwierzytelnianie oparte na ciasteczkach, stabilne selektory odporne na zaciemnianie CSS przez Amazon, obejścia limitu 10 stron, zabezpieczenia anty-bot oraz bonusowy moduł analizy sentymentu, który zamienia surowe opinie w realne wnioski biznesowe. A jeśli w połowie pomyślisz: „wolałbym nie utrzymywać całego tego kodu”, pokażę Ci też, jak Thunderbit robi to samo w około dwie minuty i bez Pythona.
Czym jest scraping opinii z Amazonu i dlaczego ma znaczenie?
Scraping opinii z Amazonu to proces programatycznego pobierania danych z recenzji klientów — ocen gwiazdkowych, treści opinii, nazw autorów, dat, oznaczeń „zweryfikowany zakup” — ze stron produktów Amazon. Ponieważ Amazon usunął opinie z Product Advertising API już w 2010 roku i nigdy ich nie przywrócił, web scraping pozostaje jedyną programową drogą do tych danych.
Liczby mówią same za siebie. 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 opinii, notują nawet o 15% wyższe utrzymanie klientów. To nie jest abstrakcyjna nauka o danych — to wywiad konkurencyjny, sygnały do ulepszania produktu i język marketingowy, wszystko zapisane zwykłym tekstem na serwerach Amazonu.
Po co scrapować opinie z Amazonu w Pythonie?
Python nadal jest najczęściej wybieranym językiem do takich zadań. To najbardziej pożądany język w ankiecie 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, ustalanie priorytetów poprawek | Treści recenzji 1–2 gwiazdki, częstotliwość słów kluczowych |
| Sprzedaż | Monitorowanie sentymentu wobec produktów konkurencji | Oceny, trendy wolumenu recenzji |
| Marketing | Wyłapywanie języka klientów do treści reklamowych | Pozytywne frazy z recenzji, wzmianki o funkcjach |
| Operacje e-commerce | Śledzenie sentymentu własnych produktów w czasie | Rozkład ocen, odsetek zweryfikowanych zakupów |
| Badania rynku | Porównywanie liderów kategorii pod kątem funkcji | Zbiory recenzji wielu ASIN-ów |
Jedna marka kuchennego AGD przeanalizowała negatywne recenzje, odkrywając, że 22% wspominało o „ścierającej się powłoce nieprzywierającej”, zmieniła recepturę produktu i odzyskała pozycję numer 1 bestsellerów w ciągu 60 dni. Firma produkująca opaski fitness wyłapała z opinii wzmianki o „podrażnieniu paska”, zidentyfikowała problem z alergią na lateks, wypuściła wariant hipoalergiczny i zmniejszyła liczbę zwrotów o 40%. To właśnie taki ROI sprawia, że wysiłek inżynieryjny się opłaca.
Ekran logowania: dlaczego scraper opinii z Amazonu przestał działać?
14 listopada 2024 roku Amazon zaczął wymagać logowania, aby zobaczyć pełną stronę opinii o produkcie. Zmiana została potwierdzona na forach społeczności oraz w blogach dostawców narzędzi do scrapingu. Jeśli wejdziesz na /product-reviews/{ASIN}/ w oknie incognito, zamiast danych o opiniach zobaczysz stronę logowania.

Objawy są podstępne: skrypt dostaje odpowiedź 200 OK, ale w treści HTML zamiast recenzji znajduje się formularz logowania (name="email", id="ap_password"). Bez kodu błędu. Bez CAPTCHA. Po prostu… nic użytecznego.
Amazon zrobił to ze względów anty-botowych i zgodności regionalnej. Egzekwowanie tej reguły jest niespójne — czasem świeże okno przeglądarki pokaże kilka recenzji, zanim pojawi się blokada, zwłaszcza na pierwszej stronie — ale dla scrapera działającego na większą skalę należy zakładać, że blokada jest zawsze aktywna.
Różne krajowe domeny Amazonu (.de, .co.uk, .co.jp) egzekwują tę blokadę niezależnie. Jak napisał jeden użytkownik forum: „do każdego kraju potrzebne jest osobne logowanie”. Twoje ciasteczka z .com nie zadziałają na .co.uk.
Opinie wyróżnione vs. pełna lista recenzji: co nadal da się zobaczyć bez logowania?
Strony produktów Amazonu (/dp/{ASIN}/) nadal pokazują około 8 „wyróżnionych opinii” bez uwierzytelniania. To recenzje wybrane ręcznie przez algorytm Amazonu, przydatne do szybkiej oceny sentymentu, ale nie da się ich sortować, filtrować ani stronicować.
Pełne strony z opiniami (/product-reviews/{ASIN}/) — z sortowaniem według najnowszych, filtrowaniem po gwiazdkach i paginacją obejmującą setki recenzji — wymagają logowania.
Jeśli potrzebujesz tylko kilku opinii do szybkiego sprawdzenia nastroju, zeskrob stronę produktu. Jeśli chcesz setki lub tysiące, musisz obsłużyć uwierzytelnianie.
Co przygotować przed startem: konfiguracja Pythona i bibliotek
Zanim napiszemy jakikolwiek kod, oto zestaw startowy:
- Poziom trudności: średni (swoboda z Pythonem, podstawy HTML)
- Szacowany czas: około 45 minut dla pełnego pipeline’u; około 10 minut dla prostego scrapingu
- Potrzebne rzeczy: Python 3.8+, przeglądarka Chrome, aktywne 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 Amazonie. Znajdziesz go w adresie URL produktu — na przykład w amazon.com/dp/B0BCNKKZ91 ASIN to B0BCNKKZ91. To właśnie ten klucz wstawisz do adresu strony z opiniami.
Krok 1: Omiń ekran logowania dzięki uwierzytelnianiu opartemu na ciasteczkach
Najpewniejsze podejście to zalogować się do Amazonu w przeglądarce, skopiować ciasteczka sesji i wstrzyknąć je do requests.Session() w Pythonie. Dzięki temu nie uruchamiasz CAPTCHA ani SMS-owej 2FA, które często psują automatyczne logowanie przez Selenium.
Potrzebujesz tych siedmiu ciasteczek:
| Nazwa ciasteczka | Zastosowanie |
|---|---|
session-id | Rotacyjny identyfikator sesji |
session-id-time | Znacznik czasu sesji |
session-token | Rotacyjny 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 albo kliknij prawym → Inspect)
- Przejdź do Application → Storage → Cookies →
https://www.amazon.com - Znajdź każdą nazwę ciasteczka z tabeli i skopiuj jej wartość
- Sformatuj je jako ciąg rozdzielany średnikami do użycia w Pythonie
Tak skonfigurujesz sesję:
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 zapytaniach. Dzięki temu ciasteczka pozostają spójne, a zachowanie bardziej przypomina prawdziwą sesję przeglądarki. Ciasteczka zwykle działają od kilku dni do kilku tygodni przy intensywniejszym scrapingu, ale jeśli znowu zaczniesz trafiać na przekierowania do logowania, odśwież je w przeglądarce.
Dla marketplace’ów innych niż .com nazwy ciasteczek nieco się różnią — amazon.de używa at-acbde zamiast at-main, amazon.co.uk używa at-acbuk itd. Każdy marketplace wymaga osobnej, niezależnej sesji.
Krok 2: Zbuduj zapytanie i parsuj HTML opinii za pomocą BeautifulSoup
Adres URL opinii Amazonu ma taki wzór:
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)) # Grzeczne opóźnienie
response = session.get(url, timeout=15)
# Wykrywanie ekranu logowania
if "ap_email" in response.text or "Amazon Sign-In" in response.text:
raise Exception("Wykryto ekran logowania — odśwież swoje ciasteczka")
if response.status_code != 200:
raise Exception(f"HTTP {response.status_code}")
return BeautifulSoup(response.text, "lxml")
Jest jeszcze jeden prosty trik: zanim wejdziesz na stronę z opiniami, najpierw odwiedź stronę produktu. To buduje bardziej naturalny wzorzec przeglądania w sesji.
# Najpierw odwiedź stronę produktu (udajemy 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 przejdź do opinii
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 wyciągania danych z opinii (nie opieraj się na klasach CSS)
To miejsce, w którym większość poradników z lat 2022–2023 się wywraca. Amazon zaciemnia nazwy klas CSS — zmieniają się one okresowo, a jak napisał jeden sfrustrowany programista na forum: „żaden z nich nie miał nawet jednego wzorca w nazwach klas tagów span”.
Rozwiązanie: Amazon używa atrybutów data-hook na elementach opinii i są one zaskakująco stabilne. To semantyczne identyfikatory, na których opiera się frontend Amazonu, więc nie są losowo zmieniane.
| Pole opinii | Stabilny selektor (data-hook) | Kruche selektory (klasy) |
|---|---|---|
| Treść opinii | [data-hook="review-body"] | .review-text-content (zmienia się) |
| Ocena gwiazdkowa | [data-hook="review-star-rating"] | .a-icon-alt (niejednoznaczne) |
| Tytuł opinii | [data-hook="review-title"] | .review-title (czasami) |
| Nazwa autora | span.a-profile-name | Dość stabilny |
| Data opinii | [data-hook="review-date"] | .review-date (zależne od regionu) |
| Zweryfikowany zakup | [data-hook="avp-badge"] | span.a-size-mini |
Kod do 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 ""
# Zweryfikowany zakup
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. Natomiast klasy CSS w tym samym czasie obróciły się przynajmniej dwa razy.
Krok 4: Obsłuż paginację i limit 10 stron w Amazonie
Amazon ogranicza parametr pageNumber do 10 stron po 10 recenzji każda — twardy limit około 100 opinii na jedną kombinację filtrów. 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 # Brak kolejnych opinii na tej stronie
all_reviews.extend(page_reviews)
print(f"Strona {page}: {len(page_reviews)} opinii")
Jak pobrać więcej niż 10 stron opinii z Amazonu
Sposobem obejścia jest bucketing filtrów. Każda kombinacja filterByStar i sortBy dostaje 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 5 filtrów gwiazdkowych × 2 kolejności sortowania, możesz uzyskać dostęp nawet do 100 stron, czyli 1000 opinii na produkt — a przy produktach z nierównym rozkładem ocen często zbliżysz się do pełnego zestawu recenzji.
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 zestawie tytuł + autor
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)} opinii")
print(f"Łącznie unikalnych opinii: {len(all_reviews)}")
Między bucketami pojawiają się duplikaty, więc deduplikacja jest konieczna. Używam pary tytuł opinii + nazwa autora jako szybkiego klucza — nieidealnego, ale wyłapującego zdecydowaną większość duplikatów.
Krok 5: Omijaj zabezpieczenia anty-botowe (rotacja, throttling, retry)
Amazon używa AWS WAF Bot Control, który stał się znacznie bardziej agresywny. Jednowarstwowe zabezpieczenia (np. tylko rotacja User-Agentów albo tylko opóźnienia) już nie wystarczają.
| Technika | Implementacja |
|---|---|
| Rotacja User-Agentów | Losowy wybór z 10+ prawdziwych ciągów przeglądarek |
| Wykładniczy backoff | Opóźnienia prób 2s → 4s → 8s przy błędach 503 |
| Throttling żądań | random.uniform(2, 5) sekund między stronami |
| Rotacja proxy | Przełączanie między proxy residential |
| Fingerprint sesji | Spójne ciasteczka + nagłówki dla danej sesji |
| Podszywanie się pod TLS | Użyj curl_cffi zamiast standardowego requests w produkcji |
Gotowy do użycia 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 lub blokada ({response.status_code}). Czekam {wait}s...")
time.sleep(wait)
continue
if "ap_email" in response.text:
raise Exception("Ekran 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 scrapujesz więcej niż kilkaset stron, residential proxy są w praktyce konieczne — przygotuj się na koszt rzędu 50–200+ USD miesięcznie, zależnie od wolumenu. Przy mniejszych projektach (poniżej 100 żądań dziennie) ostrożny throttling z własnego IP domowego często wystarcza.
Amazon sprawdza też fingerprint TLS. Standardowa biblioteka Pythona requests ma dobrze znany hash JA3, który WAF-y często blokują z góry. Dla scraperów produkcyjnych warto rozważyć curl_cffi, który imituje prawdziwe stosy TLS przeglądarek. Przy scrapingu na poziomie tutoriala (kilkaset stron) requests z dobrymi nagłówkami zwykle wystarcza.
Krok 6: Wyeksportuj zeskrobane opinie z Amazonu do CSV lub Excela
Gdy już zbierzesz opinie, zapisanie ich w użytecznym formacie 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)} opinii do amazon_reviews.csv")
Przykładowy wynik:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | Najlepszy zakup w tym roku | Bateria działa cały dzień, ekran jest pię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ę, drobne 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 też się nadaje, ale wymaga 8+ kroków konfiguracji w Google Cloud — tworzenia projektu, włączania dwóch API, generowania danych uwierzytelniających konta serwisowego, udostępnienia arkusza. Jeśli brzmi to jak więcej konfiguracji niż samo scrapowanie, to słusznie. (To jeden z tych momentów, kiedy narzędzie takie jak Thunderbit, eksportujące do Google Sheets jednym kliknięciem, zaczyna wyglądać bardzo atrakcyjnie.)
Bonus: Dodaj analizę sentymentu do zeskrobanych opinii w 5 linijkach Pythona
Większość poradników kończy się na eksporcie CSV. Ale właśnie ocena sentymentu zamienia surowe dane w decyzje biznesowe.
Najszybszy podstawowy wariant używa TextBlob:
from textblob import TextBlob
df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
Dostajesz wynik sentymentu od -1.0 (bardzo negatywny) do +1.0 (bardzo pozytywny) dla każdej opinii. Przykładowy wynik:
| content (skrót) | rating | sentiment |
|---|---|---|
| "Battery lasts all day, screen is gorgeous..." | 5.0 | 0.65 |
| "The charging port stopped working after..." | 2.0 | -0.40 |
| "Does everything I need, minor lag on..." | 4.0 | 0.25 |
| "Absolute garbage. Returned immediately." | 1.0 | -0.75 |
| "It's okay. Nothing special but works." | 3.0 | 0.10 |
Najciekawsze są niezgodności — recenzja 3-gwiazdkowa z pozytywnym tekstem albo 5-gwiazdkowa z negatywnym językiem. Takie rozbieżności często ujawniają subtelne opinie klientów, których same gwiazdki nie pokazują.

Dla dokładności na poziomie produkcyjnym polecam Hugging Face Transformers. VADER był trenowany na tweetach, a nie na recenzjach produktów, a modele transformerowe osiągają ponad 98% dokładności w klasyfikacji opinii w porównaniu z narzędziami leksykalnymi. Model nlptown/bert-base-multilingual-uncased-sentiment potrafi nawet przewidywać 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])
)
Opinie w Amazonie 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 opisuje rzeczywistą jakość produktu. Warto wydzielić klaster 1-gwiazdkowy i wyłuskać z niego powtarzające się motywy — zwykle właśnie tam ukrywa się jeden naprawialny defekt.
Szczera wymiana: Python DIY vs płatne API do scrapingu vs Thunderbit
Utrzymuję scrapery Pythona dla Amazonu i mówiąc szczerze: one się psują. Selektory się zmieniają, ciasteczka wygasają, Amazon wdraża nową warstwę wykrywania botów i nagle sobotni poranek zamiast analizy danych zamienia się w debugowanie scrapera. Użytkownicy na forach zgłaszają podobną frustrację — skrypty DIY, które „działały w zeszłym miesiącu”, teraz wymagają ciągłego łatania.
Oto porównanie trzech głównych podejść:
| 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 | Darmowe (+ koszt proxy) | 50–200+ USD/mies. | Dostępny darmowy plan |
| Obsługa ekranu 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 | Na bazie przeglądarki = Twoja lokalizacja |
| Analiza sentymentu | Dodajesz własny kod | Czasem w zestawie | Eksport do Sheets, analiza gdzie chcesz |
| Najlepsze dla | Nauki, pełnej kontroli | Skalowalnych pipeline’ów produkcyjnych | Szybkich pobrań danych, zespołów bez devów |
Python daje pełną kontrolę i jest naprawdę najlepszym sposobem, by zrozumieć, jak web scraping działa „pod maską”. Ale jeśli Twoje potrzeby brzmią raczej „potrzebuję danych o opiniach konkurencji w arkuszu do piątku” niż „chcę zbudować produkcyjny pipeline danych”, koszt utrzymania własnego scrapera może być zwyczajnie nieopłacalny.
Thunderbit obsługuje uwierzytelnianie, selektory, paginację i eksport kilkoma kliknięciami — sprawdź darmowy plan i zobacz, czy pasuje do Twojego workflow. Wraz z tym, jak Amazon zaostrza zabezpieczenia anty-botowe, narzędzia oparte na AI, które adaptują się w czasie rzeczywistym, przestają być miłym dodatkiem, a stają się koniecznością.
Możesz też zajrzeć na nasz kanał Thunderbit na YouTube, gdzie znajdziesz wideo-przewodniki po workflow scrapingu.
FAQ
1. Czy da się scrapować opinie z Amazonu bez logowania?
Tak, ale tylko około 8 „wyróżnionych opinii” widocznych na stronie produktu (/dp/{ASIN}/). Pełne strony z opiniami, sortowaniem, filtrowaniem i paginacją wymagają uwierzytelnienia od końca 2024 roku. W większości zastosowań biznesowych trzeba więc poradzić sobie z ekranem logowania.
2. Czy scrapowanie opinii z Amazonu jest legalne?
Regulamin Amazonu zabrania automatycznego scrapingu. Jednak nowsze orzecznictwo w USA (Meta v. Bright Data, 2024; hiQ v. LinkedIn) wspiera scraping publicznie dostępnych danych. Scraping za logowaniem wiąże się z większym ryzykiem prawnym, ponieważ akceptowałeś regulamin Amazonu przy zakładaniu konta. Przy zastosowaniach komercyjnych skonsultuj się z prawnikiem.
3. Ile opinii z Amazonu mogę zeskrobać na produkt?
Amazon ogranicza liczbę stron opinii do 10 na każdą kombinację sortowania i filtra gwiazdek. Używając wszystkich 5 filtrów gwiazdkowych × 2 kolejności sortowania, można uzyskać nawet 100 stron (około 1000 opinii) na produkt. Przy filtrach słów kluczowych teoretyczny limit jest dużo wyższy, ale duplikacji jest wtedy sporo.
4. Jaka jest najlepsza biblioteka Pythona do scrapowania opinii z Amazonu?
requests + BeautifulSoup do parsowania statycznego HTML to najczęściej używane i najbardziej niezawodne połączenie. Selenium przydaje się, gdy potrzebujesz renderowania JavaScript. Jeśli chcesz alternatywę no-code, która automatycznie obsługuje ekrany logowania i paginację, wypróbuj Thunderbit.
5. Jak uniknąć blokady podczas scrapowania Amazonu?
Rotuj ciągi User-Agent z puli 10+ prawdziwych przeglądarek, dodawaj losowe opóźnienia 2–5 sekund między żądaniami, stosuj wykładniczy backoff przy błędach 503/429, używaj residential proxy przy większej skali (adresy IP centrów danych są blokowane z wyprzedzeniem) i utrzymuj spójne ciasteczka sesji między żądaniami. Jeśli chcesz podejście bez utrzymania, Thunderbit obsługuje zabezpieczenia anty-botowe automatycznie przez Twoją sesję przeglądarki.
Dowiedz się więcej


