Cách Scrape Đánh Giá Amazon Bằng Python: Hướng Dẫn Từ Login Wall Đến Phân Tích Cảm Xúc

Cập nhật lần cuối vào August 21, 2026
Cách Scrape Đánh Giá Amazon Bằng Python: Hướng Dẫn Từ Login Wall Đến Phân Tích Cảm Xúc
Tóm tắt bằng AI
Bài viết hướng dẫn chi tiết cách scrape review Amazon bằng Python sau khi Amazon chặn truy cập full review page sau lớp đăng nhập. Nội dung bao gồm xác thực bằng cookie, dùng selector ổn định dựa trên data-hook, xử lý giới hạn 10 trang, chống bot, xuất dữ liệu ra CSV/Excel và thêm phân tích cảm xúc bằng TextBlob hoặc Transformers. Bài viết cũng so sánh giữa tự viết scraper bằng Python, dùng API trả phí và Thunderbit no-code, đồng thời giải thích khi nào nên chọn mỗi phương án.

My Amazon review scraper worked perfectly for six weeks — rồi một buổi sáng, nó chỉ trả về 200 OK và một trang trống rỗng. Không lỗi, không CAPTCHA, chỉ là HTML rỗng đúng chỗ trước đó có hàng trăm review.

Nếu nghe quen quen, thì bạn không hề đơn độc. Cuối năm 2025, Amazon bắt đầu chặn toàn bộ trang review phía sau một lớp đăng nhập, và rất nhiều Python scraping scripts đã “gãy” chỉ sau một đêm. Mấy tháng gần đây ở Thunderbit, tôi vừa làm việc để giải quyết bài toán từ cả hai phía — vừa xây dựng AI scraper, vừa duy trì pipeline review Python của riêng mình — nên tôi nghĩ đã đến lúc viết ra hướng dẫn mà lúc script của tôi sập, tôi ước gì đã có sẵn. Bài viết này sẽ đi qua cách làm vẫn đang hoạt động: xác thực bằng cookie, selector ổn định vượt qua lớp CSS obfuscation của Amazon, cách lách giới hạn phân trang 10 trang, cơ chế chống bot, và thêm một phần sentiment analysis để biến text review thô thành insight kinh doanh thật sự. Và nếu đọc đến giữa chừng rồi nghĩ, “thôi, tôi không muốn tự bảo trì đống code này đâu,” thì tôi sẽ chỉ cho bạn cách Thunderbit xử lý cùng một việc đó trong khoảng hai phút, hoàn toàn không cần Python.

What Is Amazon Review Scraping (and Why Does It Matter)?

Amazon review scraping là quá trình trích xuất dữ liệu review của khách hàng bằng chương trình — gồm star ratings, nội dung review, tên tác giả, ngày tháng, huy hiệu verified purchase — từ các trang sản phẩm trên Amazon. Vì Amazon đã gỡ nội dung review khỏi Product Advertising API từ năm 2010 (và chưa bao giờ đưa lại), web scraping gần như 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õ. 95% người mua đọc review trước khi quyết định mua hàng, và 94% xem Amazon là nguồn số 1 để đọc review sản phẩm. Chỉ cần hiển thị 5 review trên trang sản phẩm cũng có thể tăng conversion tới 270%. Những công ty phân tích sentiment của review một cách hệ thống có thể đạt mức giữ chân khách hàng cao hơn đến 15%. Đây không phải kiểu data science trừu tượng — mà là competitive intelligence, tín hiệu cải tiến sản phẩm, và ngôn ngữ marketing, tất cả đều nằm sẵn dưới dạng text công khai trên máy chủ của Amazon.

Why Scrape Amazon Reviews with Python

Python vẫn là ngôn ngữ được chọn nhiều nhất cho việc này. Nó là ngôn ngữ được mong muốn nhất số 1 trong Stack Overflow Developer Survey 2024, và hệ sinh thái của nó — requests, BeautifulSoup, pandas, Scrapy — khiến web scraping trở nên dễ tiếp cận ngay cả với những người không làm dev toàn thời gian.

Các team khác nhau sẽ khai thác dữ liệu này theo những cách khác nhau:

Đội ngũTrường hợp sử dụngDữ liệu họ trích xuất
Sản phẩm / R&DPhát hiện các lời phàn nàn lặp lại, ưu tiên sửa lỗiReview 1–2 sao, tần suất từ khóa
SalesTheo 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
MarketingLấy ngôn ngữ của khách hàng để viết quảng cáoCụm từ tích cực trong review, nhắc đến tính năng
Ecommerce OpsTheo dõi cảm nhận về sản phẩm của mình theo thời gianPhân bố số sao, tỷ lệ mua đã xác minh
Nghiên cứu thị trườngSo sánh các sản phẩm dẫn đầu theo từng tính năngBộ dữ liệu review đa ASIN

Một thương hiệu đồ bếp đào sâu vào review tiêu cực và phát hiện 22% người dùng than rằng “lớp chống dính bị bong tróc”, rồi chỉnh lại công thức sản phẩm và giành lại vị trí #1 Best Seller chỉ trong 60 ngày. Một công ty đồng hồ thể thao bắt được cụm “gây kích ứng dây đeo” trong review, xác định vấn đề dị ứng latex, tung ra phiên bản ít gây dị ứng và giảm 40% tỷ lệ trả hàng. Đó chính là kiểu ROI khiến công sức kỹ thuật trở nên đáng giá.

Login Wall: Why Your Amazon Review Scraper Stopped Working

Vào ngày 14/11/2024, Amazon bắt đầu yêu cầu đăng nhập để xem trang review sản phẩm đầy đủ. Thay đổi này đã được xác nhận trên các forum cộng đồngblog của các nhà cung cấp scraping. Nếu bạn mở /product-reviews/{ASIN}/ ở cửa sổ ẩn danh, bạn sẽ bị chuyển sang trang đăng nhập thay vì thấy dữ liệu review.

python-web-scraping-diagram.webp

Triệu chứng thì khá kín đáo: script của bạn nhận về 200 OK, nhưng phần body của HTML chỉ chứa form đăng nhập (name="email", id="ap_password") thay vì review. Không có mã lỗi. Không có CAPTCHA. Chỉ có... không gì hữu ích cả.

Amazon làm vậy vì mục tiêu chống bot và tuân thủ quy định theo khu vực. Cơ chế này không phải lúc nào cũng giống nhau — đôi khi một cửa sổ trình duyệt mới vẫn tải đượ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 coi như lớp chặn này luôn bật.

Các domain Amazon theo từng quốc gia (.de, .co.uk, .co.jp) áp dụng lớp chặn một cách độc lập. Như một người trên forum nói: “mỗi quốc gia đều cần đăng nhập riêng.” Cookie của .com sẽ không dùng được cho .co.uk.

Featured Reviews vs. Full Reviews: What You Can Still Access Without Login

Trang sản phẩm Amazon (/dp/{ASIN}/) vẫn hiển thị khoảng 8 “featured reviews” mà không cần xác thực. Đây là những review được thuật toán của Amazon chọn sẵn, rất tiện để xem nhanh sentiment, nhưng không thể sort, lọc hay phân trang.

Trang review đầy đủ (/product-reviews/{ASIN}/) — với chức năng sắp xếp theo mới nhất, lọc theo số sao, và phân trang qua hàng trăm review — thì cần đăng nhập.

Nếu bạn chỉ cần vài review để kiểm tra nhanh, hãy scrape trang sản phẩm. Còn nếu cần hàng trăm hay hàng nghìn review, bạn sẽ phải xử lý xác thực.

What You Need Before You Start: Python Setup and Libraries

Trước khi viết code, đây là phần chuẩn bị:

  • Độ khó: Trung cấp (thoải mái với Python, hiểu HTML cơ bản)
  • Thời gian cần: ~45 phút cho toàn bộ pipeline; ~10 phút cho một lần scrape cơ bản
  • Bạn cần: Python 3.8+, trình duyệt Chrome, và một tài khoản Amazon hợp lệ

Cài các thư viện cốt lõi:

pip install requests beautifulsoup4 lxml pandas textblob

Tùy chọn (cho sentiment analysis nâng cao):

pip 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ẽ đưa vào URL review.

Step 1: Get Past the Login Wall with Cookie-Based Authentication

Cách đáng tin cậy nhất là đăng nhập Amazon trong trình duyệt, copy cookie phiên làm việc, rồi chèn chúng vào requests.Session() của Python. Cách này tránh được CAPTCHA và xác thực SMS 2FA vốn rất hay làm Selenium-based login automation bị kẹt.

Bạn cần 7 cookie sau:

Tên cookieMục đích
session-idMã định danh phiên thay đổi luân phiên
session-id-timeDấu thời gian của phiên
session-tokenToken phiên thay đổi luân phiên
ubid-mainMã định danh duyệt web của người dùng
at-mainToken xác thực chính
sess-at-mainXác thực theo phiên
x-mainMã định danh gắn với email người dùng

How to Extract Cookies from Chrome DevTools

  1. Đăng nhập amazon.com trong Chrome
  2. Mở DevTools (F12 hoặc chuột phải → Inspect)
  3. Vào ApplicationStorageCookieshttps://www.amazon.com
  4. Tìm từng cookie trong bảng và copy giá trị của nó
  5. Định dạng chúng thành một chuỗi ngăn cách bằng dấu chấm phẩy để dùng trong Python

Thiết lập session như sau:

import requests

session = requests.Session()

# Dán giá trị cookie của bạn vào đây
cookies = {
    "session-id": "YOUR_SESSION_ID",
    "session-id-time": "YOUR_SESSION_ID_TIME",
    "session-token": "YOUR_SESSION_TOKEN",
    "ubid-main": "YOUR_UBID_MAIN",
    "at-main": "YOUR_AT_MAIN",
    "sess-at-main": "YOUR_SESS_AT_MAIN",
    "x-main": "YOUR_X_MAIN",
}

headers = {
    "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",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
}

session.cookies.update(cookies)
session.headers.update(headers)

Quan trọng: Hãy tái sử dụng cùng một đối tượng session cho tất cả request. Cách này giữ cookie nhất quán và mô phỏng hành vi của một trình duyệt thật. Cookie thường sống được vài ngày đến vài tuần khi chạy scraping, nhưng nếu bạn lại bị chuyển về trang login, hãy refresh cookie từ trình duyệt của bạn.

Với marketplace không phải .com, tên cookie sẽ thay đổi đôi chút — amazon.de dùng at-acbde thay vì at-main, amazon.co.uk dùng at-acbuk, v.v. Mỗi marketplace cần một session riêng độc lập.

Step 2: Build the Request and Parse Review HTML with BeautifulSoup

URL review của Amazon theo mẫu này:

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

Hàm cốt lõi:

from bs4 import BeautifulSoup
import time, random

def get_soup(session, url):
    time.sleep(random.uniform(2, 5))  # Trễ nhẹ để lịch sự
    response = session.get(url, timeout=15)

    # Detect login wall
    if "ap_email" in response.text or "Amazon Sign-In" in response.text:
        raise Exception("Phát hiện login wall — hãy refresh cookies")

    if response.status_code != 200:
        raise Exception(f"HTTP {response.status_code}")

    return BeautifulSoup(response.text, "lxml")

Một mẹo nhỏ nhưng rất hữu ích: trước khi vào trang review, hãy ghé qua trang sản phẩm trước. Điều này tạo ra một pattern duyệt web tự nhiên hơn cho session của bạn.

# Visit product page first (mimics real browsing)
product_url = f"https://www.amazon.com/dp/{asin}"
session.get(product_url, timeout=15)
time.sleep(random.uniform(1, 3))

# Then hit the reviews page
reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
soup = get_soup(session, reviews_url)

Step 3: Use Stable Selectors to Extract Review Data (Stop Relying on CSS Classes)

Đây là chỗ mà hầu hết tutorial từ năm 2022–2023 bắt đầu sập. Amazon làm rối tên CSS class — chúng thay đổi theo chu kỳ, và như một developer bức xúc từng viết trên forum: “none of them had a single pattern for the names of the classes of span tags.”

Cách xử lý: Amazon dùng data-hook attributes trên các phần tử review, và chúng ổn định đáng ngạc nhiên. Đây là các định danh mang tính ngữ nghĩa mà frontend nội bộ của Amazon phụ thuộc vào, nên chúng không bị random hóa.

Trường reviewSelector ổn định (data-hook)Selector dễ vỡ (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 khi đúng)
Tên tác giảspan.a-profile-nameKhá ổn định
Ngày review[data-hook="review-date"].review-date (phụ thuộc khu vực)
Mua hàng đã xác minh[data-hook="avp-badge"]span.a-size-mini

Code trích xuất dùng selector data-hook:

import re

def extract_reviews(soup):
    reviews = []
    review_divs = soup.select('[data-hook="review"]')

    for div in review_divs:
        # Star rating
        rating_el = div.select_one('[data-hook="review-star-rating"]')
        rating = None
        if rating_el:
            rating_text = rating_el.get_text(strip=True)
            match = re.search(r'(\d\.?\d?)', rating_text)
            if match:
                rating = float(match.group(1))

        # Title
        title_el = div.select_one('[data-hook="review-title"]')
        title = title_el.get_text(strip=True) if title_el else ""

        # Body
        body_el = div.select_one('[data-hook="review-body"]')
        body = body_el.get_text(strip=True) if body_el else ""

        # Author
        author_el = div.select_one('span.a-profile-name')
        author = author_el.get_text(strip=True) if author_el else ""

        # Date and country
        date_el = div.select_one('[data-hook="review-date"]')
        date_text = date_el.get_text(strip=True) if date_el else ""
        # Format: "Reviewed in the United States on January 15, 2025"
        country_match = re.search(r'Reviewed in (.+?) on', date_text)
        date_match = re.search(r'on (.+)$', date_text)
        country = country_match.group(1) if country_match else ""
        date = date_match.group(1) if date_match else ""

        # Verified purchase
        verified_el = div.select_one('[data-hook="avp-badge"]')
        verified = bool(verified_el)

        reviews.append({
            "author": author,
            "rating": rating,
            "title": title,
            "content": body,
            "date": date,
            "country": country,
            "verified": verified,
        })

    return reviews

Tôi đã chạy bộ selector này trên nhiều ASIN suốt nhiều tháng, và data-hook chưa đổi lần nào. Trong khi đó, CSS class đã xoay vòng ít nhất hai lần trong cùng khoảng thời gian.

Step 4: Handle Pagination and Amazon's 10-Page Cap

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 filter. Nút “Next page” sẽ biến mất sau trang 10.

Vòng lặp phân trang cơ bản:

all_reviews = []

for page in range(1, 11):
    url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
    soup = get_soup(session, url)
    page_reviews = extract_reviews(soup)

    if not page_reviews:
        break  # Không còn review nào trên trang này

    all_reviews.extend(page_reviews)
    print(f"Trang {page}: {len(page_reviews)} review")

How to Get More Than 10 Pages of Amazon Reviews

Mẹo lách là filter bucketing. Mỗi tổ hợp filterByStarsortBy sẽ có một cửa sổ 10 trang riêng.

Giá trị star filter: one_star, two_star, three_star, four_star, five_star
Giá trị sort: recent, helpful (mặc định)

Kết hợp 5 star filters × 2 sort orders, bạn có thể truy cập tới 100 trang, tức 1.000 review cho mỗi sản phẩm — và với những sản phẩm có phân bố số sao lệch, bạn thường sẽ lấy được gần như toàn bộ tập review.

star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
sort_orders = ["recent", "helpful"]
all_reviews = []
seen_titles = set()  # Khử trùng lặp đơn giản

for star in star_filters:
    for sort in sort_orders:
        for page in range(1, 11):
            url = (
                f"https://www.amazon.com/product-reviews/{asin}"
                f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
            )
            soup = get_soup(session, url)
            page_reviews = extract_reviews(soup)

            if not page_reviews:
                break

            for review in page_reviews:
                # Deduplicate by title + author combo
                key = (review["title"], review["author"])
                if key not in seen_titles:
                    seen_titles.add(key)
                    all_reviews.append(review)

            print(f"[{star}/{sort}] Trang {page}: {len(page_reviews)} review")

print(f"Tổng số review duy nhất: {len(all_reviews)}")

Sẽ có phần chồng lấn giữa các bucket, nên deduplication là bắt buộc. Tôi thường dùng cặp title + author như một khóa nhanh — không hoàn hảo, nhưng bắt được phần lớn trùng lặp.

Step 5: Dodge Anti-Bot Defenses (Rotate, Throttle, Retry)

Amazon dùng AWS WAF Bot Control, và hệ thống này đã trở nên gắt hơn nhiều. Chỉ áp dụng một lớp đối phó đơn lẻ (chỉ xoay User-Agent, hoặc chỉ thêm delay) thì không đủ.

Kỹ thuậtCách triển khai
Xoay vòng User-AgentChọn ngẫu nhiên từ hơn 10 chuỗi trình duyệt thật
Tăng thời gian chờ theo cấp số nhânTrễ thử lại 2s → 4s → 8s khi gặp 503
Giảm tốc độ requestrandom.uniform(2, 5) giây giữa các trang
Xoay proxyLuân phiên qua các proxy residential
Dấu vân tay phiênCookie + header nhất quán cho mỗi phiên
Giả lập TLSDùng curl_cffi thay vì requests mặc định cho môi trường production

Một retry wrapper đủ dùng cho production:

import time, random

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
    "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",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
    "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",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
]

def scrape_with_retries(session, url, max_retries=3):
    for attempt in range(max_retries):
        try:
            session.headers["User-Agent"] = random.choice(USER_AGENTS)
            time.sleep(random.uniform(2, 5))

            response = session.get(url, timeout=15)

            # Detect blocks
            if "validateCaptcha" in response.url or "Robot Check" in response.text:
                wait = (2 ** attempt) * 5
                print(f"Phát hiện CAPTCHA. Chờ {wait}s...")
                time.sleep(wait)
                continue

            if response.status_code in (429, 503):
                wait = (2 ** attempt) * 2
                print(f"Bị giới hạn tốc độ ({response.status_code}). Chờ {wait}s...")
                time.sleep(wait)
                continue

            if "ap_email" in response.text:
                raise Exception("Login wall — cookie đã hết hạn")

            return BeautifulSoup(response.text, "lxml")

        except Exception as e:
            if attempt == max_retries - 1:
                raise
            print(f"Lần thử {attempt + 1} thất bại: {e}")

    return None

Một lưu ý về proxy: Amazon chặn sẵn các dải IP datacenter (AWS, GCP, Azure, DigitalOcean) ở tầng mạng. Nếu bạn scrape hơn vài trăm trang, proxy residential gần như là bắt buộc — chi phí thường rơi vào khoảng $50–200+/tháng tùy volume. Với dự án nhỏ hơn (dưới 100 request/ngày), chỉ cần throttle cẩn thận từ IP nhà bạn thì thường vẫn ổn.

Amazon cũng kiểm tra TLS fingerprint. requests mặc định của Python có một JA3 hash khá quen thuộc mà WAF thường chặn trước. Với scraper production, nên 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 scraping ở quy mô tutorial (vài trăm trang), requests cộng với header tốt thường vẫn đủ.

Step 6: Export Your Scraped Amazon Reviews to CSV or Excel

Khi đã thu thập xong review, đưa chúng vào định dạng dễ dùng thì rất đơn giản với pandas:

import pandas as pd

df = pd.DataFrame(all_reviews)
df.to_csv("amazon_reviews.csv", index=False)
print(f"Đã xuất {len(df)} review sang amazon_reviews.csv")

Ví dụ output:

authorratingtitlecontentdatecountryverified
Sarah M.5.0Món mua đáng tiền nhất năm nayBattery lasts all day, screen is gorgeous...January 15, 2025the United StatesTrue
Mike T.2.0Thất vọng sau 2 tuầnThe charging port stopped working...February 3, 2025the United StatesTrue
Priya K.4.0Giá trị rất tốt so với số tiền bỏ raDoes everything I need, minor lag on heavy apps...March 10, 2025the United StatesFalse

Để xuất Excel: df.to_excel("amazon_reviews.xlsx", index=False) (cần openpyxl).

Với Google Sheets, thư viện gspread có thể làm được, nhưng cần hơn 8 bước cấu hình Google Cloud — tạo project, bật hai API, tạo service account credentials, chia sẻ sheet. Nếu nghe như setup còn nhiều hơn cả việc scrape thật sự, thì đúng là vậy. (Đây là một trong những lúc mà công cụ như Thunderbit có thể export sang Google Sheets chỉ bằng một cú click bắt đầu rất hấp dẫn.)

Bonus: Add Sentiment Analysis to Your Scraped Reviews in 5 Lines of Python

Hầu hết tutorial scraping dừng lại ở 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.

Cách baseline nhanh nhất là dùng TextBlob:

from textblob import TextBlob

df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)

Kết quả là một điểm polarity từ -1.0 (rất tiêu cực) đến +1.0 (rất tích cực) cho từng review. Ví dụ output:

content (truncated)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

Những dòng thú vị nhất là các trường hợp lệch nhau — review 3 sao nhưng text lại rất tích cực, hoặc review 5 sao nhưng ngôn từ lại tiêu cực. Những chênh lệch này thường hé lộ quan điểm tinh tế của khách hàng mà star rating đơn thuần không thể hiện hết.

ai-review-analysis.webp

Để đạt độ chính xác tốt hơn cho môi trường production, nên dùng Hugging Face Transformers. VADER được huấn luyện trên tweet chứ không phải product reviews, và các mô hình transformer đạt độ chính xác hơn 98% trong phân loại review so với 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 từ 1–5:

from transformers import pipeline

clf = pipeline("sentiment-analysis",
               model="nlptown/bert-base-multilingual-uncased-sentiment")
df["predicted_stars"] = df["content"].apply(
    lambda x: int(clf(str(x)[:512])[0]["label"][0])
)

Review Amazon thường đi theo phân phối chữ J — dồn mạnh ở 5 sao, một đỉnh nhỏ hơn ở 1 sao, và lõm ở 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ực sự của sản phẩm. Hãy tách cụm 1 sao ra và đào sâu vào các chủ đề lặp lại — đó thường là nơi giấu một lỗi đơn lẻ nhưng có thể sửa được.

The Honest Trade-Off: DIY Python vs. Paid Scraping APIs vs. Thunderbit

Tôi đã duy trì Python scrapers cho Amazon, và nói thật là: chúng sẽ hỏng. Selector thay đổi, cookie hết hạn, Amazon tung thêm một tầng bot detection mới, và bỗng nhiên sáng thứ Bảy của bạn biến thành thời gian debug scraper thay vì phân tích dữ liệu. Người dùng trên forum cũng than phiền y hệt — các script tự viết “tháng trước vẫn chạy tốt” giờ phải vá liên tục.

Đây là cách ba hướng chính so sánh với nhau:

Tiêu chíPython tự xây (BS4/Selenium)API scraping trả phíThunderbit (No-code)
Thời gian thiết lập1–3 giờ30 phút (API key)2 phút
Chi phíMiễn phí (+ chi phí proxy)$50–200+/thángCó gói miễn phí
Xử lý login wallTự quản lý cookie thủ côngThường được xử lý sẵnTự động xử lý
Bảo trìCao (selector dễ gãy)Thấp (nhà cung cấp lo)Gần như không (AI tự thích ứng)
Phân trangCần viết code riêngCó sẵnCó sẵn
Hỗ trợ đa quốc giaMỗi domain một session riêngThường hỗ trợChạy trên trình duyệt = theo locale của bạn
Phân tích cảm xúcTự viết thêm codeĐôi khi cóXuất sang Sheets rồi phân tích ở nơi khác
Phù hợp nhất choHọc tập, cần kiểm soát toàn bộPipeline production, quy mô lớnLấy dữ liệu nhanh, đội ngũ không có dev

Python cho bạn toàn quyền kiểm soát và thực sự là cách tốt nhất để học web scraping vận hành như thế nào bên dưới bề mặt. Các API trả phí như ScrapingBee, Oxylabs, Bright Data rất hợp cho pipeline production nơi uptime quan trọng hơn chi phí. Còn với những team chỉ cần dữ liệu review mà không muốn gánh overhead của dev — chẳng hạn ecommerce ops theo dõi sản phẩm đối thủ hằng tuần, hay team marketing lấy ngôn ngữ khách hàng để viết quảng cáo — thì có một con đường thứ ba.

How to Scrape Amazon Reviews with Thunderbit (No Code, No Maintenance)

Chúng tôi xây dựng Thunderbit để xử lý đúng những tình huống mà việc duy trì một Python scraper có cảm giác hơi quá tay. Quy trình sẽ như sau:

  1. Cài Thunderbit Chrome Extension
  2. 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 login wall không còn là vấn đề)
  3. Bấm "AI Suggest Fields" — Thunderbit đọc trang và gợi ý các cột như Author, Rating, Title, Review Text, Date, Verified Purchase
  4. Bấm "Scrape" — dữ liệu được trích xuất ngay, kèm phân trang tích hợp
  5. Export sang Excel, Google Sheets, Airtable, hoặc Notion

Lợi thế lớn nhất là AI của Thunderbit sẽ đọc lại cấu trúc trang từ đầu mỗi lần. Không cần giữ CSS selector, không phải quản lý cookie, cũng chẳng cần viết anti-bot code. Khi Amazon đổi HTML, AI sẽ tự thích ứng. Với những ai muốn truy cập theo kiểu programmatic nhưng không muốn tự làm từ đầu đến cuối, Thunderbit còn có Extract API — trích xuất dữ liệu có cấu trúc qua API với AI tự nhận diện field, không phải bảo trì selector.

Nếu muốn đọc sâu hơn về dữ liệu Amazon, xem thêm hướng dẫn của chúng tôi về how to scrape Amazon products and reviewsextracting and analyzing Amazon sales data.

Tips for Scraping Amazon Reviews at Scale with Python

Nếu bạn scrape review trên nhiều ASIN, vài thói quen nhỏ sẽ giúp đỡ đau đầu rất nhiều:

  • Batch ASINs của bạn với khoảng nghỉ 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.
  • Deduplicate mạnh tay. Khi gộp nhiều tổ hợp star filter và sort order, bạn sẽ gặp các review chồng chéo nhau. Hãy dùng set các tuple (title, author, date) làm khóa khử trùng lặp.
  • Log lỗi. Ghi lại ASIN + page + filter nào bị fail để có thể chạy lại đúng phần đó mà không cần scrape lại toàn bộ.
  • Lưu vào database cho dự án lớn. Một SQLite database đơn giản sẽ scale tốt hơn rất nhiều so với file CSV cứ phình to mãi:
import sqlite3

conn = sqlite3.connect("reviews.db")
df.to_sql("reviews", conn, if_exists="append", index=False)
  • Lên lịch scrape định kỳ. Với nhu cầu theo dõi liên tục, bạn có thể set 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ó lo hết mà không cần server.

Để xem thêm các cách khác, các bài viết của chúng tôi về best automated web scraping toolsscraping data from websites to Excel sẽ có thêm lựa chọn hữu ích.

A Quick Note on Legal and Ethical Considerations

Điều khoản sử dụng của Amazon ghi rất rõ rằng “việc 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” đều bị cấm. Dù vậy, án lệ gần đây ở Mỹ lại khá có lợi cho việc scrape dữ liệu công khai. Trong vụ Meta Platforms v. Bright Data (tháng 1/2024), tòa án liên bang phán rằng việc 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à một “user” đã đăng nhập.

Điểm cần lưu ý là: scraping sau khi đăng nhập (chính là thứ tutorial này đang nói tới) sẽ đẩy bạn sang vùng của luật hợp đồng, vì khi tạo tài khoản bạn đã đồng ý với ToS của Amazon. Scraping những featured reviews hiển thị công khai sẽ ít rủi ro pháp lý hơn so với scraping phía sau login wall.

Hướng dẫn 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 vượt quá phần đang hiển thị công khai, tôn trọng robots.txt, và hãy hỏi ý kiến luật sư 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ý. Nếu muốn hiểu sâu hơn về bối cảnh pháp lý, xem bài tổng quan của chúng tôi về web scraping legal implications.

Conclusion: Scrape Amazon Reviews with Python or Skip the Code Entirely

Tóm tắt nhanh những gì hướng dẫn này đã đi qua:

  • Login wall là có thật, nhưng có thể xử lý bằng cookie-based authentication — copy 7 cookie từ trình duyệt và chèn vào requests.Session()
  • Dùng selector data-hook, không dùng CSS class, để quá trình trích xuất không bị gãy vài tuần một lần
  • Kết hợp star filters và sort orders để vượt giới hạn phân trang 10 trang và truy cập hơn 500 review mỗi sản phẩm
  • Thêm sentiment analysis với TextBlob để có baseline nhanh, hoặc Hugging Face Transformers để đạt độ chính xác production
  • Duy trì cơ chế chống bot: throttling, xoay User-Agent, exponential backoff, và residential proxies khi scale

Python cho bạn toàn quyền kiểm soát và là cách tốt nhất để hiểu chuyện gì đang diễn ra bên trong. 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 spreadsheet trước thứ Sáu” chứ không phải “tôi muốn xây một data pipeline production,” thì gánh nặng bảo trì của scraper tự làm có thể không đáng.

Thunderbit xử lý xác thực, selector, phân trang, và export chỉ bằng vài cú click — hãy thử free tier và xem nó có hợ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, những công cụ dùng AI để thích ứng theo thời gian thực sẽ không còn là “có thì tốt” nữa, mà sẽ dần trở thành thứ bắt buộc.

Bạn cũng có thể khám phá Thunderbit YouTube Channel để xem video walkthrough về các workflow scraping.

FAQs

1. Can you scrape Amazon reviews without logging in?

Có, nhưng chỉ lấy đượ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 sort, filter, và pagination thì từ cuối năm 2024 trở đi đều cần xác thực. Với hầu hết nhu cầu kinh doanh, bạn sẽ phải xử lý login wall.

2. Is it legal to scrape Amazon reviews?

Đ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) ủng hộ việc scrape dữ liệu công khai. Scraping phía sau login có rủi ro pháp lý cao hơn vì bạn đã đồng ý với ToS của Amazon. Hãy hỏi ý kiến luật sư nếu dùng cho mục đích thương mại.

3. How many Amazon reviews can I scrape per product?

Amazon giới hạn mỗi tổ hợp sort order và star filter ở 10 trang review. Dùng đủ 5 star filters × 2 sort orders, bạn có thể truy cập tối đa 100 trang, tức khoảng 1.000 review mỗi sản phẩm. Với keyword filters, trần lý thuyết còn cao hơn, nhưng sẽ có độ trùng lặp đáng kể.

4. What is the best Python library for scraping Amazon reviews?

requests + BeautifulSoup cho parse HTML tĩnh là combo phổ biến và đáng tin cậy nhất. Selenium hữu ích khi cần render JavaScript. Nếu muốn một lựa chọn no-code xử lý login wall và pagination tự động, hãy thử Thunderbit.

5. How do I avoid getting blocked when scraping Amazon?

Xoay vòng User-Agent từ một pool gồm 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, dùng exponential backoff khi gặp lỗi 503/429, sử dụng residential proxies 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ì, Thunderbit sẽ xử lý cơ chế chống bot tự động thông qua phiên trình duyệt của bạn.

Learn More

Fawad Khan
Fawad Khan
Fawad sống bằng nghề viết, và nói thật là anh ấy khá yêu công việc này. Anh đã dành nhiều năm để tìm hiểu điều gì khiến một câu chữ in đậm trong tâm trí người đọc — và điều gì khiến họ lướt qua. Hỏi anh về marketing, anh có thể nói hàng giờ. Hỏi anh về carbonara, anh sẽ nói còn lâu hơn.
Mục lục
Thunderbit · Tác nhân dữ liệu web AI

Trích xuất dữ liệu từ bất kỳ trang nào trong 1 lần nhấp

Được hơn 250.000+ người dùng tin tưởng
có gói miễn phí
Từ trang web đến bảng tính
Mô tả điều bạn cần — AI Agent của Thunderbit sẽ scrape và xuất sang Excel, Google Sheets, Airtable hoặc Notion. Bắt đầu miễn phí.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week