Jak nauczyć się pobierać dane o produktach Amazon za pomocą Pythona

Ostatnia aktualizacja: April 16, 2026

Jeśli przerobiłeś już poradnik o scrapowaniu Amazon tylko po to, żeby wpaść na mur CAPTCHA, błędy 503 albo kompletnie puste wyniki — witaj w klubie. Większość poradników o scrapowaniu Amazon w Pythonie, które krążą po internecie, powstała w 2022 albo 2023 roku i korzysta z selektorów oraz technik, które Amazon dawno już załatał.

Od lat tworzę narzędzia do ekstrakcji danych w Thunderbit i mogę powiedzieć jedno z własnego doświadczenia: Amazon to jedna z najtrudniejszych stron do niezawodnego scrapowania. Platforma nieustannie zmienia strukturę HTML, stosuje sześciowarstwową ochronę anty-botową, a do tego potrafi pokazywać różne układy stron różnym użytkownikom w ramach testów A/B. W tym poradniku pokażę Ci scraper Amazona w Pythonie, który naprawdę działa w 2025 roku — z potwierdzonymi selektorami CSS, wielowarstwową strategią antyblokadową oraz wskazówkami dotyczącymi harmonogramu i eksportu danych, których większość poradników nawet nie dotyka. A dla osób, które chcą po prostu mieć dane bez walki z Pythonem, pokażę też, jak zrobi to samo w około dwa kliknięcia.

Czym jest scrapowanie produktów Amazon?

Scrapowanie produktów Amazon to proces programowego pobierania publicznie dostępnych danych — nazw produktów, cen, ocen, liczby opinii, zdjęć, dostępności i innych informacji — ze stron produktów oraz wyników wyszukiwania na Amazonie. Zamiast ręcznie kopiować dane z setek ofert, scraper odwiedza kolejne strony, czyta HTML i wyciąga wskazane informacje do uporządkowanego formatu, takiego jak CSV, Excel lub baza danych.

Można to porównać do zatrudnienia niestrudzonego stażysty, który potrafi odwiedzić tysiąc stron produktów w czasie, w którym Ty kończysz poranną kawę. Tyle że ten stażysta nigdy się nie myli i nie potrzebuje przerwy na lunch.

Dlaczego warto scrapować produkty Amazon w Pythonie?

Amazon hostuje około w ponad 30 kategoriach, obsługiwanych przez około . Sprzedawcy zewnętrzni odpowiadają dziś za 69% całkowitego GMV. Ręczne monitorowanie nawet niewielkiej części tego katalogu jest po prostu niemożliwe. Oto, dlaczego zespoły scrapują Amazon:

Przypadek użyciaKto korzystaJakie dane pobiera
Monitorowanie cen i repricingoperacje e-commerce, sprzedawcy na marketplaceceny, dostępność, informacje o sprzedawcy
Analiza konkurencjimenedżerowie produktu, zespoły markicechy produktów, oceny, liczba opinii
Badania rynkuanalitycy, zespoły nowych produktówtrendy kategorii, rozkład cen
Generowanie leadówzespoły sprzedażynazwy sprzedawców, informacje o marce, dane kontaktowe
Marketing afiliacyjnytwórcy treści, serwisy z okazjamiceny, promocje, szczegóły produktów
Śledzenie stanów magazynowychłańcuch dostaw, zaopatrzeniestatus zapasów, szacowany czas dostawy

Skala samych zmian cen na Amazonie sprawia, że automatyzacja jest koniecznością: Amazon zmienia ceny , a średnia cena produktu aktualizuje się mniej więcej co 10 minut. Dla porównania, konkurenci tacy jak Best Buy czy Walmart zmieniają ceny tylko około 50 tysięcy razy miesięcznie. Żaden ludzki zespół nie jest w stanie za tym nadążyć.

amazon-product-price-monitor-dashboard.webp

Python daje Ci pełną kontrolę nad procesem scrapowania — sam decydujesz, co pobrać, jak obsługiwać błędy i gdzie zapisać dane. Oznacza to jednak również, że to Ty odpowiadasz za utrzymanie, mechanizmy antyblokujące i bieżące dostosowywanie się do częstych zmian HTML na Amazonie.

Co można pobrać z Amazon, a czego nie wolno

Ze stron publicznie dostępnych produktów zwykle można wyciągnąć:

  • Tytuł produktu (nazwa, marka)
  • Cenę (aktualna, pierwotna, promocyjna)
  • Ocenę (średnia gwiazdek)
  • Liczbę opinii
  • Zdjęcia produktu (adres URL głównego obrazu)
  • Dostępność / stan magazynowy
  • ASIN (Amazon Standard Identification Number)
  • Opis produktu i punkty wypunktowane
  • Informacje o sprzedawcy
  • Warianty produktu (rozmiar, kolor itd.)

Czego należy unikać:

  • Danych ukrytych za logowaniem: rozbudowanych stron z opiniami, danych konta osobistego, historii zamówień
  • Danych osobowych: imion kupujących, adresów, informacji o płatnościach
  • Treści chronionych prawem autorskim do ponownej publikacji: opisy i zdjęcia produktów nadają się do analizy, ale nie do publikowania jako własne

Amazona blokuje ponad 50 nazwanych botów (w tym GPTBot, Scrapy i ClaudeBot) oraz zabrania dostępu do takich ścieżek jak konta użytkowników, koszyki i listy życzeń. Strony szczegółów produktów nie są explicite zablokowane, ale regulamin Amazona i tak zabrania automatycznego dostępu. Sądy zwykle odróżniają naruszenie regulaminu (sprawa cywilna) od naruszeń karnych na gruncie CFAA — więcej o legalności na końcu poradnika.

Jakich narzędzi i bibliotek potrzebujesz

Oto zestaw Pythona do tego poradnika:

BibliotekaZastosowanieDlaczego jej używamy
requestsżądania HTTPprosta, szeroko wspierana
beautifulsoup4parsowanie HTMLłatwe wyciąganie danych przez selektory CSS
lxmlszybki parser HTMLużywany jako backend parsera BeautifulSoup
curl_cffiimitacja TLS fingerprintkluczowe do obejścia wykrywania Amazona
pandasporządkowanie i eksport danychDataFrame, eksport do CSV/Excel

Opcjonalnie (dla treści renderowanej przez JavaScript):

  • selenium lub playwright — automatyzacja przeglądarki bez interfejsu

Konfiguracja środowiska Python

Otwórz terminal i uruchom:

1mkdir amazon-scraper && cd amazon-scraper
2python -m venv venv
3source venv/bin/activate  # W Windows: venv\Scripts\activate
4pip install requests beautifulsoup4 lxml curl_cffi pandas

Sprawdź, czy wszystko się zainstalowało:

1import requests, bs4, curl_cffi, pandas
2print("Wszystko działa!")

Jeśli zobaczysz komunikat „Wszystko działa!” bez błędów, możesz przejść dalej.

laptop-coding-workspace.webp

Dlaczego większość poradników o scrapowaniu Amazon się psuje (i czym różni się ten)

To właśnie ten fragment większość poradników pomija, a jest to powód, dla którego prawdopodobnie czytasz ten artykuł.

Amazon często aktualizuje strukturę HTML, nazwy klas i identyfikatory elementów. Społeczność scrapingowa raportuje, że z powodu zmian w DOM i fingerprintingu. Najsłynniejsza ofiara? Selektor #priceblock_ourprice, który pojawiał się w setkach poradników z lat 2018–2023. Ten identyfikator nie istnieje już na stronach produktów Amazon.

Krótki porównawczy przegląd tego, co jest zepsute, a co działa dziś:

Element danychNiedziałający selektor (przed 2024)Działający selektor 2025
Cena#priceblock_ourpricediv#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen
Tytuł#productTitlespan#productTitle (wciąż działa)
Ocenaspan.a-icon-alt (czasem zły kontekst)#acrPopover span.a-icon-alt
Liczba opinii#acrCustomerReviewCountspan#acrCustomerReviewText
Dostępność#availability spandiv#availability span.a-size-medium

Każdy fragment kodu w tym poradniku został przetestowany na żywych stronach Amazon w 2025 roku. Pokażę Ci rzeczywiste selektory CSS wraz z oczekiwanym wynikiem — bez kopiowania z 2022 roku.

Zanim zaczniesz

  • Poziom trudności: średnio zaawansowany (zakładana podstawowa znajomość Pythona)
  • Czas potrzebny: około 30–45 minut na pełny tutorial; około 10 minut na podstawowy scraper
  • Czego potrzebujesz: Python 3.9+, przeglądarka Chrome (do sprawdzania stron Amazon), terminal oraz opcjonalnie , jeśli chcesz porównać podejście bez kodu

Krok 1: Wyślij pierwsze żądanie do Amazon

Otwórz dowolną stronę produktu Amazon w przeglądarce i skopiuj adres URL. Zaczniemy od prostego requests.get():

1import requests
2url = "https://www.amazon.com/dp/B0DGNFM9YJ"
3response = requests.get(url)
4print(response.status_code)
5print(response.text[:500])

Uruchom to, a niemal na pewno dostaniesz kod statusu 503 albo stronę z komunikatem „To discuss automated access to Amazon data please contact…”. To WAF Amazona (Web Application Firewall), który wykrywa Twój skrypt w Pythonie. Zwykłe requests.get() bez odpowiednich nagłówków osiąga około na Amazonie.

Powinieneś zobaczyć coś w rodzaju 503 i stronę blokady w HTML. To normalne — naprawimy to w następnym kroku.

Krok 2: Ustaw własne nagłówki i imitację TLS

Samo dodanie nagłówka User-Agent już nie wystarcza. Amazon porównuje Twoje nagłówki HTTP z fingerprintem TLS. Jeśli podajesz się za Chrome 120, ale w handshake TLS widać bibliotekę requests z Pythona, zostajesz .

Najpewniejsze podejście w 2025 roku to użycie curl_cffi z imitacją przeglądarki:

1from curl_cffi import requests as cfreq
2headers = {
3    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
4    "Accept-Language": "en-US,en;q=0.9",
5    "Accept-Encoding": "gzip, deflate, br",
6    "Referer": "https://www.google.com/",
7    "DNT": "1",
8    "Connection": "keep-alive",
9    "Upgrade-Insecure-Requests": "1",
10}
11url = "https://www.amazon.com/dp/B0DGNFM9YJ"
12response = cfreq.get(url, headers=headers, impersonate="chrome124")
13print(response.status_code)
14print(len(response.text))

Przy użyciu curl_cffi z imitacją Chrome 124 skuteczność rośnie do około — to 47-krotna poprawa względem zwykłego requests. Powinieneś teraz zobaczyć kod 200 i znacznie dłuższą odpowiedź HTML (ponad 100 000 znaków).

Jeśli nadal pojawia się 503, spróbuj innej wartości impersonate (np. "chrome131") albo odczekaj chwilę przed ponowieniem próby.

Krok 3: Sparsuj HTML i wyciągnij dane produktu

Teraz, gdy mamy pełny HTML, wyciągnijmy dane za pomocą BeautifulSoup i potwierdzonych selektorów z 2025 roku:

1from bs4 import BeautifulSoup
2soup = BeautifulSoup(response.text, "lxml")
3# Tytuł produktu
4title_el = soup.select_one("span#productTitle")
5title = title_el.get_text(strip=True) if title_el else None
6# Cena
7price_el = soup.select_one(
8    "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
9)
10if not price_el:
11    price_el = soup.select_one("span.priceToPay .a-offscreen")
12if not price_el:
13    price_el = soup.select_one(".apexPriceToPay .a-offscreen")
14price = price_el.get_text(strip=True) if price_el else None
15# Ocena
16rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17rating = rating_el.get_text(strip=True) if rating_el else None
18# Liczba opinii
19reviews_el = soup.select_one("span#acrCustomerReviewText")
20reviews = reviews_el.get_text(strip=True) if reviews_el else None
21# Dostępność
22avail_el = soup.select_one("div#availability span")
23availability = avail_el.get_text(strip=True) if avail_el else None
24# Adres URL głównego obrazu
25img_el = soup.select_one("#landingImage")
26image_url = img_el.get("src") if img_el else None
27print(f"Tytuł: {title}")
28print(f"Cena: {price}")
29print(f"Ocena: {rating}")
30print(f"Opinie: {reviews}")
31print(f"Dostępność: {availability}")
32print(f"Obraz: {image_url}")

Przykładowy wynik:

1Tytuł: Apple AirPods Pro (2nd Generation) with USB-C
2Cena: $189.99
3Ocena: 4.7 out of 5 stars
4Opinie: 98,432 ratings
5Dostępność: In Stock
6Obraz: https://m.media-amazon.com/images/I/61SUj2...

Zwróć uwagę na kilka selektorów awaryjnych dla ceny — Amazon używa różnych kontenerów w zależności od typu produktu, statusu promocji i wariantu testu A/B. Osłonięcie każdej ekstrakcji warunkiem zapobiega awarii scrapera, gdy selektor nie znajdzie dopasowania.

Krok 4: Pobierz wiele produktów z wyników wyszukiwania

Aby zbudować prawdziwy zestaw danych, najlepiej zacząć od strony wyników wyszukiwania Amazon, zebrać ASIN-y, a następnie scrapować każdą stronę produktu.

1import time
2import random
3def get_search_asins(keyword, max_pages=1):
4    """Zbierz ASIN-y z wyników wyszukiwania Amazon."""
5    asins = []
6    for page in range(1, max_pages + 1):
7        search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
8        resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
9        if resp.status_code != 200:
10            print(f"Strona wyników {page} zwróciła {resp.status_code}")
11            break
12        search_soup = BeautifulSoup(resp.text, "lxml")
13        results = search_soup.select('div[data-component-type="s-search-result"]')
14        for r in results:
15            asin = r.get("data-asin")
16            if asin:
17                asins.append(asin)
18        print(f"Strona {page}: znaleziono {len(results)} produktów")
19        time.sleep(random.uniform(2, 5))  # Uprzejma przerwa
20    return asins
21asins = get_search_asins("wireless+earbuds", max_pages=2)
22print(f"Zebrano {len(asins)} ASIN-ów")

Każdy ASIN mapuje się na czysty adres produktu: https://www.amazon.com/dp/{ASIN}. To bardziej niezawodne niż korzystanie z pełnych adresów wyników wyszukiwania, które mogą zawierać parametry zależne od sesji.

Krok 5: Obsługa paginacji i scrapowanie na większą skalę

Połączmy teraz zbieranie wyników i scrapowanie stron produktowych w pełny pipeline:

1import pandas as pd
2def scrape_product(asin):
3    """Scrapuje pojedynczą stronę produktu Amazon."""
4    url = f"https://www.amazon.com/dp/{asin}"
5    try:
6        resp = cfreq.get(url, headers=headers, impersonate="chrome124")
7        if resp.status_code != 200:
8            return None
9        soup = BeautifulSoup(resp.text, "lxml")
10        title_el = soup.select_one("span#productTitle")
11        price_el = (
12            soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
13            or soup.select_one("span.priceToPay .a-offscreen")
14            or soup.select_one(".apexPriceToPay .a-offscreen")
15        )
16        rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17        reviews_el = soup.select_one("span#acrCustomerReviewText")
18        avail_el = soup.select_one("div#availability span")
19        img_el = soup.select_one("#landingImage")
20        return {
21            "asin": asin,
22            "title": title_el.get_text(strip=True) if title_el else None,
23            "price": price_el.get_text(strip=True) if price_el else None,
24            "rating": rating_el.get_text(strip=True) if rating_el else None,
25            "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
26            "availability": avail_el.get_text(strip=True) if avail_el else None,
27            "image_url": img_el.get("src") if img_el else None,
28            "url": url,
29        }
30    except Exception as e:
31        print(f"Błąd podczas scrapowania {asin}: {e}")
32        return None
33# Scrapuj wszystkie zebrane ASIN-y
34products = []
35for i, asin in enumerate(asins):
36    print(f"Scrapowanie {i+1}/{len(asins)}: {asin}")
37    product = scrape_product(asin)
38    if product:
39        products.append(product)
40    time.sleep(random.uniform(2, 5))  # Losowa przerwa między żądaniami
41df = pd.DataFrame(products)
42print(f"\nPomyślnie zeskrobano {len(df)} produktów")
43print(df.head())

Losowa przerwa 2–5 sekund jest kluczowa. Idealnie regularne odstępy (np. dokładnie 3 sekundy za każdym razem) wyglądają podejrzanie dla behawioralnej analizy Amazona. Losowe interwały naśladują ludzkie zachowanie podczas przeglądania.

Krok 6: Zapisz dane Amazon do CSV

1df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
2print("Zapisano do amazon_products.csv")

Powinieneś teraz mieć czysty plik CSV z kolumnami ASIN, tytuł, cena, ocena, liczba opinii, dostępność, URL obrazu i URL produktu. To miejsce, w którym większość poradników się kończy — ale jeśli budujesz prawdziwy workflow, CSV to dopiero początek.

Dogłębnie o antyblokadzie: jak utrzymać scraper w działaniu

Blokada to dla każdego, kto próbuje scrapować produkty Amazon w Pythonie. Sześciowarstwowa ochrona Amazona obejmuje analizę reputacji IP, fingerprinting TLS, sprawdzanie środowiska przeglądarki, biometrę behawioralną, CAPTCHA oraz wykrywanie anomalii oparte na ML. Poniżej znajdziesz wielowarstwową strategię, która odpowiada na każdy z tych mechanizmów.

Rotacja User-Agentów i pełnych nagłówków

Jeden statyczny User-Agent szybko zostaje oznaczony. Rotuj między aktualnymi stringami przeglądarek:

1import random
2USER_AGENTS = [
3    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
4    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
5    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
6    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
7]
8def get_headers():
9    return {
10        "User-Agent": random.choice(USER_AGENTS),
11        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
12        "Accept-Language": "en-US,en;q=0.9",
13        "Accept-Encoding": "gzip, deflate, br",
14        "Referer": "https://www.google.com/",
15        "DNT": "1",
16        "Connection": "keep-alive",
17    }

Jedna ważna rzecz, która często sprawia kłopot: Accept-Language musi odpowiadać lokalizacji wynikającej z Twojego IP. Wysyłanie Accept-Language: en-US z niemieckiego IP to sygnał ostrzegawczy.

Imitacja fingerprintu TLS z curl_cffi

Powyżej omawialiśmy to w kroku 2, ale warto podkreślić: to pojedyncze rozwiązanie daje największy wzrost skuteczności. Standardowy Python requests osiąga około 2% skuteczności na Amazonie. Z imitacją w curl_cffi jesteś mniej więcej na poziomie 94%. Różnica między działającym a zepsutym scraperem.

1from curl_cffi import requests as cfreq
2# Rotuj także targety imitacji
3BROWSERS = ["chrome120", "chrome124", "chrome131"]
4response = cfreq.get(
5    url,
6    headers=get_headers(),
7    impersonate=random.choice(BROWSERS),
8)

Rotacja proxy

Przy scrapowaniu większej liczby stron potrzebujesz rotacji proxy. Amazon śledzi adresy IP i zablokuje każdy pojedynczy IP, który wysyła zbyt wiele żądań.

1PROXIES = [
2    "http://user:pass@proxy1.example.com:8080",
3    "http://user:pass@proxy2.example.com:8080",
4    "http://user:pass@proxy3.example.com:8080",
5]
6proxy = random.choice(PROXIES)
7response = cfreq.get(
8    url,
9    headers=get_headers(),
10    impersonate="chrome124",
11    proxies={"http": proxy, "https": proxy},
12)

Proxy residential są skuteczniejsze niż proxy data center (Amazon proaktywnie blokuje zakresy IP centrów danych), ale są też droższe. Przy mniejszym projekcie możesz zacząć od i skalować się w miarę potrzeb.

Limitowanie żądań i exponential backoff

Żaden z konkurencyjnych artykułów, które sprawdziłem, tego nie uwzględnia, a to kluczowe. Gdy dostaniesz odpowiedź 503 albo CAPTCHA, nie próbuj ponawiać od razu — to najszybsza droga do trwałej blokady.

1import time
2import random
3def fetch_with_backoff(url, max_retries=3):
4    """Pobiera URL z exponential backoff przy błędzie."""
5    for attempt in range(max_retries):
6        response = cfreq.get(
7            url,
8            headers=get_headers(),
9            impersonate=random.choice(BROWSERS),
10        )
11        if response.status_code == 200:
12            return response
13        # Exponential backoff z losowym odchyleniem
14        wait = min(2 ** attempt + random.uniform(0, 1), 30)
15        print(f"Próba {attempt+1} nie powiodła się ({response.status_code}). Czekam {wait:.1f}s...")
16        time.sleep(wait)
17    return None  # Wyczerpano wszystkie próby

Wzór wait = min(2^attempt + jitter, max_delay) sprawia, że opóźnienia rosną (2 s, 4 s, 8 s...), ale nie przekraczają rozsądnego limitu. Losowy jitter utrudnia wykrycie wzorca ponowień.

Selenium lub Playwright jako fallback dla treści renderowanej przez JS

Niektóre strony Amazon (zwłaszcza te z dynamicznymi widgetami cenowymi lub selektorami wariantów) wymagają pełnego renderowania JavaScriptem. Gdy curl_cffi zwraca niepełny HTML, fallbackiem jest headless browser:

1from playwright.sync_api import sync_playwright
2def scrape_with_browser(url):
3    with sync_playwright() as p:
4        browser = p.chromium.launch(headless=True)
5        page = browser.new_page()
6        page.goto(url, wait_until="domcontentloaded")
7        page.wait_for_timeout(3000)  # Daj JS czas na render
8        html = page.content()
9        browser.close()
10        return html

To rozwiązanie jest wolniejsze — 3–5 sekund na stronę zamiast poniżej 1 sekundy w curl_cffi. Używaj go tylko wtedy, gdy to konieczne.

Z mojego doświadczenia curl_cffi obsługuje ponad 90% stron produktów Amazon bez użycia przeglądarki.

Podsumowanie antyblokady

TechnikaTrudnośćSkutecznośćCzy większość poradników to omawia?
Własny User-Agentłatwaniska (Amazon wykrywa wzorce)tak
Rotacja pełnych nagłówkówłatwaśredniarzadko
Imitacja TLS (curl_cffi)średniawysoka (~94% skuteczności)prawie nigdy
Rotacja proxyśredniawysokapobieżnie, jeśli w ogóle
Limitowanie żądań + exponential backoffłatwaśrednianie
Fallback do Selenium/Playwrightśredniawysoka (dla treści JS)wspominane, ale nie pokazane

Poza CSV: eksport danych Amazon do Google Sheets, Airtable i innych narzędzi

Każdy poradnik, który sprawdziłem, kończy się na eksporcie do CSV. Tymczasem prawdziwe procesy biznesowe wymagają danych w Google Sheets, bazach danych albo narzędziach takich jak Airtable i Notion.

Eksport do Google Sheets z gspread

Najpierw skonfiguruj konto usługowe Google (jednorazowo):

  1. Przejdź do → APIs & Services → Credentials
  2. Utwórz konto usługowe i pobierz plik klucza JSON
  3. Zapisz go jako ~/.config/gspread/service_account.json
  4. Udostępnij docelowy arkusz adresowi client_email z pliku JSON

Następnie:

1import gspread
2from gspread_dataframe import set_with_dataframe
3gc = gspread.service_account()
4sh = gc.open("Amazon Scrape Data")
5worksheet = sh.sheet1
6set_with_dataframe(worksheet, df)
7print("Dane wyeksportowane do Google Sheets!")

To zapisze cały Twój DataFrame bezpośrednio do arkusza Google — na żywo, do udostępniania i gotowe do dashboardów.

Zapis do SQLite do lokalnej analizy

Dla większych zbiorów danych lub śledzenia historii SQLite sprawdza się idealnie — bez konfiguracji serwera, tylko jeden plik:

1import sqlite3
2conn = sqlite3.connect("amazon_products.db")
3df.to_sql("products", conn, if_exists="append", index=False)
4print(f"Zapisano {len(df)} produktów w SQLite")
5# Późniejsze zapytanie:
6historical = pd.read_sql_query(
7    "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
8    conn,
9)

Alternatywa bez kodu

Jeśli nie chcesz utrzymywać skryptów eksportowych w Pythonie, oferuje darmowy eksport do Google Sheets, Airtable, Notion, Excela, CSV i JSON — w tym pól obrazów, które renderują się bezpośrednio w Airtable i Notion. Bez konfiguracji gspread, bez danych API, bez kodu. Dla zespołów, które chcą przepływu danych do już używanych narzędzi, to ogromna oszczędność czasu.

Harmonogram automatycznego scrapowania Amazon — brakujący rozdział

Monitorowanie cen i stanów magazynowych wymaga cyklicznych uruchomień scrapera, a nie jednorazowych akcji. Mimo to nie udało mi się znaleźć ani jednego konkurencyjnego artykułu, który omawiałby harmonogramowanie. Oto, jak zautomatyzować scrapera w Pythonie.

Cron (Linux/macOS)

Otwórz crontab:

1crontab -e

Dodaj linię uruchamiającą scraper codziennie o 6:00 rano:

10 6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Albo co 6 godzin:

10 */6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Windows Task Scheduler

Utwórz plik wsadowy run_scraper.bat:

1@echo off
2cd /d "C:\path\to\amazon-scraper"
3call venv\Scripts\activate
4python scraper.py
5deactivate

Następnie otwórz Harmonogram zadań → Utwórz zadanie podstawowe → ustaw wyzwalacz (Daily, Hourly) → Akcja: „Start a program” → wskaż run_scraper.bat.

GitHub Actions (darmowy plan)

Dla harmonogramu w chmurze bez własnej infrastruktury:

1name: Amazon Scraper
2on:
3  schedule:
4    - cron: "0 6 * * *"  # Codziennie o 6:00 UTC
5  workflow_dispatch:       # Ręczne uruchomienie
6jobs:
7  scrape:
8    runs-on: ubuntu-latest
9    steps:
10      - uses: actions/checkout@v3
11      - name: Set up Python
12        uses: actions/setup-python@v4
13        with:
14          python-version: "3.11"
15      - name: Install dependencies
16        run: pip install -r requirements.txt
17      - name: Run scraper
18        run: python scraper.py
19      - name: Commit results
20        run: |
21          git config user.name 'GitHub Actions'
22          git config user.email 'actions@github.com'
23          git add data/
24          git diff --staged --quiet || git commit -m "Update scraped data"
25          git push

Przechowuj dane proxy w GitHub Secrets, a zyskasz darmowy, zautomatyzowany pipeline do scrapowania.

Alternatywa bez kodu: Scheduled Scraper w Thunderbit

Dla zespołów, które nie chcą zajmować się składnią crona ani infrastrukturą chmurową, Thunderbit oferuje wbudowany . Opisujesz harmonogram zwykłym językiem (np. „co dzień o 8 rano” albo „w każdy poniedziałek”), dodajesz adresy URL Amazon i klikasz „Schedule”. Bez terminala, bez plików YAML, bez pipeline’u wdrożeniowego. To szczególnie przydatne dla zespołów e-commerce prowadzących ciągłe monitorowanie cen lub stanów magazynowych.

Python DIY vs. Scraper API vs. no-code: które podejście wybrać?

To pytanie widuję na forach cały czas, a żaden artykuł z czołówki wyników nie daje na nie uporządkowanej odpowiedzi. Oto więc moja szczera opinia:

KryteriumPython + BS4/curl_cffiScraper API (ScraperAPI, Oxylabs)No-code (Thunderbit)
Czas konfiguracji30–60 min10–20 minokoło 2 min
Wymagany kodtak (Python)tak (wywołania API)nie
Wbudowana antyblokadanie (samodzielnie)taktak
Obsługa renderowania JStylko z Selenium/Playwrightzależy od dostawcytak (tryb Browser lub Cloud)
Harmonogramsamodzielnie (cron/chmura)niektóre oferująwbudowany
Kosztdarmowe (+ koszty proxy)30–100+ USD/mies.dostępny darmowy plan
Utrzymaniewysokie (psujące się selektory)niskiebrak (AI się dostosowuje)
Najlepsze dladeweloperów chcących pełnej kontroliskalowania i niezawodności przy dużej skaliszybkości, osób nietechnicznych, użytkowników biznesowych

Python będzie najlepszy, jeśli chcesz się uczyć, dopasować każdy szczegół i nie przeszkadza Ci bieżące utrzymanie. Scraper API przejmują antyblokadę za Ciebie, ale nadal wymagają kodu. Z kolei Thunderbit to najszybsza droga dla sprzedaży, e-commerce i każdego, kto po prostu potrzebuje danych — bez selektorów, bez kodu i bez naprawiania skryptu, gdy Amazon zmieni HTML.

Jak Thunderbit scrapuje produkty Amazon w 2 kliknięciach

Jasne, jestem stronniczy — mój zespół to zbudował. Ale ten proces naprawdę jest tak prosty:

  1. Zainstaluj
  2. Otwórz stronę wyników wyszukiwania lub stronę produktu Amazon
  3. Kliknij „AI Suggest Fields” (albo użyj gotowego szablonu scrapera Amazon)
  4. Kliknij „Scrape”

AI Thunderbit odczytuje stronę, rozpoznaje strukturę danych i wyciąga wszystko do czytelnej tabeli. Możesz bezpłatnie eksportować do Excela, Google Sheets, Airtable lub Notion. Największa zaleta: gdy Amazon zmieni HTML w przyszłym tygodniu (a zmieni), AI Thunderbit dostosuje się automatycznie. Bez zepsutych skryptów, bez aktualizacji selektorów.

Do wzbogacania list produktów o dane ze stron szczegółowych funkcja Subpage Scraping w Thunderbit automatycznie przechodzi do stron produktów i pobiera dodatkowe pola, takie jak obrazy, opisy i warianty — a w Pythonie wymaga to znacznie więcej kodu.

Wskazówki, jak utrzymać scraper Amazona w Pythonie przez długi czas

Jeśli wybierasz ścieżkę Pythona, oto jak ograniczyć problemy z utrzymaniem:

  • Regularnie sprawdzaj selektory. Amazon często je zmienia. Zapisz ten artykuł w zakładkach — będę aktualizować tabelę selektorów wraz ze zmianami.
  • Monitoruj skuteczność. Śledź proporcję odpowiedzi 200 do 503/CAPTCHA. Ustaw alert (nawet prostego maila), gdy skuteczność spadnie poniżej 80%.
  • Zapisuj surowy HTML. Zachowuj pełną odpowiedź HTML obok sparsowanych danych. Jeśli selektory się zmienią, możesz ponownie sparsować dane historyczne bez ponownego scrapowania.
  • Często rotuj proxy i User-Agenty. Statyczne fingerprinty są wykrywane w skali już po kilku godzinach.
  • Stosuj exponential backoff. Nigdy nie ponawiaj od razu po blokadzie.
  • Korzystaj z Dockera. Spakuj scraper do kontenera Docker, żeby łatwo wdrażać go i przenosić między środowiskami.
  • Dodaj walidację danych. Sprawdzaj, czy ceny są liczbami, oceny mieszczą się w zakresie 1–5, a tytuły nie są puste. Jeden zespół odnotował po dodaniu warstw walidacji.

A jeśli wszystko to brzmi jak więcej pracy, niż chciałeś, rozważ, czy narzędzie no-code, takie jak Thunderbit, nie będzie lepsze dla Twojego przypadku. Nie ma nic złego w wybraniu szybszej drogi — spędziłem wystarczająco dużo lat na debugowaniu scraperów, żeby wiedzieć, że czasem najlepszy kod to ten, którego nie trzeba pisać.

Aspekty prawne i etyczne scrapowania Amazon

Ponieważ temat wraca przy każdej rozmowie o scrapowaniu Amazon, krótka uwaga o sytuacji prawnej:

  • Scrapowanie publicznie dostępnych danych jest w USA zasadniczo legalne. Przełomowy wyrok (2022) potwierdził, że dostęp do publicznych danych nie narusza CFAA. Później (2024) i (2024) wzmocniły tę zasadę.
  • Regulamin Amazona zakazuje automatycznego dostępu. To sprawa cywilna (naruszenie umowy), a nie karna. Sądy zwykle rozróżniają te dwa poziomy.
  • Amazon v. Perplexity (2025) tocząca się sprawa dotycząca scrapowania stron Amazon przez AI. W marcu 2026 wydano wstępny nakaz sądowy. Warto to śledzić.
  • Trzymaj się stron publicznych. Nie scrapuj treści chronionych logowaniem, danych osobowych ani niczego, co wymaga uwierzytelnienia.
  • Szanuj limity. Nie zasypuj serwerów Amazona żądaniami. Opóźnienie 2–5 sekund między zapytaniami jest rozsądne.
  • Używaj danych odpowiedzialnie. Scrapuj do analizy, nie do ponownej publikacji chronionych treści.
  • Skonsultuj się z prawnikiem przy dużych wdrożeniach komercyjnych, zwłaszcza jeśli działasz w UE (RODO ma zastosowanie do danych osobowych).

Więcej szczegółów znajdziesz w naszym poradniku o .

Podsumowanie

Masz już działający scraper Amazona w Pythonie z potwierdzonymi selektorami z 2025 roku, wielowarstwową strategią antyblokady, która wykracza daleko poza „dodaj User-Agent”, praktyczne opcje harmonogramowania do ciągłego monitorowania oraz metody eksportu danych do Google Sheets, baz danych i dowolnych narzędzi, których używa Twój zespół.

Szybkie podsumowanie:

  • Python + curl_cffi + BeautifulSoup daje pełną kontrolę i około 94% skuteczności w połączeniu z imitacją TLS
  • Antyblokada wymaga wielu warstw: rotacji nagłówków, imitacji TLS, rotacji proxy, limitowania żądań i exponential backoff
  • Harmonogramowanie zmienia jednorazowy skrypt w ciągły pipeline monitoringu (cron, GitHub Actions lub wbudowany scheduler Thunderbit)
  • Eksport poza CSV — Google Sheets, SQLite, Airtable, Notion — to miejsce, gdzie powstaje realna wartość biznesowa
  • Thunderbit oferuje alternatywę w 2 kliknięciach dla osób nietechnicznych lub każdego, kto woli poświęcić czas na analizę danych zamiast debugowanie selektorów

Jeśli chcesz przetestować kod, wszystko w tym poradniku jest gotowe do skopiowania i uruchomienia. A jeśli wolisz całkowicie pominąć kodowanie, pozwoli Ci od razu sprawdzić podejście no-code na Amazonie.

Więcej informacji znajdziesz w naszych poradnikach: , oraz . Możesz też obejrzeć instrukcje krok po kroku na .

Udanych zeskrobów — i oby Twoje selektory przetrwały do następnej aktualizacji Amazon.

FAQ

1. Dlaczego mój scraper Amazona w Pythonie zostaje zablokowany po kilku żądaniach?

Amazon korzysta z sześciowarstwowego systemu obrony: analizy reputacji IP, fingerprintingu TLS (JA3/JA4), wykrywania środowiska przeglądarki, biometriki behawioralnej, CAPTCHA oraz wykrywania anomalii opartego na ML. Prosty skrypt requests z samym nagłówkiem User-Agent osiąga tylko około skuteczności. Potrzebujesz imitacji TLS (curl_cffi), pełnej rotacji nagłówków, rotacji proxy oraz limitowania żądań z losowym jitterem, żeby zachować stabilny dostęp.

2. Jakie biblioteki Pythona są najlepsze do scrapowania produktów Amazon w 2025 roku?

curl_cffi do żądań HTTP z imitacją TLS (największa pojedyncza poprawa), BeautifulSoup4 z lxml do parsowania HTML, pandas do strukturyzowania i eksportu danych oraz Selenium lub Playwright jako fallback dla treści renderowanej przez JavaScript. Python jest używany przez twórców scraperów.

3. Czy scrapowanie danych o produktach Amazon jest legalne?

Scrapowanie publicznie dostępnych danych jest w USA zasadniczo legalne, co potwierdzają wyroki takie jak hiQ v. LinkedIn i Meta v. Bright Data. Regulamin Amazona zabrania automatycznego dostępu, ale sądy odróżniają naruszenie regulaminu (cywilne) od naruszenia prawa karnego. Zawsze unikaj treści chronionych logowaniem, szanuj limity i skonsultuj się z prawnikiem przy dużych projektach komercyjnych.

4. Czy mogę scrapować Amazon bez pisania kodu?

Tak. Narzędzia takie jak pozwalają scrapować produkty Amazon w 2 kliknięciach dzięki rozszerzeniu Chrome. AI automatycznie wykrywa pola i porządkuje dane, a następnie możesz bezpłatnie eksportować je do Excela, Google Sheets, Airtable lub Notion. Gdy Amazon zmieni HTML, AI Thunderbit dostosuje się bez ręcznych aktualizacji.

5. Jak często Amazon zmienia selektory HTML i jak utrzymać scraper w aktualności?

Często i bez ostrzeżenia. Społeczność scrapingowa raportuje, że crawlerów wymaga tygodniowych poprawek z powodu zmian w DOM. Aby wyprzedzać zmiany, monitoruj skuteczność scrapera, zapisuj surowy HTML do ponownego parsowania i regularnie porównuj selektory z żywymi stronami. Alternatywnie narzędzia oparte na AI, takie jak Thunderbit, dostosowują się automatycznie, eliminując ten ciężar utrzymania.

Dowiedz się więcej

Spis treści

Wypróbuj Thunderbit

Pobieraj leady i inne dane w zaledwie 2 kliknięcia. Napędzane przez AI.

Pobierz Thunderbit To za darmo
Wyciągaj dane z pomocą AI
Łatwo przenieś dane do Google Sheets, Airtable lub Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week