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życia | Kto korzysta | Jakie dane pobiera |
|---|---|---|
| Monitorowanie cen i repricing | operacje e-commerce, sprzedawcy na marketplace | ceny, dostępność, informacje o sprzedawcy |
| Analiza konkurencji | menedżerowie produktu, zespoły marki | cechy produktów, oceny, liczba opinii |
| Badania rynku | analitycy, zespoły nowych produktów | trendy kategorii, rozkład cen |
| Generowanie leadów | zespoły sprzedaży | nazwy sprzedawców, informacje o marce, dane kontaktowe |
| Marketing afiliacyjny | twórcy treści, serwisy z okazjami | ceny, promocje, szczegóły produktów |
| Śledzenie stanów magazynowych | łańcuch dostaw, zaopatrzenie | status 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ć.

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:
| Biblioteka | Zastosowanie | Dlaczego jej używamy |
|---|---|---|
requests | żądania HTTP | prosta, szeroko wspierana |
beautifulsoup4 | parsowanie HTML | łatwe wyciąganie danych przez selektory CSS |
lxml | szybki parser HTML | używany jako backend parsera BeautifulSoup |
curl_cffi | imitacja TLS fingerprint | kluczowe do obejścia wykrywania Amazona |
pandas | porządkowanie i eksport danych | DataFrame, eksport do CSV/Excel |
Opcjonalnie (dla treści renderowanej przez JavaScript):
seleniumlubplaywright— 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.

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 danych | Niedziałający selektor (przed 2024) | Działający selektor 2025 |
|---|---|---|
| Cena | #priceblock_ourprice | div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen |
| Tytuł | #productTitle | span#productTitle (wciąż działa) |
| Ocena | span.a-icon-alt (czasem zły kontekst) | #acrPopover span.a-icon-alt |
| Liczba opinii | #acrCustomerReviewCount | span#acrCustomerReviewText |
| Dostępność | #availability span | div#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
| Technika | Trudność | Skuteczność | Czy większość poradników to omawia? |
|---|---|---|---|
| Własny User-Agent | łatwa | niska (Amazon wykrywa wzorce) | tak |
| Rotacja pełnych nagłówków | łatwa | średnia | rzadko |
| Imitacja TLS (curl_cffi) | średnia | wysoka (~94% skuteczności) | prawie nigdy |
| Rotacja proxy | średnia | wysoka | pobieżnie, jeśli w ogóle |
| Limitowanie żądań + exponential backoff | łatwa | średnia | nie |
| Fallback do Selenium/Playwright | średnia | wysoka (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):
- Przejdź do → APIs & Services → Credentials
- Utwórz konto usługowe i pobierz plik klucza JSON
- Zapisz go jako
~/.config/gspread/service_account.json - Udostępnij docelowy arkusz adresowi
client_emailz 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:
| Kryterium | Python + BS4/curl_cffi | Scraper API (ScraperAPI, Oxylabs) | No-code (Thunderbit) |
|---|---|---|---|
| Czas konfiguracji | 30–60 min | 10–20 min | około 2 min |
| Wymagany kod | tak (Python) | tak (wywołania API) | nie |
| Wbudowana antyblokada | nie (samodzielnie) | tak | tak |
| Obsługa renderowania JS | tylko z Selenium/Playwright | zależy od dostawcy | tak (tryb Browser lub Cloud) |
| Harmonogram | samodzielnie (cron/chmura) | niektóre oferują | wbudowany |
| Koszt | darmowe (+ koszty proxy) | 30–100+ USD/mies. | dostępny darmowy plan |
| Utrzymanie | wysokie (psujące się selektory) | niskie | brak (AI się dostosowuje) |
| Najlepsze dla | deweloperów chcących pełnej kontroli | skalowania i niezawodności przy dużej skali | szybkoś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:
- Zainstaluj
- Otwórz stronę wyników wyszukiwania lub stronę produktu Amazon
- Kliknij „AI Suggest Fields” (albo użyj gotowego szablonu scrapera Amazon)
- 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