Công cụ scrape Amazon review của tôi chạy ngon lành suốt sáu tuần — rồi một sáng đẹp trời, nó vẫn trả về 200 OK nhưng trang thì trắng toát. Không lỗi, không CAPTCHA, chỉ còn mỗi HTML rỗng ở đúng chỗ vốn có hàng trăm bài đánh giá.
Nếu bạn thấy tình huống này quen quen, thì bạn không cô đơn đâu. Cuối năm 2025, Amazon bắt đầu yêu cầu đăng nhập mới xem được đầy đủ trang reviews, khiến vô số script Python “toang” chỉ sau một đêm. Trong vài tháng vừa qua tại , tôi đã xử lý vấn đề này từ cả hai phía — vừa xây AI scraper của mình, vừa duy trì pipeline review bằng Python riêng — nên tôi quyết định viết ra bài hướng dẫn mà lúc script của tôi “chết” tôi đã ước là mình có. Bài này sẽ đi qua cách làm đang thực sự chạy ổn: xác thực bằng cookie, selector ổn định không bị Amazon làm rối bởi CSS đổi xoành xoạch, cách vượt giới hạn phân trang 10 trang, các lớp phòng thủ chống bot, và cả phần bonus phân tích cảm xúc để biến text review thô thành insight kinh doanh thật sự. Và nếu đọc giữa chừng bạn nghĩ: “Thôi, tôi chả muốn tự ôm đống code này nữa”, tôi sẽ chỉ cho bạn cách làm cùng việc đó chỉ trong khoảng hai phút, không cần Python.
Scrape Amazon Review là gì, và vì sao nó quan trọng?
Scrape Amazon review là việc dùng chương trình để trích xuất dữ liệu đánh giá của khách hàng — số sao, nội dung review, tên tác giả, ngày tháng, huy hiệu đã mua xác minh — từ trang sản phẩm Amazon. Vì Amazon (và từ đó tới nay chưa bao giờ đưa lại), web scraping là con đường lập trình duy nhất để lấy được dữ liệu này.
Số liệu cũng nói rất rõ điều đó. , và . Chỉ cần hiển thị 5 review trên trang sản phẩm cũng có thể . Các doanh nghiệp phân tích cảm xúc review một cách có hệ thống còn có thể đạt . Đây không phải dữ liệu khoa học xa vời — mà là tín hiệu tình báo cạnh tranh, gợi ý cải tiến sản phẩm và ngôn ngữ marketing, tất cả đều đang nằm sẵn dưới dạng text trên máy chủ Amazon.
Vì sao nên scrape Amazon Reviews bằng Python
Python vẫn là ngôn ngữ được chọn cho bài toán này. Nó là , và hệ sinh thái của nó — requests, BeautifulSoup, pandas, Scrapy — giúp web scraping dễ tiếp cận ngay cả với người không làm dev full-time.
Các nhóm khác nhau sẽ khai thác dữ liệu này theo cách khác nhau:
| Nhóm | Mục đích sử dụng | Dữ liệu họ trích xuất |
|---|---|---|
| Product / R&D | Phát hiện phàn nàn lặp lại, ưu tiên sửa lỗi | Review 1–2 sao, tần suất từ khóa |
| Sales | Theo dõi cảm nhận về sản phẩm đối thủ | Xếp hạng sao, xu hướng số lượng review |
| Marketing | Lấy ngôn ngữ của khách hàng để viết quảng cáo | Cụm từ tích cực trong review, đề cập tính năng |
| Ecommerce Ops | Theo dõi cảm nhận về sản phẩm của mình theo thời gian | Phân bố sao, tỷ lệ verified purchase |
| Market Research | So sánh các thương hiệu dẫn đầu trong ngành theo tính năng | Bộ dữ liệu review nhiều ASIN |
Một thương hiệu đồ gia dụng , sau đó chỉnh lại công thức sản phẩm và giành lại hạng #1 Best Seller chỉ trong 60 ngày. Một công ty sản xuất đồng hồ thể thao , lần ra vấn đề dị ứng latex, tung ra phiên bản thân thiện hơn với da và giảm hoàn trả 40%. Đây chính là kiểu ROI khiến công sức kỹ thuật trở nên rất đáng tiền.
Lớp đăng nhập: vì sao Amazon Review Scraper của bạn ngừng hoạt động
Ngày 14 tháng 11 năm 2024, . Thay đổi này đã được xác nhận trên và . Nếu bạn truy cập /product-reviews/{ASIN}/ ở chế độ ẩn danh, bạn sẽ bị chuyển sang trang đăng nhập thay vì thấy dữ liệu review.

Biểu hiện thì khá kín đáo: script của bạn vẫn nhận 200 OK, nhưng phần thân HTML lại chứa form đăng nhập (name="email", id="ap_password") thay vì review. Không có mã lỗi. Không CAPTCHA. Chỉ là... chẳng có gì hữu ích.
Amazon làm vậy vì lý do chống bot và tuân thủ theo khu vực. Việc áp dụng cũng không đồng đều — đôi lúc một cửa sổ trình duyệt mới vẫn hiện được vài review trước khi bị chặn, nhất là ở trang đầu tiên — nhưng với bất kỳ scraper nào chạy ở quy mô lớn, bạn nên mặc định lớp chặn này luôn bật.
Các domain quốc gia khác nhau của Amazon (.de, .co.uk, .co.jp) áp dụng lớp chặn riêng. Như một người dùng trên diễn đàn đã nói: “mỗi quốc gia cần một lần đăng nhập riêng.” Cookie của .com sẽ không dùng được cho .co.uk.
Featured Reviews vs. Full Reviews: bạn vẫn xem được gì khi chưa đăng nhập?
Trang sản phẩm Amazon (URL /dp/{ASIN}/) vẫn hiển thị khoảng mà không cần xác thực. Đây là những review được thuật toán Amazon chọn lọc, tiện để xem nhanh cảm nhận chung, nhưng không thể sắp xếp, lọc hay phân trang.
Trang review đầy đủ (/product-reviews/{ASIN}/) — với khả năng sắp xếp theo mới nhất, lọc theo số sao và duyệt qua hàng trăm review — thì bắt buộc phải đăng nhập.
Nếu bạn chỉ cần vài review để test nhanh nhịp cảm nhận thị trường, cứ scrape trang sản phẩm. Còn nếu cần hàng trăm hoặc hàng nghìn review, bạn sẽ phải xử lý xác thực.
Trước khi bắt đầu: cài đặt Python và thư viện cần thiết
Trước khi viết code, đây là phần chuẩn bị:
- Mức độ: Trung cấp (thành thạo Python, biết HTML cơ bản)
- Thời gian cần thiết: Khoảng 45 phút cho pipeline đầy đủ; khoảng 10 phút cho một lần scrape cơ bản
- Bạn cần có: Python 3.8+, trình duyệt Chrome, một tài khoản Amazon hợp lệ
Cài các thư viện cốt lõi:
1pip install requests beautifulsoup4 lxml pandas textblob
Tuỳ chọn (cho phân tích sentiment nâng cao):
1pip install transformers torch
ASIN là gì? Đó là mã định danh sản phẩm 10 ký tự của Amazon. Bạn sẽ thấy nó trong mọi URL sản phẩm — ví dụ trong amazon.com/dp/B0BCNKKZ91, ASIN là B0BCNKKZ91. Đây chính là khóa bạn sẽ gắn vào URL review.
Bước 1: Vượt qua lớp đăng nhập bằng xác thực cookie
Cách đáng tin nhất là đăng nhập Amazon trên trình duyệt, sao chép cookie phiên làm việc rồi đưa chúng vào requests.Session() của Python. Cách này tránh CAPTCHA và SMS 2FA vốn thường làm hỏng tự động hóa đăng nhập bằng Selenium.
Bạn cần bảy cookie sau:
| Tên Cookie | Mục đích |
|---|---|
session-id | Mã định danh phiên thay đổi luân phiên |
session-id-time | Dấu thời gian phiên |
session-token | Token phiên thay đổi luân phiên |
ubid-main | Mã định danh duyệt web của người dùng |
at-main | Token xác thực chính |
sess-at-main | Xác thực theo phạm vi phiên |
x-main | Mã định danh gắn với email người dùng |
Cách lấy cookie từ Chrome DevTools
- Đăng nhập amazon.com trên Chrome
- Mở DevTools (F12 hoặc nhấp chuột phải → Inspect)
- Vào Application → Storage → Cookies →
https://www.amazon.com - Tìm từng cookie trong bảng và copy giá trị của nó
- Ghép chúng thành một chuỗi, phân tách bằng dấu chấm phẩy, để dùng trong Python
Thiết lập session như sau:
1import requests
2session = requests.Session()
3# Dán giá trị cookie của bạn vào đây
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)
Quan trọng: Hãy dùng lại cùng một đối tượng session cho toàn bộ request. Điều này giúp cookie nhất quán và mô phỏng đúng hành vi của một phiên trình duyệt thật. Cookie thường sống được từ vài ngày đến vài tuần khi scrape liên tục, nhưng nếu bạn lại bị chuyển về trang đăng nhập thì hãy làm mới cookie từ trình duyệt.
Với marketplace không phải .com, tên cookie sẽ thay đổi một chút — amazon.de dùng at-acbde thay cho at-main, amazon.co.uk dùng at-acbuk, v.v. Mỗi marketplace cần một session riêng biệt.
Bước 2: Tạo request và parse HTML review bằng BeautifulSoup
URL Amazon reviews có dạng như sau:
1https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1
Hàm cốt lõi:
1from bs4 import BeautifulSoup
2import time, random
3def get_soup(session, url):
4 time.sleep(random.uniform(2, 5)) # Nghỉ một chút cho tự nhiên
5 response = session.get(url, timeout=15)
6 # Phát hiện lớp đăng nhập
7 if "ap_email" in response.text or "Amazon Sign-In" in response.text:
8 raise Exception("Đã gặp lớp đăng nhập — hãy làm mới cookie của bạn")
9 if response.status_code != 200:
10 raise Exception(f"HTTP {response.status_code}")
11 return BeautifulSoup(response.text, "lxml")
Có một mẹo nhỏ khá hữu ích: trước khi vào trang review, hãy mở trang sản phẩm trước. Việc này tạo ra một pattern duyệt web tự nhiên hơn cho session của bạn.
1# Mở trang sản phẩm trước (giống hành vi duyệt web thật)
2product_url = f"https://www.amazon.com/dp/{asin}"
3session.get(product_url, timeout=15)
4time.sleep(random.uniform(1, 3))
5# Sau đó mới vào trang review
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)
Bước 3: Dùng selector ổn định để trích xuất dữ liệu review (đừng phụ thuộc vào CSS class)
Đây là chỗ mà hầu hết hướng dẫn từ 2022–2023 bị sụp. Amazon làm rối tên CSS class — chúng thay đổi định kỳ, và như một dev bực bội từng viết trên diễn đàn: “không có cái nào có một pattern rõ ràng cho tên class của các thẻ span cả.”
Cách khắc phục: Amazon dùng các thuộc tính data-hook trên phần tử review, và chúng ổn định đáng kinh ngạc. Đây là các định danh mang ý nghĩa mà chính frontend của Amazon phụ thuộc vào, nên không bị random hóa.
| Trường review | Selector ổn định (data-hook) | Selector dễ hỏng (class) |
|---|---|---|
| Nội dung review | [data-hook="review-body"] | .review-text-content` (hay đổi) |
| Xếp hạng sao | [data-hook="review-star-rating"] | .a-icon-alt (mơ hồ) |
| Tiêu đề review | [data-hook="review-title"] | .review-title (đôi lúc) |
| Tên tác giả | span.a-profile-name | Tương đối ổn định |
| Ngày review | [data-hook="review-date"] | .review-date (phụ thuộc khu vực) |
| Đã mua xác minh | [data-hook="avp-badge"] | span.a-size-mini |
Code trích xuất dùng selector data-hook:
1import re
2def extract_reviews(soup):
3 reviews = []
4 review_divs = soup.select('[data-hook="review"]')
5 for div in review_divs:
6 # Xếp hạng sao
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 # Tiêu đề
15 title_el = div.select_one('[data-hook="review-title"]')
16 title = title_el.get_text(strip=True) if title_el else ""
17 # Nội dung
18 body_el = div.select_one('[data-hook="review-body"]')
19 body = body_el.get_text(strip=True) if body_el else ""
20 # Tác giả
21 author_el = div.select_one('span.a-profile-name')
22 author = author_el.get_text(strip=True) if author_el else ""
23 # Ngày và quốc gia
24 date_el = div.select_one('[data-hook="review-date"]')
25 date_text = date_el.get_text(strip=True) if date_el else ""
26 # Định dạng: "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 # Đã mua xác minh
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
Tôi đã chạy bộ selector này trên nhiều ASIN trong nhiều tháng liên tiếp, và các thuộc tính data-hook chưa hề đổi lần nào. Trong khi đó, các CSS class đã đổi ít nhất hai lần trong cùng khoảng thời gian đó.
Bước 4: Xử lý phân trang và giới hạn 10 trang của Amazon
Amazon giới hạn tham số pageNumber ở 10 trang, mỗi trang 10 review — tức trần cứng khoảng 100 review cho mỗi tổ hợp bộ lọc. Nút “Next page” sẽ biến mất sau trang 10.
Vòng lặp phân trang cơ bản:
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 # Không còn review ở trang này
8 all_reviews.extend(page_reviews)
9 print(f"Page {page}: {len(page_reviews)} reviews")
Làm sao lấy hơn 10 trang Amazon Reviews
Cách lách là chia theo nhóm bộ lọc. Mỗi kết hợp của filterByStar và sortBy sẽ có một “cửa sổ” 10 trang độc lập.
Giá trị bộ lọc sao: one_star, two_star, three_star, four_star, five_star
Giá trị sắp xếp: recent, helpful (mặc định)
Bằng cách kết hợp cả 5 bộ lọc sao × 2 kiểu sắp xếp, bạn có thể truy cập tới 100 trang, tương đương 1.000 review cho mỗi sản phẩm — và với những sản phẩm có phân bố sao lệch, thường bạn sẽ lấy được gần như toàn bộ bộ review.
1star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
2sort_orders = ["recent", "helpful"]
3all_reviews = []
4seen_titles = set() # Khử trùng lặp đơn giản
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 # Khử trùng lặp bằng cặp 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)}")
Sẽ có phần dữ liệu chồng lấn giữa các bucket, nên khử trùng lặp là cực kỳ cần thiết. Tôi dùng kết hợp title review + tên tác giả làm khóa nhanh — không hoàn hảo, nhưng bắt được phần lớn duplicate.
Bước 5: Né phòng thủ chống bot (xoay vòng, giảm tốc, thử lại)
Amazon dùng AWS WAF Bot Control, và hệ thống này đã trở nên gắt hơn rất nhiều. Các biện pháp đơn lẻ (chỉ đổi User-Agent, chỉ thêm delay) giờ không còn đủ nữa.
| Kỹ thuật | Cách triển khai |
|---|---|
| Xoay vòng User-Agent | Chọn ngẫu nhiên từ 10+ chuỗi trình duyệt thật |
| Exponential backoff | Delay thử lại 2s → 4s → 8s khi gặp 503 |
| Giảm tốc request | random.uniform(2, 5) giây giữa các trang |
| Xoay proxy | Luân phiên proxy residential |
| Fingerprint phiên | Cookie + header nhất quán cho mỗi session |
| TLS impersonation | Dùng curl_cffi thay vì requests mặc định khi chạy production |
Một wrapper retry sẵn sàng cho production:
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 # Phát hiện bị chặn
16 if "validateCaptcha" in response.url or "Robot Check" in response.text:
17 wait = (2 ** attempt) * 5
18 print(f"Phát hiện CAPTCHA. Chờ {wait}s...")
19 time.sleep(wait)
20 continue
21 if response.status_code in (429, 503):
22 wait = (2 ** attempt) * 2
23 print(f"Bị giới hạn tốc độ ({response.status_code}). Chờ {wait}s...")
24 time.sleep(wait)
25 continue
26 if "ap_email" in response.text:
27 raise Exception("Lớp đăng nhập — cookie đã hết hạn")
28 return BeautifulSoup(response.text, "lxml")
29 except Exception as e:
30 if attempt == max_retries - 1:
31 raise
32 print(f"Lần thử {attempt + 1} thất bại: {e}")
33 return None
Một lưu ý về proxy: Amazon (AWS, GCP, Azure, DigitalOcean). Nếu bạn scrape hơn vài trăm trang, proxy residential gần như là bắt buộc — chi phí có thể từ $50–200+/tháng tuỳ volume. Với dự án nhỏ hơn (dưới 100 request/ngày), throttling cẩn thận từ IP nhà thường vẫn ổn.
Amazon cũng kiểm tra TLS fingerprint. Thư viện requests mặc định của Python có một . Với scraper production, hãy cân nhắc curl_cffi, vì nó giả lập TLS stack của trình duyệt thật. Còn với mức tutorial (vài trăm trang), requests cộng header tốt thường vẫn đủ dùng.
Bước 6: Xuất Amazon Reviews đã scrape ra CSV hoặc Excel
Sau khi thu thập xong review, đưa chúng về định dạng dễ dùng thì rất đơn giản với 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")
Ví dụ output:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | Mua sắm tốt nhất trong năm | Battery lasts all day, screen is gorgeous... | January 15, 2025 | Hoa Kỳ | True |
| Mike T. | 2.0 | Thất vọng sau 2 tuần | The charging port stopped working... | February 3, 2025 | Hoa Kỳ | True |
| Priya K. | 4.0 | Rất đáng tiền | Does everything I need, minor lag on heavy apps... | March 10, 2025 | Hoa Kỳ | False |
Xuất sang Excel: df.to_excel("amazon_reviews.xlsx", index=False) (cần openpyxl).
Với Google Sheets, thư viện gspread dùng được nhưng cần — tạo project, bật hai API, tạo thông tin đăng nhập service account, chia sẻ sheet. Nếu nghe xong bạn thấy còn phiền hơn cả phần scrape, thì bạn không sai. (Đây là lúc một công cụ như có thể xuất sang Google Sheets chỉ bằng một cú click bắt đầu trở nên cực kỳ hấp dẫn.)
Bonus: Thêm phân tích cảm xúc cho review chỉ với 5 dòng Python
Phần lớn tutorial scraping dừng ở bước xuất CSV. Nhưng chấm điểm sentiment mới là thứ biến dữ liệu thô thành quyết định kinh doanh.
Baseline nhanh nhất dùng TextBlob:
1from textblob import TextBlob
2df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
Kết quả là mỗi review sẽ có điểm polarity từ -1.0 (rất tiêu cực) đến +1.0 (rất tích cực). Ví dụ output:
| content (rút gọn) | 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 |
Những dòng thú vị nhất là các trường hợp lệch nhau — review 3 sao nhưng câu chữ tích cực, hoặc review 5 sao nhưng ngôn ngữ lại tiêu cực. Những điểm lệch này thường hé lộ cảm nhận tinh tế của khách hàng mà chỉ nhìn số sao thì không thấy.

Với độ chính xác cấp production, khuyến nghị là dùng Hugging Face Transformers. , và so với các công cụ dựa trên từ điển. Mô hình nlptown/bert-base-multilingual-uncased-sentiment thậm chí còn dự đoán trực tiếp số sao 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)
Review Amazon có phân bố — đỉnh lớn ở 5 sao, đỉnh nhỏ hơn ở 1 sao, và vùng trũng ở giữa. Điều này có nghĩa là điểm sao trung bình thường là một proxy khá tệ cho chất lượng thật của sản phẩm. Hãy tách cụm 1 sao ra và tìm các chủ đề lặp lại — đó thường là nơi ẩn một lỗi đơn lẻ nhưng có thể sửa được.
Sự đánh đổi thực tế: tự code Python vs. API scraping trả phí vs. Thunderbit
Tôi đã duy trì scraper Python cho Amazon, và nói thật nhé: chúng rất hay gãy. Selector đổi, cookie hết hạn, Amazon tung thêm lớp phát hiện bot mới, và thế là sáng thứ Bảy của bạn biến thành buổi debug scraper thay vì phân tích dữ liệu. Người dùng trên các diễn đàn cũng than y như vậy — script tự viết mà “tháng trước còn chạy” giờ phải vá liên tục.
Đây là so sánh giữa ba hướng đi chính:
| Tiêu chí | Python tự làm (BS4/Selenium) | API scraping trả phí | Thunderbit (No-code) |
|---|---|---|---|
| Thời gian thiết lập | 1–3 giờ | 30 phút (API key) | 2 phút |
| Chi phí | Miễn phí (+ phí proxy) | $50–200+/tháng | Có gói miễn phí |
| Xử lý lớp đăng nhập | Tự quản lý cookie thủ công | Thường được xử lý sẵn | Tự động xử lý |
| Bảo trì | Cao (selector dễ hỏng) | Thấp (nhà cung cấp tự bảo trì) | Gần như bằng 0 (AI thích ứng) |
| Phân trang | Cần code riêng | Có sẵn | Có sẵn |
| Hỗ trợ nhiều quốc gia | Cần session riêng cho từng domain | Thường hỗ trợ | Dựa trên trình duyệt = theo locale của bạn |
| Phân tích sentiment | Tự viết thêm code | Đôi khi có sẵn | Xuất sang Sheets rồi phân tích ở nơi khác |
| Phù hợp nhất | Học tập, toàn quyền kiểm soát | Pipeline production, cần scale | Lấy dữ liệu nhanh, team không kỹ thuật |
Python cho bạn toàn quyền kiểm soát và là cách tốt nhất để hiểu web scraping hoạt động bên trong thế nào. API trả phí (ScrapingBee, Oxylabs, Bright Data) hợp lý với pipeline production, nơi uptime quan trọng hơn chi phí. Và với những team cần dữ liệu review mà không muốn gánh nặng dev — ví dụ ecommerce ops theo dõi sản phẩm đối thủ hàng tuần, marketing lấy ngôn ngữ của khách hàng để viết quảng cáo — còn có một hướng đi thứ ba.
Cách scrape Amazon Reviews bằng Thunderbit (không cần code, không phải bảo trì)
Chúng tôi xây dựng để xử lý đúng những tình huống mà việc duy trì scraper Python trở nên quá sức. Quy trình sẽ như sau:
- Cài
- Mở trang review sản phẩm Amazon trong trình duyệt của bạn (bạn đã đăng nhập sẵn, nên lớp đăng nhập không còn là vấn đề)
- Nhấn “AI Suggest Fields” — Thunderbit đọc trang và gợi ý các cột như Author, Rating, Title, Review Text, Date, Verified Purchase
- Nhấn “Scrape” — dữ liệu được trích xuất ngay, kèm phân trang sẵn
- Xuất sang Excel, Google Sheets, Airtable hoặc Notion
Lợi thế lớn nhất là AI của Thunderbit đọc lại cấu trúc trang mới mỗi lần. Không cần duy trì CSS selector, không cần quản lý cookie, không cần code chống bot. Khi Amazon đổi HTML, AI sẽ tự thích ứng. Với những ai muốn truy cập dữ liệu theo kiểu programmatic nhưng không muốn tự làm toàn bộ, Thunderbit còn có — trích xuất dữ liệu có cấu trúc qua API với phát hiện field bằng AI, không phải bảo trì selector.
Nếu muốn đọc sâu hơn về dữ liệu Amazon, hãy xem các hướng dẫn của chúng tôi về và .
Mẹo scrape Amazon Reviews ở quy mô lớn bằng Python
Nếu bạn scrape review trên nhiều ASIN, vài thói quen nhỏ sẽ giúp bạn đỡ đau đầu hơn rất nhiều:
- Chạy ASIN theo lô và chèn delay giữa các sản phẩm, không chỉ giữa các trang. Tôi thường nghỉ 10–15 giây giữa các ASIN.
- Khử trùng lặp mạnh tay. Khi kết hợp nhiều bộ lọc sao và nhiều thứ tự sắp xếp, bạn sẽ gặp review bị lặp giữa các bucket. Dùng một tập hợp tuple
(title, author, date)làm khóa khử trùng lặp. - Ghi log lỗi. Theo dõi ASIN + page + filter nào bị lỗi để bạn có thể chạy lại mà không phải scrape lại toàn bộ.
- Lưu vào database cho dự án lớn. Một cơ sở dữ liệu SQLite đơn giản sẽ mở rộng tốt hơn nhiều so với việc để file CSV cứ phình ra:
1import sqlite3
2conn = sqlite3.connect("reviews.db")
3df.to_sql("reviews", conn, if_exists="append", index=False)
- Lên lịch scrape định kỳ. Với việc theo dõi liên tục, hãy đặt cron job hoặc dùng tính năng Scheduled Scraper của Thunderbit — chỉ cần mô tả URL và lịch chạy, phần còn lại nó xử lý mà không cần server.
Nếu muốn thêm phương án khác, các bài viết của chúng tôi về và sẽ cung cấp thêm lựa chọn.
Một lưu ý nhanh về pháp lý và đạo đức
của Amazon nêu rõ cấm “sử dụng bất kỳ robot, spider, scraper hoặc phương tiện tự động nào khác để truy cập Amazon Services.” Dù vậy, án lệ gần đây ở Mỹ lại khá thuận lợi cho việc scrape dữ liệu công khai. Trong , một tòa án liên bang phán quyết rằng scrape dữ liệu công khai không vi phạm điều khoản dịch vụ khi scraper không phải là “người dùng” đã đăng nhập.
Điểm cần phân biệt: scrape phía sau lớp đăng nhập (đúng như tutorial này) sẽ kéo bạn vào phạm vi luật hợp đồng, vì bạn đã đồng ý với ToS của Amazon khi tạo tài khoản. Scrape review “featured” công khai ít rủi ro pháp lý hơn so với scrape sau lớp đăng nhập.
Nguyên tắc thực tế: đừng phân phối lại dữ liệu scrape cho mục đích thương mại, đừng scrape dữ liệu cá nhân ngoài những gì công khai hiển thị, tôn trọng robots.txt, và hãy hỏi tư vấn pháp lý nếu dùng ở quy mô lớn hoặc cho mục đích thương mại. Đây không phải là tư vấn pháp lý. Muốn xem thêm bối cảnh pháp lý, hãy đọc tổng quan của chúng tôi về .
Kết luận: scrape Amazon Reviews bằng Python hoặc bỏ hẳn phần code
Tóm tắt nhanh những gì bài viết đã đi qua:
- Lớp đăng nhập là có thật, nhưng có thể vượt qua bằng xác thực cookie — copy 7 cookie từ trình duyệt và đưa vào
requests.Session() - Dùng selector
data-hook, đừng dựa vào CSS class nếu không muốn code hỏng vài tuần một lần - Kết hợp bộ lọc sao và thứ tự sắp xếp để vượt giới hạn 10 trang và lấy hơn 500 review mỗi sản phẩm
- Thêm phân tích cảm xúc bằng TextBlob để có baseline nhanh, hoặc Hugging Face Transformers nếu cần độ chính xác production
- Duy trì phòng thủ chống bot: throttling, xoay User-Agent, exponential backoff và residential proxy khi scale
Python cho bạn toàn quyền kiểm soát và là cách tốt nhất để hiểu những gì đang diễn ra dưới lớp vỏ. Nhưng nếu nhu cầu của bạn là “tôi cần dữ liệu review đối thủ trong một file spreadsheet trước thứ Sáu” chứ không phải “tôi muốn xây một pipeline dữ liệu production”, thì gánh nặng bảo trì của scraper tự viết có thể không đáng.
xử lý xác thực, selector, phân trang và xuất dữ liệu chỉ bằng vài cú click — hãy thử và xem nó có khớp với workflow của bạn không. Khi Amazon tiếp tục siết chặt biện pháp chống bot, các công cụ AI thích ứng theo thời gian thực sẽ ngày càng trở thành nhu cầu thiết yếu, chứ không còn là món “có thì tốt”.
Bạn cũng có thể xem để xem các video hướng dẫn quy trình scraping.
FAQs
1. Có thể scrape Amazon reviews mà không cần đăng nhập không?
Có, nhưng chỉ scrape được khoảng 8 “featured reviews” hiển thị trên trang chi tiết sản phẩm (/dp/{ASIN}/). Trang review đầy đủ với sắp xếp, lọc và phân trang thì từ cuối năm 2024 trở đi đều yêu cầu xác thực. Với hầu hết nhu cầu kinh doanh, bạn sẽ phải xử lý lớp đăng nhập.
2. Scrape Amazon reviews có hợp pháp không?
Điều khoản sử dụng của Amazon cấm scraping tự động. Tuy nhiên, án lệ gần đây ở Mỹ (Meta v. Bright Data, 2024; hiQ v. LinkedIn) lại ủng hộ việc scrape dữ liệu có thể truy cập công khai. Scrape phía sau lớp đăng nhập có rủi ro pháp lý cao hơn vì bạn đã đồng ý với ToS của Amazon. Hãy hỏi tư vấn pháp lý nếu dùng cho mục đích thương mại.
3. Mỗi sản phẩm có thể scrape được bao nhiêu review Amazon?
Amazon giới hạn 10 trang review cho mỗi tổ hợp sort order và bộ lọc sao. Dùng cả 5 bộ lọc sao × 2 kiểu sắp xếp, bạn có thể truy cập tối đa 100 trang (khoảng 1.000 review) cho mỗi sản phẩm. Với bộ lọc theo từ khóa, trần lý thuyết còn cao hơn, nhưng mức trùng lặp cũng lớn.
4. Thư viện Python nào tốt nhất để scrape Amazon reviews?
requests + BeautifulSoup để parse HTML tĩnh là tổ hợp phổ biến và đáng tin cậy nhất. Selenium hữu ích khi cần render JavaScript. Nếu muốn giải pháp không cần code, xử lý lớp đăng nhập và phân trang tự động, hãy thử .
5. Làm sao tránh bị chặn khi scrape Amazon?
Xoay vòng User-Agent từ một pool gồm hơn 10 chuỗi trình duyệt thật, thêm delay ngẫu nhiên 2–5 giây giữa các request, áp dụng exponential backoff khi gặp lỗi 503/429, dùng residential proxy khi scale (IP datacenter thường bị chặn sẵn), và giữ cookie phiên nhất quán giữa các request. Nếu muốn không phải bảo trì gì, Thunderbit sẽ tự xử lý chống bot thông qua phiên trình duyệt của bạn.
Learn More