Jak skrobać recenzje Amazon za pomocą Python: kompletny przewodnik po odblokowaniu, selektorach, paginacji i analizie sentymentu

Ostatnia aktualizacja: August 21, 2026
Jak skrobać recenzje Amazon za pomocą Python: kompletny przewodnik po odblokowaniu, selektorach, paginacji i analizie sentymentu
Podsumowanie AI

Artykuł pokazuje, jak pobierać recenzje Amazon w Pythonie mimo ściany logowania, jak korzystać ze stabilnych selektorów data-hook, obejść limit paginacji i dodać analizę sentymentu. Zawiera też porównanie podejścia DIY z Thunderbit, które pozwala wykonać ten sam proces bez kodowania i bez utrzymania.

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życiaCo wyciągają
Produkt / R&DWykrywanie powtarzających się skarg, priorytetyzacja poprawekTreść recenzji 1–2-gwiazdkowych, częstotliwość słów kluczowych
SprzedażMonitorowanie sentymentu wobec produktów konkurencjiOceny, trendy wolumenu recenzji
MarketingPozyskiwanie języka klientów do copy reklamowegoPozytywne frazy z recenzji, wzmianki o funkcjach
Ecommerce OpsŚledzenie sentymentu własnych produktów w czasieRozkład ocen, udział zakupów zweryfikowanych
Badania rynkuPorównywanie liderów kategorii pod kątem funkcjiZbiory 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.

python-web-scraping-diagram.webp

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 ciasteczkaPrzeznaczenie
session-idRotujący identyfikator sesji
session-id-timeZnacznik czasu sesji
session-tokenRotujący token sesji
ubid-mainIdentyfikator przeglądania użytkownika
at-mainGłówny token uwierzytelniający
sess-at-mainUwierzytelnienie przypisane do sesji
x-mainIdentyfikator powiązany z e-mailem użytkownika

Jak wyciągnąć ciasteczka z Chrome DevTools

  1. Zaloguj się do amazon.com w Chrome
  2. Otwórz DevTools (F12 lub kliknij prawym przyciskiem → Zbadaj)
  3. Przejdź do ApplicationStorageCookieshttps://www.amazon.com
  4. Znajdź w tabeli każdą nazwę ciasteczka i skopiuj jej wartość
  5. 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 recenzjiStabilny 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 autoraspan.a-profile-nameRelatywnie 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ą.

TechnikaImplementacja
Rotacja User-AgentówLosowy wybór spośród 10+ prawdziwych stringów przeglądarek
Exponential backoffOpóźnienia ponownych prób 2s → 4s → 8s przy 503
Throttling żądańrandom.uniform(2, 5) sekund między stronami
Rotacja proxyPrzełączanie się między proxy residential
Odcisk sesjiSpójne ciasteczka + nagłówki dla jednej sesji
Imponowanie TLSUż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:

authorratingtitlecontentdatecountryverified
Sarah M.5.0Najlepszy zakup w tym rokuBateria trzyma cały dzień, ekran jest przepiękny...January 15, 2025the United StatesTrue
Mike T.2.0Rozczarowanie po 2 tygodniachPort ładowania przestał działać...February 3, 2025the United StatesTrue
Priya K.4.0Świetny stosunek jakości do cenyRobi wszystko, czego potrzebuję, tylko lekkie opóźnienia przy ciężkich aplikacjach...March 10, 2025the United StatesFalse

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)ratingsentiment
"Bateria trzyma cały dzień, ekran jest przepiękny..."5.00.65
"Port ładowania przestał działać po..."2.0-0.40
"Robi wszystko, czego potrzebuję, drobne lagi przy..."4.00.25
"Totalny śmieć. Zwróciłem od razu."1.0-0.75
"Jest okej. Nic specjalnego, ale działa."3.00.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ą.

ai-review-analysis.webp

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:

KryteriumDIY Python (BS4/Selenium)Płatne API do scrapinguThunderbit (no-code)
Czas konfiguracji1–3 godziny30 min (klucz API)2 minuty
KosztZa darmo (+ koszty proxy)50–200+ USD/mies.Dostępny darmowy plan
Obsługa ściany logowaniaRęczne zarządzanie ciasteczkamiZwykle obsługiwaneObsługiwane automatycznie
UtrzymanieWysokie (selektory się psują)Niskie (dostawca utrzymuje)Zerowe (AI się adaptuje)
PaginacjaWymaga własnego koduWbudowanaWbudowana
Obsługa wielu krajówOsobne sesje dla każdej domenyZwykle wspieraneOparte na przeglądarce = Twoja lokalizacja
Analiza sentymentuDodajesz własny kodCzasem w zestawieEksport do Sheets, analiza gdzie chcesz
Najlepsze dlaNauka, pełna kontrolaSkala, pipeline’y produkcyjneSzybkie 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:

  1. Zainstaluj rozszerzenie Thunderbit do Chrome
  2. Przejdź do strony recenzji produktu Amazon w przeglądarce (jesteś już zalogowany, więc ściana logowania nie stanowi problemu)
  3. Kliknij „AI Suggest Fields” — Thunderbit odczyta stronę i zaproponuje kolumny takie jak Autor, Ocena, Tytuł, Treść recenzji, Data, Zakup zweryfikowany
  4. Kliknij „Scrape” — dane zostaną pobrane natychmiast, z wbudowaną paginacją
  5. 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

Fawad Khan
Fawad Khan
Fawad zawodowo zajmuje się pisaniem i, szczerze mówiąc, całkiem to lubi. Spędził lata, próbując zrozumieć, co sprawia, że tekst naprawdę zostaje w głowie — a co sprawia, że czytelnicy przewijają dalej. Zapytaj go o marketing, a będzie mówił godzinami. Zapytaj o carbonarę, a będzie mówił jeszcze dłużej.
Spis treści
Thunderbit · Agent AI do danych z internetu

Wyciągaj dane z dowolnej strony w 1 klik

Zaufało nam ponad 250 000 użytkowników
dostępny darmowy plan
Od strony do arkusza kalkulacyjnego
Opisz, czego potrzebujesz — Agent AI Thunderbit zbierze to i wyeksportuje do Excela, Google Sheets, Airtable lub Notion. Start jest darmowy.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week