Πώς κάνω Scrape τις κριτικές του Amazon με Python (ξεπερνώντας το login wall)

Τελευταία ενημέρωση στις April 16, 2026

Ο scraper μου για τις κριτικές του Amazon δούλευε μια χαρά για έξι εβδομάδες — και μετά, ένα πρωί, μου γύρισε 200 OK και μια σελίδα γεμάτη άδειο χώρο. Χωρίς σφάλμα, χωρίς CAPTCHA, μόνο κενό HTML εκεί που μέχρι χθες υπήρχαν εκατοντάδες κριτικές.

Αν σου ακούγεται γνώριμο, δεν είσαι ο μόνος. Στα τέλη του 2025, η Amazon άρχισε να κλείνει το πλήρες περιεχόμενο των σελίδων κριτικών πίσω από ένα login wall, και χιλιάδες Python scraping scripts σταμάτησαν να δουλεύουν από τη μια μέρα στην άλλη. Τους τελευταίους μήνες στο ασχολήθηκα με το πρόβλημα και από τις δύο πλευρές — χτίζοντας το δικό μας AI scraper αλλά και συντηρώντας το δικό μου Python pipeline για κριτικές — οπότε σκέφτηκα πως ήρθε η ώρα να γράψω τον οδηγό που θα ήθελα να είχα όταν το script μου «έσβησε». Σε αυτό το άρθρο θα δεις τη λύση που πραγματικά δουλεύει: authentication με cookies, σταθερά selectors που αντέχουν την CSS obfuscation της Amazon, τρόπους να ξεπεράσεις το όριο των 10 σελίδων, αντι-bot άμυνα, και στο τέλος ένα bonus τμήμα για sentiment analysis που μετατρέπει το ωμό κείμενο των κριτικών σε χρήσιμα business insights. Και αν στη μέση πεις «δεν θέλω να συντηρώ όλον αυτόν τον κώδικα», θα σου δείξω πώς το κάνει την ίδια δουλειά σε περίπου δύο λεπτά, χωρίς Python.

Τι είναι το Amazon review scraping και γιατί έχει σημασία;

Το Amazon review scraping είναι η διαδικασία με την οποία εξάγουμε προγραμματισμένα δεδομένα από κριτικές πελατών — βαθμολογίες αστέρων, κείμενο κριτικής, ονόματα συντακτών, ημερομηνίες, σήμανση για verified purchase — από σελίδες προϊόντων της Amazon. Από τη στιγμή που η Amazon (και δεν το επανέφερε ποτέ), το web scraping είναι ο μόνος προγραμματιστικός δρόμος προς αυτά τα δεδομένα.

Τα νούμερα το επιβεβαιώνουν. , ενώ . Η εμφάνιση μόλις 5 κριτικών σε μια σελίδα προϊόντος μπορεί να . Οι εταιρείες που αναλύουν συστηματικά το sentiment των κριτικών βλέπουν . Δεν μιλάμε για αφηρημένα data science σενάρια — μιλάμε για ανταγωνιστική πληροφόρηση, σήματα βελτίωσης προϊόντος και γλώσσα marketing, όλα γραμμένα καθαρά στους servers της Amazon.

Γιατί να κάνεις scrape τις κριτικές του Amazon με Python

Η Python παραμένει η πιο φυσική επιλογή για αυτή τη δουλειά. Είναι η , και το οικοσύστημά της — requests, BeautifulSoup, pandas, Scrapy — κάνει το web scraping προσιτό ακόμα και σε όσους δεν είναι full-time developers.

Διαφορετικές ομάδες αξιοποιούν αυτά τα δεδομένα με διαφορετικό τρόπο:

ΟμάδαΧρήσηΤι εξάγουν
Product / R&DΕντοπισμός επαναλαμβανόμενων παραπόνων, προτεραιοποίηση διορθώσεωνΚείμενο 1–2 αστέρων, συχνότητα λέξεων-κλειδιών
SalesΠαρακολούθηση sentiment σε ανταγωνιστικά προϊόνταΒαθμολογίες, τάσεις όγκου κριτικών
MarketingΕύρεση φράσεων πελατών για ad copyΘετικές φράσεις από reviews, αναφορές σε χαρακτηριστικά
Ecommerce OpsΠαρακολούθηση του sentiment του δικού τους προϊόντος με την πάροδο του χρόνουΚατανομή αστεριών, ποσοστό verified purchase
Market ResearchΣύγκριση ηγετών κατηγορίας ανά χαρακτηριστικόΣύνολα κριτικών από πολλαπλά ASINs

Μια εταιρεία μαγειρικών σκευών , αναδιαμόρφωσε το προϊόν και ξαναπήρε την 1η θέση Best Seller μέσα σε 60 ημέρες. Μια εταιρεία fitness tracker , βρήκε θέμα αλλεργίας στο latex, λάνσαρε υποαλλεργική έκδοση και μείωσε τις επιστροφές κατά 40%. Αυτό είναι το είδος ROI που δικαιολογεί την τεχνική προσπάθεια.

Login wall: γιατί σταμάτησε να δουλεύει ο Amazon review scraper σου

Στις 14 Νοεμβρίου 2024, . Η αλλαγή επιβεβαιώθηκε σε και σε . Αν ανοίξεις το /product-reviews/{ASIN}/ σε ανώνυμη καρτέλα, θα ανακατευθυνθείς σε σελίδα σύνδεσης αντί να δεις δεδομένα κριτικών.

python-web-scraping-diagram.webp

Τα συμπτώματα είναι ύπουλα: το script παίρνει απάντηση 200 OK, αλλά το HTML body περιέχει φόρμα login (name="email", id="ap_password") αντί για κριτικές. Χωρίς error code. Χωρίς CAPTCHA. Απλώς... τίποτα χρήσιμο.

Η Amazon το έκανε για anti-bot λόγους και για λόγους regional compliance. Η εφαρμογή του μέτρου δεν είναι πάντα ίδια — μερικές φορές ένα καθαρό browser window φορτώνει λίγες κριτικές πριν εμφανιστεί το wall, ειδικά στην πρώτη σελίδα — αλλά για οποιονδήποτε scraper σε κλίμακα, πρέπει να θεωρείς ότι το wall είναι πάντα ενεργό.

Διαφορετικά country domains της Amazon (.de, .co.uk, .co.jp) εφαρμόζουν το wall ανεξάρτητα. Όπως το έθεσε ένας χρήστης σε forum: «χρειάζεται login για κάθε χώρα». Τα cookies του .com δεν λειτουργούν στο .co.uk.

Οι σελίδες προϊόντων της Amazon (/dp/{ASIN}/) εξακολουθούν να εμφανίζουν περίπου χωρίς authentication. Αυτές είναι επιλεγμένες από τον αλγόριθμο της Amazon και είναι χρήσιμες για γρήγορο έλεγχο sentiment, αλλά δεν ταξινομούνται, δεν φιλτράρονται και δεν έχουν pagination.

Οι πλήρεις σελίδες κριτικών (/product-reviews/{ASIN}/) — με ταξινόμηση ανά νεότερες, φίλτρα ανά αστέρια και pagination σε εκατοντάδες reviews — απαιτούν login.

Αν χρειάζεσαι μόνο λίγες κριτικές για ένα γρήγορο pulse check, κάνε scrape τη σελίδα του προϊόντος. Αν θέλεις εκατοντάδες ή χιλιάδες, θα χρειαστεί να χειριστείς authentication.

Τι χρειάζεσαι πριν ξεκινήσεις: Python setup και libraries

Πριν γράψουμε κώδικα, ας δούμε το setup:

  • Δυσκολία: Μεσαία (άνεση με Python, βασική γνώση HTML)
  • Χρόνος που χρειάζεται: ~45 λεπτά για το πλήρες pipeline· ~10 λεπτά για βασικό scrape
  • Τι θα χρειαστείς: Python 3.8+, Chrome browser, έγκυρο Amazon account

Εγκατάστησε τα βασικά libraries:

1pip install requests beautifulsoup4 lxml pandas textblob

Προαιρετικά (για πιο προχωρημένο sentiment analysis):

1pip install transformers torch

Τι είναι το ASIN; Είναι το 10-ψήφιο προϊόντικό αναγνωριστικό της Amazon. Θα το βρεις σε κάθε product URL — για παράδειγμα, στο amazon.com/dp/B0BCNKKZ91, το ASIN είναι B0BCNKKZ91. Αυτό είναι το κλειδί που θα βάλεις στο review URL.

Βήμα 1: Πέρασε το login wall με authentication μέσω cookies

Η πιο αξιόπιστη προσέγγιση είναι να συνδεθείς στην Amazon από τον browser σου, να αντιγράψεις τα session cookies και να τα περάσεις στο requests.Session() της Python. Έτσι αποφεύγεις τα CAPTCHAs και το SMS 2FA που συχνά μπλοκάρουν τη login αυτοματοποίηση με Selenium.

Χρειάζεσαι αυτά τα επτά cookies:

Όνομα cookieΣκοπός
session-idΑναγνωριστικό συνεδρίας που ανανεώνεται
session-id-timeΧρονική σήμανση συνεδρίας
session-tokenToken συνεδρίας που ανανεώνεται
ubid-mainΑναγνωριστικό περιήγησης χρήστη
at-mainΚύριο auth token
sess-at-mainAuth token για τη συγκεκριμένη συνεδρία
x-mainΑναγνωριστικό δεμένο με το email του χρήστη

Πώς να εξαγάγεις cookies από το Chrome DevTools

  1. Συνδέσου στο amazon.com από το Chrome
  2. Άνοιξε το DevTools (F12 ή δεξί κλικ → Inspect)
  3. Πήγαινε ApplicationStorageCookieshttps://www.amazon.com
  4. Βρες κάθε cookie από τον πίνακα και αντέγραψε την τιμή του
  5. Μορφοποίησέ τα ως string με διαχωριστικό ; για την Python

Ρύθμισε το session έτσι:

1import requests
2session = requests.Session()
3# Επικόλλησε εδώ τις τιμές των cookies σου
4cookies = {
5    "session-id": "YOUR_SESSION_ID",
6    "session-id-time": "YOUR_SESSION_ID_TIME",
7    "session-token": "YOUR_SESSION_TOKEN",
8    "ubid-main": "YOUR_UBID_MAIN",
9    "at-main": "YOUR_AT_MAIN",
10    "sess-at-main": "YOUR_SESS_AT_MAIN",
11    "x-main": "YOUR_X_MAIN",
12}
13headers = {
14    "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",
15    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
16    "Accept-Language": "en-US,en;q=0.5",
17}
18session.cookies.update(cookies)
19session.headers.update(headers)

Σημαντικό: Χρησιμοποίησε το ίδιο session object σε όλα τα requests. Έτσι τα cookies παραμένουν συνεπή και η συμπεριφορά μοιάζει περισσότερο με πραγματικό browser session. Τα cookies συνήθως διαρκούν από μέρες έως εβδομάδες υπό scraping φορτίο, αλλά αν ξαναδείς redirects προς login, ανανέωσέ τα από τον browser σου.

Για marketplaces εκτός .com, τα ονόματα των cookies αλλάζουν ελαφρώς — το amazon.de χρησιμοποιεί at-acbde αντί για at-main, το amazon.co.uk χρησιμοποιεί at-acbuk και ούτω καθεξής. Κάθε marketplace χρειάζεται το δικό του ανεξάρτητο session.

Βήμα 2: Φτιάξε το request και κάνε parse το HTML των reviews με BeautifulSoup

Το Amazon reviews URL ακολουθεί αυτό το μοτίβο:

1https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1

Η βασική συνάρτηση:

1from bs4 import BeautifulSoup
2import time, random
3def get_soup(session, url):
4    time.sleep(random.uniform(2, 5))  # Ευγενική καθυστέρηση
5    response = session.get(url, timeout=15)
6    # Ανίχνευση login wall
7    if "ap_email" in response.text or "Amazon Sign-In" in response.text:
8        raise Exception("Detected login wall — ανανέωσε τα cookies σου")
9    if response.status_code != 200:
10        raise Exception(f"HTTP {response.status_code}")
11    return BeautifulSoup(response.text, "lxml")

Ένα μικρό κόλπο που βοηθάει: πριν ανοίξεις τη σελίδα των reviews, επισκέψου πρώτα τη σελίδα του προϊόντος. Έτσι το session μοιάζει πιο φυσικό.

1# Πρώτα η σελίδα προϊόντος (προσομοιώνει φυσική περιήγηση)
2product_url = f"https://www.amazon.com/dp/{asin}"
3session.get(product_url, timeout=15)
4time.sleep(random.uniform(1, 3))
5# Μετά η σελίδα των reviews
6reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
7soup = get_soup(session, reviews_url)

Βήμα 3: Χρησιμοποίησε σταθερά selectors για να εξάγεις δεδομένα κριτικών (σταμάτα να βασίζεσαι σε CSS classes)

Εδώ είναι που τα περισσότερα tutorials του 2022–2023 αποτυγχάνουν. Η Amazon κρύβει τα ονόματα των CSS class — αλλάζουν κατά διαστήματα, και όπως έγραψε ένας απογοητευμένος developer σε forum thread: «κανένα δεν είχε κανένα κοινό μοτίβο στα ονόματα των class των span tags».

Η λύση: η Amazon χρησιμοποιεί data-hook attributes στα στοιχεία των reviews, και αυτά είναι αξιοσημείωτα σταθερά. Πρόκειται για semantic identifiers που χρησιμοποιεί και το frontend της Amazon, οπότε δεν τυχαίoποιούνται.

Πεδίο reviewΣταθερό selector (data-hook)Εύθραυστο selector (class)
Κείμενο review[data-hook="review-body"].review-text-content (αλλάζει)
Βαθμολογία αστεριών[data-hook="review-star-rating"].a-icon-alt (αμφίσημο)
Τίτλος review[data-hook="review-title"].review-title (μερικές φορές)
Όνομα συγγραφέαspan.a-profile-nameΣχετικά σταθερό
Ημερομηνία review[data-hook="review-date"].review-date (εξαρτάται από την περιοχή)
Verified purchase[data-hook="avp-badge"]span.a-size-mini

Ο κώδικας εξαγωγής με data-hook selectors:

1import re
2def extract_reviews(soup):
3    reviews = []
4    review_divs = soup.select('[data-hook="review"]')
5    for div in review_divs:
6        # Βαθμολογία αστεριών
7        rating_el = div.select_one('[data-hook="review-star-rating"]')
8        rating = None
9        if rating_el:
10            rating_text = rating_el.get_text(strip=True)
11            match = re.search(r'(\d\.?\d?)', rating_text)
12            if match:
13                rating = float(match.group(1))
14        # Τίτλος
15        title_el = div.select_one('[data-hook="review-title"]')
16        title = title_el.get_text(strip=True) if title_el else ""
17        # Κείμενο
18        body_el = div.select_one('[data-hook="review-body"]')
19        body = body_el.get_text(strip=True) if body_el else ""
20        # Συγγραφέας
21        author_el = div.select_one('span.a-profile-name')
22        author = author_el.get_text(strip=True) if author_el else ""
23        # Ημερομηνία και χώρα
24        date_el = div.select_one('[data-hook="review-date"]')
25        date_text = date_el.get_text(strip=True) if date_el else ""
26        # Μορφή: "Reviewed in the United States on January 15, 2025"
27        country_match = re.search(r'Reviewed in (.+?) on', date_text)
28        date_match = re.search(r'on (.+)$', date_text)
29        country = country_match.group(1) if country_match else ""
30        date = date_match.group(1) if date_match else ""
31        # Verified purchase
32        verified_el = div.select_one('[data-hook="avp-badge"]')
33        verified = bool(verified_el)
34        reviews.append({
35            "author": author,
36            "rating": rating,
37            "title": title,
38            "content": body,
39            "date": date,
40            "country": country,
41            "verified": verified,
42        })
43    return reviews

Το έχω τρέξει με αυτό το set selectors σε πολλαπλά ASINs για μήνες, και τα data-hook attributes δεν άλλαξαν ούτε μία φορά. Τα CSS classes, αντίθετα, άλλαξαν τουλάχιστον δύο φορές στο ίδιο διάστημα.

Βήμα 4: Διαχειρίσου το pagination και το όριο των 10 σελίδων της Amazon

Η Amazon περιορίζει το pageNumber σε 10 σελίδες με 10 reviews η καθεμία — ένα σκληρό ανώτατο όριο περίπου 100 reviews ανά συνδυασμό φίλτρων. Το κουμπί «Next page» απλώς εξαφανίζεται μετά τη σελίδα 10.

Βασικός βρόχος pagination:

1all_reviews = []
2for page in range(1, 11):
3    url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
4    soup = get_soup(session, url)
5    page_reviews = extract_reviews(soup)
6    if not page_reviews:
7        break  # Δεν υπάρχουν άλλες κριτικές σε αυτή τη σελίδα
8    all_reviews.extend(page_reviews)
9    print(f"Page {page}: {len(page_reviews)} reviews")

Πώς να πάρεις πάνω από 10 σελίδες Amazon reviews

Το workaround είναι το filter bucketing. Κάθε συνδυασμός filterByStar και sortBy παίρνει το δικό του ανεξάρτητο παράθυρο 10 σελίδων.

Τιμές star filter: one_star, two_star, three_star, four_star, five_star
Τιμές sort: recent, helpful (default)

Συνδυάζοντας και τα 5 star filters × 2 sort orders, μπορείς να φτάσεις έως 100 σελίδες, δηλαδή 1.000 reviews ανά προϊόν — και για προϊόντα με ανομοιόμορφη κατανομή αστεριών, συχνά θα πλησιάσεις το πλήρες σύνολο κριτικών.

1star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
2sort_orders = ["recent", "helpful"]
3all_reviews = []
4seen_titles = set()  # Απλό deduplication
5for star in star_filters:
6    for sort in sort_orders:
7        for page in range(1, 11):
8            url = (
9                f"https://www.amazon.com/product-reviews/{asin}"
10                f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
11            )
12            soup = get_soup(session, url)
13            page_reviews = extract_reviews(soup)
14            if not page_reviews:
15                break
16            for review in page_reviews:
17                # Deduplication με βάση title + author
18                key = (review["title"], review["author"])
19                if key not in seen_titles:
20                    seen_titles.add(key)
21                    all_reviews.append(review)
22            print(f"[{star}/{sort}] Page {page}: {len(page_reviews)} reviews")
23print(f"Total unique reviews: {len(all_reviews)}")

Θα υπάρχει επικάλυψη ανάμεσα στα buckets, οπότε το deduplication είναι απαραίτητο. Χρησιμοποιώ συνδυασμό από review title + author name ως γρήγορο key — όχι τέλειο, αλλά πιάνει τη συντριπτική πλειονότητα των duplicates.

Βήμα 5: Απόφυγε τα anti-bot μέτρα (rotation, throttling, retries)

Η Amazon χρησιμοποιεί AWS WAF Bot Control, και έχει γίνει πολύ πιο επιθετικό. Οι μονόπλευρες άμυνες (μόνο User-Agent rotation, μόνο καθυστερήσεις) δεν αρκούν πια.

ΤεχνικήΥλοποίηση
Rotation User-AgentsΤυχαία επιλογή από 10+ αληθινά browser strings
Exponential backoffΚαθυστερήσεις επανάληψης 2s → 4s → 8s στα 503
Throttling requestsrandom.uniform(2, 5) δευτερόλεπτα ανάμεσα στις σελίδες
Proxy rotationΕναλλαγή residential proxies
Session fingerprintΣυνεπή cookies + headers ανά session
TLS impersonationΧρήση curl_cffi αντί για stock requests σε production

Ένα production-ready retry wrapper:

1import time, random
2USER_AGENTS = [
3    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.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/147.0.0.0 Safari/537.36",
5    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
6    "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",
7    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
8]
9def scrape_with_retries(session, url, max_retries=3):
10    for attempt in range(max_retries):
11        try:
12            session.headers["User-Agent"] = random.choice(USER_AGENTS)
13            time.sleep(random.uniform(2, 5))
14            response = session.get(url, timeout=15)
15            # Ανίχνευση μπλοκαρίσματος
16            if "validateCaptcha" in response.url or "Robot Check" in response.text:
17                wait = (2 ** attempt) * 5
18                print(f"CAPTCHA detected. Waiting {wait}s...")
19                time.sleep(wait)
20                continue
21            if response.status_code in (429, 503):
22                wait = (2 ** attempt) * 2
23                print(f"Rate limited ({response.status_code}). Waiting {wait}s...")
24                time.sleep(wait)
25                continue
26            if "ap_email" in response.text:
27                raise Exception("Login wall — τα cookies έληξαν")
28            return BeautifulSoup(response.text, "lxml")
29        except Exception as e:
30            if attempt == max_retries - 1:
31                raise
32            print(f"Attempt {attempt + 1} failed: {e}")
33    return None

Μια σημείωση για τα proxies: η Amazon (AWS, GCP, Azure, DigitalOcean) στο επίπεδο του δικτύου. Αν κάνεις scrape πάνω από μερικές εκατοντάδες σελίδες, τα residential proxies είναι πρακτικά αναγκαία — υπολόγισε $50–200+/μήνα ανάλογα με τον όγκο. Για μικρότερα projects (κάτω από 100 requests/ημέρα), το προσεκτικό throttling από το home IP σου συνήθως δουλεύει καλά.

Η Amazon επίσης επιθεωρεί TLS fingerprints. Το stock requests της Python έχει ένα . Για production scrapers, σκέψου το curl_cffi, που μιμείται πραγματικά browser TLS stacks. Για scraping επιπέδου tutorial (μερικές εκατοντάδες σελίδες), το requests με σωστά headers συνήθως αρκεί.

Βήμα 6: Εξαγωγή των Amazon reviews σε CSV ή Excel

Μόλις μαζέψεις τις κριτικές σου, το να τις βάλεις σε αξιοποιήσιμη μορφή είναι απλό με pandas:

1import pandas as pd
2df = pd.DataFrame(all_reviews)
3df.to_csv("amazon_reviews.csv", index=False)
4print(f"Exported {len(df)} reviews to amazon_reviews.csv")

Παράδειγμα output:

authorratingtitlecontentdatecountryverified
Sarah M.5.0Καλύτερη αγορά της χρονιάςΗ μπαταρία κρατάει όλη μέρα, η οθόνη είναι υπέροχη...January 15, 2025the United StatesTrue
Mike T.2.0Απογοητεύτηκα μετά από 2 εβδομάδεςΗ θύρα φόρτισης σταμάτησε να λειτουργεί...February 3, 2025the United StatesTrue
Priya K.4.0Πολύ καλή αξία για τα χρήματαΚάνει ό,τι χρειάζομαι, μόνο μικρή καθυστέρηση σε βαριές εφαρμογές...March 10, 2025the United StatesFalse

Για export σε Excel: df.to_excel("amazon_reviews.xlsx", index=False) (χρειάζεται openpyxl).

Για Google Sheets, το gspread λειτουργεί, αλλά απαιτεί — δημιουργία project, ενεργοποίηση δύο APIs, δημιουργία service account credentials, sharing του sheet. Αν αυτό σου φαίνεται περισσότερη δουλειά από το ίδιο το scraping, δεν έχεις άδικο. (Αυτές είναι οι στιγμές που ένα εργαλείο όπως το , που κάνει export στο Google Sheets με ένα click, αρχίζει να φαίνεται πολύ ελκυστικό.)

Bonus: Πρόσθεσε sentiment analysis στις scraped κριτικές σου με 5 γραμμές Python

Τα περισσότερα tutorials για scraping σταματούν στο CSV export. Όμως το scoring του sentiment είναι αυτό που μετατρέπει τα ωμά δεδομένα σε επιχειρηματικές αποφάσεις.

Η πιο γρήγορη baseline λύση χρησιμοποιεί το TextBlob:

1from textblob import TextBlob
2df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)

Έτσι παίρνεις για κάθε review ένα polarity score από -1.0 (πολύ αρνητικό) έως +1.0 (πολύ θετικό). Παράδειγμα output:

content (περικομμένο)ratingsentiment
"Battery lasts all day, screen is gorgeous..."5.00.65
"The charging port stopped working after..."2.0-0.40
"Does everything I need, minor lag on..."4.00.25
"Absolute garbage. Returned immediately."1.0-0.75
"It's okay. Nothing special but works."3.00.10

Οι πιο ενδιαφέρουσες γραμμές είναι οι ασυμφωνίες — ένα review 3 αστέρων με θετικό κείμενο ή ένα review 5 αστέρων με αρνητική γλώσσα. Αυτές οι αποκλίσεις συχνά αποκαλύπτουν πιο λεπτές απόψεις πελατών που δεν φαίνονται μόνο από τη βαθμολογία.

ai-review-analysis.webp

Για ακρίβεια επιπέδου production, η πρόταση είναι το Hugging Face Transformers. Το , ενώ σε σύγκριση με τα lexicon tools. Το μοντέλο nlptown/bert-base-multilingual-uncased-sentiment μπορεί μάλιστα να προβλέψει απευθείας 1–5 αστέρια:

1from transformers import pipeline
2clf = pipeline("sentiment-analysis",
3               model="nlptown/bert-base-multilingual-uncased-sentiment")
4df["predicted_stars"] = df["content"].apply(
5    lambda x: int(clf(str(x)[:512])[0]["label"][0])
6)

Οι κριτικές της Amazon ακολουθούν κατανομή — μεγάλη αιχμή στα 5 αστέρια, μικρότερη στα 1 αστέρι και «κοιλιά» στη μέση. Αυτό σημαίνει ότι ο μέσος όρος βαθμολογίας συχνά είναι κακός δείκτης της πραγματικής ποιότητας του προϊόντος. Χώρισε το cluster των 1 αστεριών και ψάξε τα επαναλαμβανόμενα θέματα — εκεί συνήθως κρύβεται το ένα διορθώσιμο ελάττωμα.

Η ειλικρινής ανταλλαγή: DIY Python vs paid scraping APIs vs Thunderbit

Έχω συντηρήσει Python scrapers για την Amazon, και θα είμαι ειλικρινής: χαλάνε. Οι selectors αλλάζουν, τα cookies λήγουν, η Amazon λανσάρει νέο επίπεδο bot detection και ξαφνικά το πρωινό του Σαββάτου σου το περνάς κάνοντας debug έναν scraper αντί να αναλύεις δεδομένα. Το ίδιο παράπονο ακούγεται και στα forums — DIY scripts που «δούλευαν τον προηγούμενο μήνα» θέλουν συνεχώς επιδιορθώσεις.

Να πώς συγκρίνονται οι τρεις βασικές προσεγγίσεις:

ΚριτήριοDIY Python (BS4/Selenium)Paid Scraping APIThunderbit (No-Code)
Χρόνος setup1–3 ώρες30 λεπτά (API key)2 λεπτά
ΚόστοςΔωρεάν (+ proxy κόστος)$50–200+/μήναΥπάρχει free tier
Χειρισμός login wallΧειροκίνητη διαχείριση cookiesΣυνήθως καλυμμένοΧειρίζεται αυτόματα
ΣυντήρησηΥψηλή (σπάνε selectors)Χαμηλή (ο provider το συντηρεί)Μηδενική (η AI προσαρμόζεται)
PaginationΧρειάζεται custom κώδικαςΕνσωματωμένοΕνσωματωμένο
Υποστήριξη πολλών χωρώνΞεχωριστά sessions ανά domainΣυνήθως υποστηρίζεταιBrowser-based = το locale σου
Sentiment analysisΠροσθέτεις δικό σου κώδικαΜερικές φορές περιλαμβάνεταιExport σε Sheets, ανάλυση όπου θέλεις
Ιδανικό γιαΜάθηση, πλήρης έλεγχοςScale / production pipelinesΓρήγορα pulls δεδομένων, μη τεχνικές ομάδες

Η Python σου δίνει πλήρη έλεγχο και είναι πραγματικά ο καλύτερος τρόπος να μάθεις πώς δουλεύει το web scraping από μέσα. Τα paid APIs (ScrapingBee, Oxylabs, Bright Data) έχουν νόημα για production pipelines όπου η διαθεσιμότητα έχει μεγαλύτερη αξία από το κόστος. Και για ομάδες που χρειάζονται review data χωρίς το dev overhead — ecommerce ops που παρακολουθούν ανταγωνιστικά προϊόντα κάθε εβδομάδα, ομάδες marketing που αντλούν γλώσσα πελατών για ad copy — υπάρχει και τρίτος δρόμος.

Πώς να κάνεις scrape Amazon reviews με Thunderbit (χωρίς κώδικα, χωρίς συντήρηση)

Φτιάξαμε το για να καλύπτει ακριβώς σενάρια όπου η συντήρηση ενός Python scraper μοιάζει υπερβολική. Το workflow είναι το εξής:

  1. Εγκατάστησε το
  2. Πήγαινε στη σελίδα reviews του προϊόντος της Amazon στον browser σου (είσαι ήδη συνδεδεμένος, άρα το login wall δεν σε απασχολεί)
  3. Κάνε κλικ στο "AI Suggest Fields" — το Thunderbit διαβάζει τη σελίδα και προτείνει στήλες όπως Author, Rating, Title, Review Text, Date, Verified Purchase
  4. Κάνε κλικ στο "Scrape" — τα δεδομένα εξάγονται αμέσως, με ενσωματωμένο pagination
  5. Κάνε export σε Excel, Google Sheets, Airtable ή Notion

Το βασικό πλεονέκτημα είναι ότι η AI του Thunderbit διαβάζει τη δομή της σελίδας από την αρχή κάθε φορά. Χωρίς CSS selectors για συντήρηση, χωρίς διαχείριση cookies, χωρίς anti-bot κώδικα. Όταν η Amazon αλλάζει το HTML της, η AI προσαρμόζεται. Για όσους θέλουν programmatic access χωρίς πλήρες DIY, το Thunderbit προσφέρει επίσης το — structured data extraction μέσω API με AI-powered field detection, χωρίς συντήρηση selectors.

Για πιο αναλυτικές οδηγίες πάνω σε δεδομένα Amazon, δες τους οδηγούς μας για το και για το .

Tips για scraping Amazon reviews σε κλίμακα με Python

Αν κάνεις scrape reviews από πολλά ASINs, μερικές πρακτικές θα σου γλιτώσουν πολλά προβλήματα:

  • Κάνε batch τα ASINs με καθυστερήσεις ανάμεσα στα προϊόντα, όχι μόνο ανάμεσα στις σελίδες. Εγώ βάζω παύσεις 10–15 δευτερολέπτων ανάμεσα στα ASINs.
  • Κάνε deduplication επιθετικά. Όταν συνδυάζεις πολλαπλά star filters και sort orders, θα προκύπτουν reviews που αλληλεπικαλύπτονται. Χρησιμοποίησε ένα set από (title, author, date) tuples ως dedup key.
  • Κράτα log τα failures. Κατέγραψε ποιοι συνδυασμοί ASIN + page + filter απέτυχαν, ώστε να τους ξανατρέξεις χωρίς να κάνεις scrape από την αρχή.
  • Αποθήκευσε σε βάση δεδομένων για μεγάλα projects. Μια απλή SQLite βάση κλιμακώνεται πολύ καλύτερα από αρχεία CSV που μεγαλώνουν συνεχώς:
1import sqlite3
2conn = sqlite3.connect("reviews.db")
3df.to_sql("reviews", conn, if_exists="append", index=False)
  • Προγραμμάτισε επαναλαμβανόμενα scrapes. Για συνεχή παρακολούθηση, ρύθμισε ένα cron job ή χρησιμοποίησε το Scheduled Scraper του Thunderbit — περιγράφεις το URL και το πρόγραμμα, και τα υπόλοιπα γίνονται χωρίς server.

Για επιπλέον προσεγγίσεις, τα άρθρα μας για τα και για το καλύπτουν και άλλες επιλογές.

Μια σύντομη σημείωση για τα νομικά και ηθικά ζητήματα

Οι της Amazon απαγορεύουν ρητά «τη χρήση οποιουδήποτε robot, spider, scraper ή άλλου αυτοματοποιημένου μέσου για πρόσβαση στις υπηρεσίες της Amazon». Παρ’ όλα αυτά, η πρόσφατη νομολογία στις ΗΠΑ είναι πιο φιλική προς το scraping δημόσιων δεδομένων. Στην υπόθεση , ομοσπονδιακό δικαστήριο έκρινε ότι το scraping δημόσια προσβάσιμων δεδομένων δεν παραβιάζει τους όρους χρήσης όταν ο scraper δεν είναι συνδεδεμένος ως «χρήστης».

Η λεπτομέρεια που μετράει: το scraping πίσω από login (που είναι και το θέμα αυτού του tutorial) μπαίνει σε πεδίο συμβατικού δικαίου, αφού αποδέχτηκες τους ToS της Amazon όταν έφτιαξες λογαριασμό. Το scraping των δημόσια ορατών featured reviews έχει μικρότερο νομικό ρίσκο από το scraping πίσω από το login wall.

Πρακτικές οδηγίες: μην αναδιανέμεις εμπορικά τα scraped δεδομένα, μην κάνεις scrape προσωπικά δεδομένα πέρα από όσα εμφανίζονται δημόσια, σεβάσου το robots.txt και συμβουλέψου νομικό για μεγάλης κλίμακας ή εμπορική χρήση. Αυτό δεν αποτελεί νομική συμβουλή. Για περισσότερα πάνω στο νομικό τοπίο, δες την επισκόπησή μας για τις .

Συμπέρασμα: κάνε scrape Amazon reviews με Python ή άφησε εντελώς τον κώδικα

Γρήγορη ανακεφαλαίωση όσων είδαμε:

  • Το login wall είναι πραγματικό, αλλά ξεπερνιέται με authentication μέσω cookies — αντέγραψε 7 cookies από τον browser σου και πέρασέ τα σε requests.Session()
  • Χρησιμοποίησε data-hook selectors, όχι CSS classes, για extraction που δεν χαλάει κάθε λίγες εβδομάδες
  • Συνδύασε star filters και sort orders για να ξεπεράσεις το όριο των 10 σελίδων και να φτάσεις 500+ reviews ανά προϊόν
  • Πρόσθεσε sentiment analysis με TextBlob για ένα γρήγορο baseline ή με Hugging Face Transformers για παραγωγική ακρίβεια
  • Συντήρησε αντι-bot άμυνα: throttling, rotation User-Agent, exponential backoff και residential proxies για κλίμακα

Η Python σου δίνει πλήρη έλεγχο και είναι ο καλύτερος τρόπος να καταλάβεις τι συμβαίνει «από μέσα». Αλλά αν η περίπτωσή σου είναι «χρειάζομαι δεδομένα κριτικών ανταγωνιστών σε ένα spreadsheet μέχρι την Παρασκευή» και όχι «θέλω να χτίσω production data pipeline», το κόστος συντήρησης ενός custom scraper μπορεί να μην αξίζει.

Το χειρίζεται authentication, selectors, pagination και export με λίγα clicks — δοκίμασε το και δες αν ταιριάζει στη ροή εργασίας σου. Καθώς η Amazon συνεχίζει να σφίγγει τα anti-bot μέτρα, τα AI-powered εργαλεία που προσαρμόζονται σε πραγματικό χρόνο θα γίνουν λιγότερο «nice to have» και περισσότερο αναγκαιότητα.

Μπορείς επίσης να δεις το για video walkthroughs πάνω σε scraping workflows.

Συχνές ερωτήσεις

1. Μπορείς να κάνεις scrape τις Amazon reviews χωρίς login;

Ναι, αλλά μόνο τις περίπου 8 «featured reviews» που εμφανίζονται στη σελίδα προϊόντος (/dp/{ASIN}/). Οι πλήρεις σελίδες κριτικών με ταξινόμηση, φίλτρα και pagination απαιτούν authentication από τα τέλη του 2024. Για τα περισσότερα business use cases, θα χρειαστεί να περάσεις το login wall.

2. Είναι νόμιμο να κάνεις scrape Amazon reviews;

Οι Όροι Χρήσης της Amazon απαγορεύουν το αυτοματοποιημένο scraping. Ωστόσο, πρόσφατη νομολογία στις ΗΠΑ (Meta v. Bright Data, 2024; hiQ v. LinkedIn) στηρίζει το scraping δημόσια προσβάσιμων δεδομένων. Το scraping πίσω από login έχει υψηλότερο νομικό ρίσκο, αφού έχεις αποδεχτεί τους ToS της Amazon. Συμβουλέψου νομικό για εμπορική χρήση.

3. Πόσες Amazon reviews μπορώ να κάνω scrape ανά προϊόν;

Η Amazon βάζει όριο 10 σελίδων ανά συνδυασμό sort order και star filter. Χρησιμοποιώντας και τα 5 star filters × 2 sort orders, μπορείς να φτάσεις έως 100 σελίδες (περίπου 1.000 reviews) ανά προϊόν. Με keyword filters, το θεωρητικό όριο είναι πολύ μεγαλύτερο, αν και με σημαντική επανάληψη.

4. Ποιο είναι το καλύτερο Python library για Amazon review scraping;

Το requests + BeautifulSoup για static HTML parsing είναι ο πιο συνηθισμένος και αξιόπιστος συνδυασμός. Το Selenium είναι χρήσιμο όταν χρειάζεται JavaScript rendering. Για μια no-code εναλλακτική που χειρίζεται αυτόματα login walls και pagination, δοκίμασε το .

5. Πώς αποφεύγω το μπλοκάρισμα όταν κάνω scrape την Amazon;

Κάνε rotation στα User-Agent strings από ένα pool 10+ αληθινών browser strings, βάλε τυχαίες καθυστερήσεις 2–5 δευτερολέπτων ανά request, εφάρμοσε exponential backoff σε σφάλματα 503/429, χρησιμοποίησε residential proxies σε κλίμακα (τα datacenter IPs μπλοκάρονται προκαταβολικά) και κράτα συνεπή session cookies σε όλα τα requests. Για μια λύση χωρίς συντήρηση, το Thunderbit χειρίζεται αυτόματα την αντι-bot άμυνα μέσω του browser session σου.

Μάθε περισσότερα

Πίνακας περιεχομένων

Δοκίμασε το Thunderbit

Εξήγαγε leads και άλλα δεδομένα σε μόλις 2 κλικ. Με AI.

Απόκτησε το Thunderbit Είναι δωρεάν
Εξήγαγε δεδομένα με AI
Μετέφερε εύκολα δεδομένα σε Google Sheets, Airtable ή Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week