Ο 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}/ σε ανώνυμη καρτέλα, θα ανακατευθυνθείς σε σελίδα σύνδεσης αντί να δεις δεδομένα κριτικών.

Τα συμπτώματα είναι ύπουλα: το 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.
Featured reviews vs. πλήρεις reviews: τι μπορείς ακόμα να δεις χωρίς login
Οι σελίδες προϊόντων της 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-token | Token συνεδρίας που ανανεώνεται |
ubid-main | Αναγνωριστικό περιήγησης χρήστη |
at-main | Κύριο auth token |
sess-at-main | Auth token για τη συγκεκριμένη συνεδρία |
x-main | Αναγνωριστικό δεμένο με το email του χρήστη |
Πώς να εξαγάγεις cookies από το Chrome DevTools
- Συνδέσου στο amazon.com από το Chrome
- Άνοιξε το DevTools (F12 ή δεξί κλικ → Inspect)
- Πήγαινε Application → Storage → Cookies →
https://www.amazon.com - Βρες κάθε cookie από τον πίνακα και αντέγραψε την τιμή του
- Μορφοποίησέ τα ως 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 requests | random.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:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | Καλύτερη αγορά της χρονιάς | Η μπαταρία κρατάει όλη μέρα, η οθόνη είναι υπέροχη... | January 15, 2025 | the United States | True |
| Mike T. | 2.0 | Απογοητεύτηκα μετά από 2 εβδομάδες | Η θύρα φόρτισης σταμάτησε να λειτουργεί... | February 3, 2025 | the United States | True |
| Priya K. | 4.0 | Πολύ καλή αξία για τα χρήματα | Κάνει ό,τι χρειάζομαι, μόνο μικρή καθυστέρηση σε βαριές εφαρμογές... | March 10, 2025 | the United States | False |
Για 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 (περικομμένο) | rating | sentiment |
|---|---|---|
| "Battery lasts all day, screen is gorgeous..." | 5.0 | 0.65 |
| "The charging port stopped working after..." | 2.0 | -0.40 |
| "Does everything I need, minor lag on..." | 4.0 | 0.25 |
| "Absolute garbage. Returned immediately." | 1.0 | -0.75 |
| "It's okay. Nothing special but works." | 3.0 | 0.10 |
Οι πιο ενδιαφέρουσες γραμμές είναι οι ασυμφωνίες — ένα review 3 αστέρων με θετικό κείμενο ή ένα review 5 αστέρων με αρνητική γλώσσα. Αυτές οι αποκλίσεις συχνά αποκαλύπτουν πιο λεπτές απόψεις πελατών που δεν φαίνονται μόνο από τη βαθμολογία.

Για ακρίβεια επιπέδου 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 API | Thunderbit (No-Code) |
|---|---|---|---|
| Χρόνος setup | 1–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 είναι το εξής:
- Εγκατάστησε το
- Πήγαινε στη σελίδα reviews του προϊόντος της Amazon στον browser σου (είσαι ήδη συνδεδεμένος, άρα το login wall δεν σε απασχολεί)
- Κάνε κλικ στο "AI Suggest Fields" — το Thunderbit διαβάζει τη σελίδα και προτείνει στήλες όπως Author, Rating, Title, Review Text, Date, Verified Purchase
- Κάνε κλικ στο "Scrape" — τα δεδομένα εξάγονται αμέσως, με ενσωματωμένο pagination
- Κάνε 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-hookselectors, όχι 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 σου.
Μάθε περισσότερα