Học cách scrape sản phẩm Amazon bằng Python

Cập nhật lần cuối vào August 20, 2026
Học cách scrape sản phẩm Amazon bằng Python

Nếu bạn từng làm theo một hướng dẫn scrape Amazon rồi vẫn bị chặn bởi CAPTCHAs, lỗi 503, hoặc nhận về kết quả trống rỗng — chào mừng bạn đến với “câu lạc bộ”. Phần lớn các bài hướng dẫn scrape Amazon bằng Python đang trôi nổi trên internet đều được viết từ năm 2022 hoặc 2023, nên chúng dùng những selector và kỹ thuật mà Amazon đã vá từ lâu.

Tôi đã dành nhiều năm xây dựng công cụ trích xuất dữ liệu tại Thunderbit, và có một điều tôi có thể khẳng định từ thực chiến: Amazon là một trong những website khó scrape ổn định nhất. Nền tảng này thay đổi cấu trúc HTML liên tục, triển khai hệ thống chống bot nhiều lớp, và thậm chí còn hiển thị bố cục trang khác nhau cho từng nhóm người dùng thông qua A/B testing. Trong hướng dẫn này, tôi sẽ dẫn bạn qua một Amazon scraper bằng Python thực sự hoạt động trong năm 2025 — với CSS selector đã kiểm chứng, chiến lược chống chặn theo nhiều lớp, cùng cách lên lịch và xuất dữ liệu mà rất nhiều bài hướng dẫn thường bỏ qua. Và nếu bạn chỉ cần dữ liệu mà không muốn vật lộn với Python, tôi cũng sẽ chỉ cho bạn cách Thunderbit làm cùng việc đó chỉ trong khoảng hai cú nhấp.

Scrape sản phẩm Amazon là gì?

Scrape sản phẩm Amazon là quá trình dùng chương trình để trích xuất dữ liệu công khai — như tên sản phẩm, giá, đánh giá, số lượng review, hình ảnh, tình trạng còn hàng và nhiều hơn nữa — từ các trang sản phẩm và trang kết quả tìm kiếm của Amazon. Thay vì phải sao chép thủ công thông tin từ hàng trăm listing, scraper sẽ tự truy cập từng trang, đọc HTML, rồi lấy ra dữ liệu bạn cần và đưa vào định dạng có cấu trúc như CSV, Excel hoặc cơ sở dữ liệu.

Hãy tưởng tượng nó giống như thuê một thực tập sinh không biết mệt, có thể ghé thăm một nghìn trang sản phẩm trong khoảng thời gian bạn nhâm nhi xong ly cà phê buổi sáng. Chỉ khác là thực tập sinh này không bao giờ đánh máy sai và cũng chẳng cần nghỉ trưa.

Vì sao nên scrape sản phẩm Amazon bằng Python?

Amazon hiện có khoảng 350–600 triệu listing sản phẩm trải dài hơn 30 danh mục, vận hành bởi khoảng 9,7 triệu tài khoản người bán. Người bán bên thứ ba hiện chiếm 69% tổng GMV. Theo dõi thủ công dù chỉ một phần nhỏ của kho dữ liệu này cũng là điều không thể. Đây là lý do các đội ngũ thường scrape Amazon:

Trường hợp sử dụngAi hưởng lợiHọ trích xuất gì
Theo dõi giá & điều chỉnh giáVận hành ecommerce, người bán trên marketplaceGiá, tình trạng còn hàng, thông tin người bán
Phân tích đối thủProduct manager, đội ngũ thương hiệuTính năng sản phẩm, rating, số lượng review
Nghiên cứu thị trườngNhà phân tích, đội phát triển sản phẩm mớiXu hướng danh mục, phân bố giá
Tạo khách hàng tiềm năngĐội salesTên người bán, thông tin thương hiệu, dữ liệu liên hệ
Affiliate marketingNhà sáng tạo nội dung, website dealGiá, ưu đãi, thông tin sản phẩm
Theo dõi tồn khoChuỗi cung ứng, mua hàngTrạng thái hàng, ước tính giao hàng

Riêng nhịp thay đổi giá của Amazon đã đủ cho thấy tự động hóa là điều bắt buộc: Amazon thay đổi giá hơn 2,5 triệu lần mỗi ngày, và giá trung bình của mỗi sản phẩm cập nhật khoảng 10 phút một lần. Trong khi đó, các đối thủ như Best Buy và Walmart chỉ đổi giá khoảng 50.000 lần mỗi tháng. Không có đội ngũ con người nào theo kịp nổi.

amazon-product-price-monitor-dashboard.webp

Python cho bạn toàn quyền kiểm soát quy trình scrape — bạn tự quyết định lấy gì, xử lý lỗi ra sao và lưu dữ liệu ở đâu. Nhưng đổi lại, bạn cũng phải tự chịu trách nhiệm bảo trì, chống chặn và theo kịp những lần Amazon đổi HTML liên tục.

Bạn có thể scrape gì từ Amazon, và không nên lấy gì?

Từ các trang sản phẩm công khai, thông thường bạn có thể trích xuất:

  • Tên sản phẩm (tên, thương hiệu)
  • Giá (giá hiện tại, giá gốc, giá ưu đãi)
  • Đánh giá (rating sao trung bình)
  • Số lượng review
  • Hình ảnh sản phẩm (URL ảnh chính)
  • Tình trạng còn hàng / tồn kho
  • ASIN (Amazon Standard Identification Number)
  • Mô tả sản phẩm và các gạch đầu dòng
  • Thông tin người bán
  • Biến thể sản phẩm (size, màu sắc, v.v.)

Những thứ bạn nên tránh:

  • Dữ liệu nằm sau lớp đăng nhập: trang review mở rộng, dữ liệu tài khoản cá nhân, lịch sử đơn hàng
  • Thông tin cá nhân: tên người mua, địa chỉ, thông tin thanh toán
  • Nội dung có bản quyền để đăng lại: mô tả sản phẩm và hình ảnh có thể dùng cho phân tích, nhưng đừng đăng lại như của riêng bạn

robots.txt của Amazon chặn hơn 50 bot được đặt tên (bao gồm GPTBot, Scrapy và ClaudeBot) và cấm các đường dẫn như tài khoản người dùng, giỏ hàng và wishlists. Trang chi tiết sản phẩm không bị cấm rõ ràng, nhưng Điều khoản Dịch vụ của Amazon vẫn cấm truy cập tự động. Tòa án thường phân biệt giữa vi phạm ToS (vấn đề dân sự) và vi phạm hình sự theo CFAA — phần pháp lý sẽ được nói thêm ở cuối bài.

Những công cụ và thư viện bạn cần

Dưới đây là bộ công cụ Python cho bài hướng dẫn này:

Thư việnMục đíchVì sao dùng
requestsGửi HTTP requestĐơn giản, được hỗ trợ rộng rãi
beautifulsoup4Phân tích HTMLTrích xuất bằng CSS selector rất dễ
lxmlHTML parser tốc độ caoLà backend parser cho BeautifulSoup
curl_cffiGiả lập dấu vân tay TLSRất quan trọng để vượt qua cơ chế phát hiện của Amazon
pandasCấu trúc và xuất dữ liệuDataFrame, xuất CSV/Excel

Tùy chọn thêm (cho nội dung render bằng JavaScript):

  • selenium hoặc playwright — tự động hóa trình duyệt headless

Thiết lập môi trường Python

Mở terminal và chạy:

mkdir amazon-scraper && cd amazon-scraper
python -m venv venv
source venv/bin/activate  # Trên Windows: venv\Scripts\activate
pip install requests beautifulsoup4 lxml curl_cffi pandas

Kiểm tra mọi thứ đã được cài:

import requests, bs4, curl_cffi, pandas
print("All good!")

Nếu bạn thấy "All good!" mà không có lỗi, là sẵn sàng rồi.

laptop-coding-workspace.webp

Vì sao đa số hướng dẫn scrape Amazon đều hỏng (và bài này khác gì)

Đây là phần mà hầu hết bài viết bỏ qua, nhưng cũng là lý do có lẽ bạn đang đọc bài này.

Amazon thường xuyên cập nhật cấu trúc HTML, tên class và element ID. Cộng đồng scrape báo cáo rằng 10–15% crawler cần sửa hàng tuần vì thay đổi DOM và fingerprinting. “Nạn nhân” nổi tiếng nhất? Selector #priceblock_ourprice, xuất hiện trong hàng trăm hướng dẫn từ 2018–2023. ID đó giờ đã không còn trên trang sản phẩm Amazon nữa.

So sánh nhanh giữa những gì đã hỏng và những gì đang hoạt động:

Điểm dữ liệuSelector đã hỏng (trước 2024)Selector đang hoạt động năm 2025
Giá#priceblock_ourpricediv#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen
Tên sản phẩm#productTitlespan#productTitle (vẫn dùng được)
Ratingspan.a-icon-alt (đôi khi sai ngữ cảnh)#acrPopover span.a-icon-alt
Số review#acrCustomerReviewCountspan#acrCustomerReviewText
Tình trạng hàng#availability spandiv#availability span.a-size-medium

Mọi đoạn code trong bài này đều đã được test trên các trang Amazon thực tế trong năm 2025. Tôi sẽ chỉ cho bạn CSS selector thật cùng output dự kiến — không phải copy từ năm 2022.

Trước khi bắt đầu

  • Mức độ khó: Trung bình khá (giả định bạn đã biết Python cơ bản)
  • Thời gian cần thiết: Khoảng 30–45 phút cho toàn bộ hướng dẫn; khoảng 10 phút cho scraper cơ bản
  • Bạn cần: Python 3.9+, trình duyệt Chrome (để inspect trang Amazon), terminal, và tùy chọn là Thunderbit Chrome Extension nếu muốn so sánh với cách không cần code

Bước 1: Gửi request đầu tiên tới Amazon

Mở một trang sản phẩm Amazon bất kỳ trong trình duyệt và copy URL. Ta bắt đầu bằng requests.get() đơn giản:

import requests

url = "https://www.amazon.com/dp/B0DGNFM9YJ"
response = requests.get(url)
print(response.status_code)
print(response.text[:500])

Chạy đoạn này, gần như chắc chắn bạn sẽ nhận được mã trạng thái 503 hoặc một trang có dòng "To discuss automated access to Amazon data please contact…". Đó là WAF (Web Application Firewall) của Amazon đang phát hiện script Python của bạn. Một requests.get() trống không kèm header phù hợp chỉ đạt tỷ lệ thành công khoảng 2% trên Amazon.

Bạn sẽ thấy kiểu như 503 và một trang chặn trong HTML. Điều đó là bình thường — ta sẽ xử lý ở bước sau.

Bước 2: Thiết lập custom headers và giả lập TLS

Chỉ thêm header User-Agent là chưa đủ nữa. Amazon so sánh header HTTP của bạn với dấu vân tay TLS. Nếu bạn tự nhận là Chrome 120 nhưng bắt tay TLS lại cho thấy bạn dùng thư viện requests của Python, bạn sẽ bị đánh dấu ngay lập tức.

Cách đáng tin cậy nhất trong năm 2025 là dùng curl_cffi với giả lập trình duyệt:

from curl_cffi import requests as cfreq

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.google.com/",
    "DNT": "1",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
}

url = "https://www.amazon.com/dp/B0DGNFM9YJ"
response = cfreq.get(url, headers=headers, impersonate="chrome124")
print(response.status_code)
print(len(response.text))

Với curl_cffi giả lập Chrome 124, tỷ lệ thành công tăng lên khoảng 94% — tức cao hơn 47 lần so với requests thuần. Lúc này bạn sẽ thấy mã 200 và phần HTML dài hơn rất nhiều (trên 100.000 ký tự).

Nếu vẫn nhận 503, hãy thử giá trị impersonate khác (ví dụ "chrome131") hoặc chờ ngắn một chút rồi thử lại.

Bước 3: Parse HTML và trích xuất dữ liệu sản phẩm

Bây giờ đã có HTML đầy đủ, hãy trích xuất dữ liệu bằng BeautifulSoup với các selector 2025 đã được kiểm chứng:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "lxml")

# Tên sản phẩm
title_el = soup.select_one("span#productTitle")
title = title_el.get_text(strip=True) if title_el else None

# Giá
price_el = soup.select_one(
    "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
)
if not price_el:
    price_el = soup.select_one("span.priceToPay .a-offscreen")
if not price_el:
    price_el = soup.select_one(".apexPriceToPay .a-offscreen")
price = price_el.get_text(strip=True) if price_el else None

# Rating
rating_el = soup.select_one("#acrPopover span.a-icon-alt")
rating = rating_el.get_text(strip=True) if rating_el else None

# Số review
reviews_el = soup.select_one("span#acrCustomerReviewText")
reviews = reviews_el.get_text(strip=True) if reviews_el else None

# Tình trạng hàng
avail_el = soup.select_one("div#availability span")
availability = avail_el.get_text(strip=True) if avail_el else None

# URL ảnh chính
img_el = soup.select_one("#landingImage")
image_url = img_el.get("src") if img_el else None

print(f"Title: {title}")
print(f"Price: {price}")
print(f"Rating: {rating}")
print(f"Reviews: {reviews}")
print(f"Availability: {availability}")
print(f"Image: {image_url}")

Kết quả mong đợi (ví dụ):

Title: Apple AirPods Pro (2nd Generation) with USB-C
Price: $189.99
Rating: 4.7 out of 5 stars
Reviews: 98,432 ratings
Availability: In Stock
Image: https://m.media-amazon.com/images/I/61SUj2...

Lưu ý các selector dự phòng cho phần giá — Amazon dùng những container khác nhau tùy loại sản phẩm, trạng thái deal và biến thể A/B test. Việc bọc từng bước trích xuất bằng điều kiện sẽ giúp scraper không bị crash khi selector không khớp.

Bước 4: Scrape nhiều sản phẩm từ trang kết quả tìm kiếm

Để xây dựng một bộ dữ liệu thực sự, bạn nên bắt đầu từ trang kết quả tìm kiếm của Amazon, thu thập ASIN rồi scrape từng trang chi tiết sản phẩm.

import time
import random

def get_search_asins(keyword, max_pages=1):
    """Thu thập ASIN từ kết quả tìm kiếm Amazon."""
    asins = []
    for page in range(1, max_pages + 1):
        search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
        resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
        if resp.status_code != 200:
            print(f"Search page {page} returned {resp.status_code}")
            break

        search_soup = BeautifulSoup(resp.text, "lxml")
        results = search_soup.select('div[data-component-type="s-search-result"]')

        for r in results:
            asin = r.get("data-asin")
            if asin:
                asins.append(asin)

        print(f"Page {page}: found {len(results)} products")
        time.sleep(random.uniform(2, 5))  # Tạm dừng lịch sự

    return asins

asins = get_search_asins("wireless+earbuds", max_pages=2)
print(f"Collected {len(asins)} ASINs")

Mỗi ASIN tương ứng với một URL sản phẩm sạch sẽ: https://www.amazon.com/dp/{ASIN}. Cách này ổn định hơn nhiều so với dùng URL từ trang kết quả tìm kiếm đầy đủ, vốn có thể chứa tham số riêng theo phiên.

Bước 5: Xử lý phân trang và scrape ở quy mô lớn

Bây giờ hãy ghép thu thập từ search và scrape trang chi tiết thành một pipeline hoàn chỉnh:

import pandas as pd

def scrape_product(asin):
    """Scrape một trang chi tiết sản phẩm Amazon."""
    url = f"https://www.amazon.com/dp/{asin}"
    try:
        resp = cfreq.get(url, headers=headers, impersonate="chrome124")
        if resp.status_code != 200:
            return None

        soup = BeautifulSoup(resp.text, "lxml")

        title_el = soup.select_one("span#productTitle")
        price_el = (
            soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
            or soup.select_one("span.priceToPay .a-offscreen")
            or soup.select_one(".apexPriceToPay .a-offscreen")
        )
        rating_el = soup.select_one("#acrPopover span.a-icon-alt")
        reviews_el = soup.select_one("span#acrCustomerReviewText")
        avail_el = soup.select_one("div#availability span")
        img_el = soup.select_one("#landingImage")

        return {
            "asin": asin,
            "title": title_el.get_text(strip=True) if title_el else None,
            "price": price_el.get_text(strip=True) if price_el else None,
            "rating": rating_el.get_text(strip=True) if rating_el else None,
            "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
            "availability": avail_el.get_text(strip=True) if avail_el else None,
            "image_url": img_el.get("src") if img_el else None,
            "url": url,
        }
    except Exception as e:
        print(f"Error scraping {asin}: {e}")
        return None

# Scrape tất cả ASIN đã thu thập
products = []
for i, asin in enumerate(asins):
    print(f"Scraping {i+1}/{len(asins)}: {asin}")
    product = scrape_product(asin)
    if product:
        products.append(product)
    time.sleep(random.uniform(2, 5))  # Random delay giữa các request

df = pd.DataFrame(products)
print(f"\nScraped {len(df)} products successfully")
print(df.head())

Khoảng dừng ngẫu nhiên từ 2–5 giây là cực kỳ quan trọng. Nhịp quá đều đặn (ví dụ cứ đúng 3 giây một lần) sẽ trông rất đáng ngờ với hệ thống phân tích hành vi của Amazon. Khoảng ngắt ngẫu nhiên mô phỏng cách con người duyệt web.

Bước 6: Lưu dữ liệu Amazon đã scrape sang CSV

df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
print("Saved to amazon_products.csv")

Lúc này bạn sẽ có một CSV gọn gàng với các cột ASIN, title, price, rating, reviews, availability, image URL và product URL. Phần lớn các bài hướng dẫn dừng ở đây — nhưng nếu bạn đang xây một workflow thực sự, CSV chỉ là điểm khởi đầu.

Đi sâu vào chống chặn: Làm sao để scraper chạy lâu dài

Bị chặn là nỗi đau số 1 của bất kỳ ai thử scrape sản phẩm Amazon bằng Python. Hệ thống phòng thủ 6 lớp của Amazon bao gồm phân tích uy tín IP, TLS fingerprinting, kiểm tra môi trường trình duyệt, sinh trắc học hành vi, CAPTCHAs và phát hiện bất thường bằng ML. Dưới đây là chiến lược nhiều lớp để xử lý từng phần.

Xoay vòng User-Agent và toàn bộ header

Một User-Agent cố định rất dễ bị phát hiện. Hãy luân phiên giữa nhiều chuỗi trình duyệt hiện hành:

import random

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
]

def get_headers():
    return {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
        "Referer": "https://www.google.com/",
        "DNT": "1",
        "Connection": "keep-alive",
    }

Một chi tiết hay khiến người ta vấp phải: Accept-Language phải khớp với khu vực địa lý mà IP của bạn thể hiện. Gửi Accept-Language: en-US từ IP Đức là một tín hiệu rất dễ bị nghi ngờ.

Giả lập TLS fingerprint với curl_cffi

Chúng ta đã nói ở Bước 2, nhưng điều này đáng được nhấn mạnh: đây là kỹ thuật đem lại cải thiện lớn nhất về tỷ lệ thành công. requests chuẩn của Python chỉ đạt khoảng 2% khi gặp Amazon. Với curl_cffi giả lập, bạn lên khoảng 94%. Đó là ranh giới giữa scraper hoạt động và scraper hỏng.

from curl_cffi import requests as cfreq

# Luân phiên cả target giả lập trình duyệt
BROWSERS = ["chrome120", "chrome124", "chrome131"]

response = cfreq.get(
    url,
    headers=get_headers(),
    impersonate=random.choice(BROWSERS),
)

Xoay proxy

Nếu scrape nhiều hơn vài trang, bạn sẽ cần xoay proxy. Amazon theo dõi địa chỉ IP và sẽ chặn bất kỳ IP nào gửi quá nhiều request.

PROXIES = [
    "http://user:pass@proxy1.example.com:8080",
    "http://user:pass@proxy2.example.com:8080",
    "http://user:pass@proxy3.example.com:8080",
]

proxy = random.choice(PROXIES)
response = cfreq.get(
    url,
    headers=get_headers(),
    impersonate="chrome124",
    proxies={"http": proxy, "https": proxy},
)

Proxy residential hiệu quả hơn proxy datacenter (Amazon chủ động chặn dải IP datacenter), nhưng cũng đắt hơn. Với dự án nhỏ, bạn có thể bắt đầu bằng một dịch vụ proxy trả phí rồi mở rộng dần khi cần.

Giới hạn tốc độ và exponential backoff

Không có bài viết đối thủ nào tôi tìm thấy nói kỹ phần này, nhưng nó cực kỳ quan trọng. Khi bị trả về 503 hoặc CAPTCHA, đừng retry ngay lập tức — đó là con đường nhanh nhất dẫn đến khóa vĩnh viễn.

import time
import random

def fetch_with_backoff(url, max_retries=3):
    """Fetch một URL với exponential backoff khi lỗi."""
    for attempt in range(max_retries):
        response = cfreq.get(
            url,
            headers=get_headers(),
            impersonate=random.choice(BROWSERS),
        )
        if response.status_code == 200:
            return response

        # Exponential backoff kèm jitter
        wait = min(2 ** attempt + random.uniform(0, 1), 30)
        print(f"Attempt {attempt+1} failed ({response.status_code}). Waiting {wait:.1f}s...")
        time.sleep(wait)

    return None  # Hết số lần thử

Công thức wait = min(2^attempt + jitter, max_delay) đảm bảo độ trễ tăng dần (2s, 4s, 8s...) nhưng không vượt quá một ngưỡng hợp lý. Phần jitter ngẫu nhiên giúp tránh để mẫu retry của bạn bị fingerprint.

Selenium hoặc Playwright làm phương án dự phòng cho nội dung render bằng JS

Một số trang Amazon (đặc biệt là những trang có widget giá động hoặc selector biến thể) cần JavaScript để render đầy đủ. Khi curl_cffi trả về HTML chưa đầy đủ, hãy dùng trình duyệt headless làm phương án dự phòng:

from playwright.sync_api import sync_playwright

def scrape_with_browser(url):
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        page.goto(url, wait_until="domcontentloaded")
        page.wait_for_timeout(3000)  # Chờ JS render
        html = page.content()
        browser.close()
        return html

Cách này chậm hơn — khoảng 3–5 giây mỗi trang so với dưới 1 giây khi dùng curl_cffi. Chỉ dùng khi thật sự cần.

Theo kinh nghiệm của tôi, curl_cffi xử lý hơn 90% trang sản phẩm Amazon mà không cần trình duyệt.

Tóm tắt chống chặn

Kỹ thuậtĐộ khóHiệu quảPhần lớn hướng dẫn có nói không?
User-Agent tùy chỉnhDễThấp (Amazon vẫn nhận ra mẫu)
Xoay toàn bộ headerDễTrung bìnhHiếm khi
Giả lập TLS (curl_cffi)Trung bìnhCao (~94% thành công)Gần như không
Xoay proxyTrung bìnhCaoÍt khi, nếu có
Giới hạn tốc độ + exponential backoffDễTrung bìnhKhông
Fallback bằng Selenium/PlaywrightTrung bìnhCao (cho nội dung JS)Có nhắc, nhưng không demo

Vượt qua CSV: Xuất dữ liệu Amazon sang Google Sheets, Airtable và hơn thế nữa

Mỗi bài hướng dẫn tôi xem qua đều dừng ở xuất CSV. Nhưng workflow thực tế của doanh nghiệp cần dữ liệu trong Google Sheets, database, hoặc các công cụ như Airtable và Notion.

Xuất sang Google Sheets bằng gspread

Trước tiên, hãy thiết lập Google service account (làm một lần):

  1. Vào Google Cloud Console → APIs & Services → Credentials
  2. Tạo service account và tải file JSON key
  3. Lưu vào ~/.config/gspread/service_account.json
  4. Chia sẻ bảng tính đích với client_email trong file JSON

Sau đó:

import gspread
from gspread_dataframe import set_with_dataframe

gc = gspread.service_account()
sh = gc.open("Amazon Scrape Data")
worksheet = sh.sheet1

set_with_dataframe(worksheet, df)
print("Data exported to Google Sheets!")

Cách này ghi toàn bộ DataFrame trực tiếp vào Google Sheet — cập nhật theo thời gian thực, có thể chia sẻ, sẵn sàng cho dashboard.

Lưu vào SQLite để phân tích nội bộ

Với bộ dữ liệu lớn hơn hoặc theo dõi lịch sử, SQLite là lựa chọn rất hợp lý — không cần thiết lập server, chỉ là một file duy nhất:

import sqlite3

conn = sqlite3.connect("amazon_products.db")
df.to_sql("products", conn, if_exists="append", index=False)
print(f"Stored {len(df)} products in SQLite")

# Truy vấn sau:
historical = pd.read_sql_query(
    "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
    conn,
)

Giải pháp không cần code

Nếu bạn không muốn phải duy trì các script export bằng Python, Thunderbit hỗ trợ xuất miễn phí sang Google Sheets, Airtable, Notion, Excel, CSV và JSON — bao gồm cả các trường ảnh có thể hiển thị trực tiếp trong Airtable và Notion. Không cần cấu hình gspread, không cần API credentials, không cần code. Với các team cần đẩy dữ liệu vào những công cụ sẵn có, đây là cách tiết kiệm thời gian đáng kể.

Lên lịch scrape Amazon tự động — chương còn thiếu

Theo dõi giá và tồn kho đòi hỏi scrape lặp lại, không phải chạy một lần. Tuy vậy, tôi không tìm thấy bài đối thủ nào thực sự nói về lập lịch. Dưới đây là cách tự động hóa scraper Python của bạn.

Cron Jobs (Linux/macOS)

Mở crontab:

crontab -e

Thêm dòng để chạy scraper mỗi ngày lúc 6 giờ sáng:

0 6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Hoặc mỗi 6 giờ:

0 */6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Windows Task Scheduler

Tạo file batch run_scraper.bat:

@echo off
cd /d "C:\path\to\amazon-scraper"
call venv\Scripts\activate
python scraper.py
deactivate

Sau đó mở Task Scheduler → Create Basic Task → đặt lịch (Daily, Hourly) → Action: "Start a program" → trỏ tới run_scraper.bat.

GitHub Actions (gói miễn phí)

Nếu muốn có lịch chạy trên cloud mà không cần hạ tầng:

name: Amazon Scraper

on:
  schedule:
    - cron: "0 6 * * *"  # Mỗi ngày lúc 6:00 UTC
  workflow_dispatch:       # Chạy thủ công

jobs:
  scrape:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Run scraper
        run: python scraper.py
      - name: Commit results
        run: |
          git config user.name 'GitHub Actions'
          git config user.email 'actions@github.com'
          git add data/
          git diff --staged --quiet || git commit -m "Update scraped data"
          git push

Lưu thông tin proxy trong GitHub Secrets, và bạn đã có một pipeline scrape tự động miễn phí.

Giải pháp không cần code: Scheduled Scraper của Thunderbit

Với các team không muốn quản lý cron syntax hay hạ tầng cloud, Thunderbit cung cấp sẵn tính năng Scheduled Scraper. Bạn chỉ cần mô tả lịch bằng tiếng tự nhiên (ví dụ: "mỗi ngày lúc 8 giờ sáng" hoặc "mỗi thứ Hai"), thêm URL Amazon của bạn và nhấn "Schedule." Không cần terminal, không cần file YAML, không cần pipeline triển khai. Tính năng này đặc biệt hữu ích cho đội ecommerce cần theo dõi giá hoặc tồn kho liên tục.

Python tự làm vs. Scraper API vs. No-code: Nên chọn cách nào?

Đây là câu hỏi tôi thấy trên các diễn đàn liên tục, nhưng chưa có bài xếp hạng nào trả lời có cấu trúc cả. Vậy nên đây là góc nhìn thẳng thắn của tôi:

Tiêu chíPython + BS4/curl_cffiScraper API (ScraperAPI, Oxylabs)No-code (Thunderbit)
Thời gian thiết lập30–60 phút10–20 phútKhoảng 2 phút
Có cần code khôngCó (Python)Có (gọi API)Không
Chống chặn có sẵnKhông (tự làm)
Xử lý render JSChỉ khi dùng Selenium/PlaywrightTùy nhà cung cấpCó (Browser hoặc Cloud mode)
Lên lịchTự làm (cron/cloud)Một số nhà cung cấp cóCó sẵn
Chi phíMiễn phí (+ phí proxy)$30–100+/thángCó gói miễn phí
Bảo trìCao (selector dễ hỏng)ThấpKhông có
Phù hợp nhất choDeveloper muốn toàn quyền kiểm soátCần scale và độ ổn định caoCần tốc độ, người không biết code, user doanh nghiệp

Python là lựa chọn đúng nếu bạn muốn học, tùy chỉnh mọi chi tiết và không ngại bảo trì liên tục. Scraper API lo phần chống chặn cho bạn nhưng vẫn cần code. Còn Thunderbit là đường đi nhanh nhất cho sales, ecommerce ops, hoặc bất kỳ ai chỉ cần dữ liệu — không selector, không code, không phải sửa khi Amazon đổi HTML.

Thunderbit scrape sản phẩm Amazon chỉ với 2 cú nhấp như thế nào

Tất nhiên tôi có thiên vị một chút — vì đội của tôi xây ra nó. Nhưng quy trình thực sự đơn giản như sau:

  1. Cài Thunderbit Chrome Extension
  2. Mở trang kết quả tìm kiếm hoặc trang sản phẩm Amazon
  3. Nhấp "AI Suggest Fields" (hoặc dùng template Amazon scraper có sẵn)
  4. Nhấp "Scrape"

AI của Thunderbit sẽ đọc trang, nhận diện cấu trúc dữ liệu và trích xuất mọi thứ thành một bảng sạch sẽ. Bạn có thể xuất sang Excel, Google Sheets, Airtable hoặc Notion miễn phí. Điểm đáng giá nhất: khi Amazon đổi HTML vào tuần sau (và chuyện đó sẽ xảy ra), AI của Thunderbit sẽ tự thích ứng. Không có script hỏng, không cần cập nhật selector.

Nếu muốn làm giàu danh sách sản phẩm bằng dữ liệu từ các trang chi tiết, tính năng Subpage Scraping của Thunderbit sẽ tự động đi theo link sang trang sản phẩm và kéo thêm các trường như ảnh, mô tả và biến thể — thứ mà Python thường phải viết thêm khá nhiều code mới làm được.

Mẹo để scraper Amazon bằng Python chạy bền lâu

Nếu bạn vẫn chọn Python, đây là cách giảm tối đa công sức bảo trì:

  • Kiểm tra selector thường xuyên. Amazon thay đổi rất nhanh. Hãy bookmark bài này — tôi sẽ cập nhật bảng selector khi có thay đổi.
  • Theo dõi tỷ lệ thành công. Ghi lại tỷ lệ response 200 so với 503/CAPTCHA. Thiết lập cảnh báo (thậm chí chỉ là email đơn giản) khi tỷ lệ thành công xuống dưới 80%.
  • Lưu HTML thô. Lưu toàn bộ HTML response cùng với dữ liệu đã parse. Khi selector thay đổi, bạn có thể parse lại dữ liệu lịch sử mà không cần scrape lại.
  • Xoay proxy và User-Agent thường xuyên. Fingerprint tĩnh sẽ bị phát hiện chỉ trong vài giờ khi chạy ở quy mô lớn.
  • Dùng exponential backoff. Đừng retry ngay sau khi bị chặn.
  • Đóng gói bằng Docker. Bọc scraper trong container Docker để dễ triển khai và mang đi nơi khác.
  • Thêm kiểm tra dữ liệu. Đảm bảo giá là số, rating nằm trong khoảng 1–5, và title không rỗng. Một nhóm đã báo cáo giảm 21% lỗi downstream sau khi thêm lớp validation.

Hoặc nếu nghe tất cả những thứ này còn nhiều việc hơn bạn mong muốn, hãy cân nhắc xem một công cụ no-code như Thunderbit có phù hợp hơn với nhu cầu của bạn không. Không có gì phải ngại khi chọn con đường nhanh hơn — tôi đã dành đủ nhiều năm để debug scraper và biết rằng đôi khi code tốt nhất là code bạn không cần viết.

Cân nhắc pháp lý và đạo đức khi scrape Amazon

Vì câu hỏi này luôn xuất hiện trong mọi cuộc thảo luận về Amazon scraping, nên đây là tóm tắt nhanh về khung pháp lý:

  • Scrape dữ liệu công khai nhìn chung là hợp pháp tại Mỹ. Phán quyết quan trọng hiQ Labs v. LinkedIn (2022) xác lập rằng truy cập dữ liệu công khai không vi phạm CFAA. Gần đây hơn, Meta v. Bright Data (2024) và X v. Bright Data (2024) cũng củng cố nguyên tắc này.
  • Điều khoản dịch vụ của Amazon cấm truy cập tự động. Đây là vấn đề dân sự (vi phạm hợp đồng), không phải hình sự. Tòa án thường phân biệt rõ hai loại này.
  • Amazon v. Perplexity (2025) là vụ kiện đang diễn ra liên quan đến việc AI scrape các trang Amazon. Một lệnh sơ bộ đã được ban hành vào tháng 3 năm 2026. Đây là vụ đáng theo dõi.
  • Chỉ scrape trang công khai. Đừng scrape nội dung cần đăng nhập, dữ liệu cá nhân, hoặc bất kỳ thứ gì nằm sau xác thực.
  • Tôn trọng giới hạn tốc độ. Đừng “đập” server Amazon quá mạnh. Khoảng nghỉ 2–5 giây giữa các request là hợp lý.
  • Sử dụng dữ liệu có trách nhiệm. Scrape để phân tích, không phải để đăng lại nội dung có bản quyền.
  • Hỏi ý kiến luật sư nếu dùng cho mục đích thương mại ở quy mô lớn, đặc biệt nếu bạn ở EU (GDPR áp dụng cho dữ liệu cá nhân).

Để đọc sâu hơn, hãy xem hướng dẫn của chúng tôi về tác động pháp lý của web scraping.

Kết luận

Bây giờ bạn đã có một Amazon scraper bằng Python hoạt động với các selector 2025 đã được kiểm chứng, một chiến lược chống chặn nhiều lớp vượt xa kiểu “thêm User-Agent”, các cách lập lịch thực tế cho việc theo dõi liên tục, và những phương án xuất dữ liệu vào Google Sheets, database hoặc bất kỳ công cụ nào đội của bạn đang dùng.

Tóm tắt nhanh:

  • Python + curl_cffi + BeautifulSoup cho bạn toàn quyền kiểm soát và tỷ lệ thành công khoảng ~94% khi kết hợp với TLS impersonation
  • Chống chặn cần nhiều lớp: xoay header, giả lập TLS, xoay proxy, giới hạn tốc độ và exponential backoff
  • Lên lịch biến một script chạy một lần thành pipeline theo dõi liên tục (cron, GitHub Actions hoặc scheduler có sẵn của Thunderbit)
  • Xuất vượt CSV — Google Sheets, SQLite, Airtable, Notion — mới là nơi tạo ra giá trị kinh doanh thực sự
  • Thunderbit là lựa chọn 2 cú nhấp cho người không biết code hoặc bất kỳ ai muốn dành thời gian phân tích dữ liệu thay vì sửa selector

Nếu bạn muốn thử code, mọi thứ trong bài này đều đã sẵn sàng để copy và chạy. Còn nếu bạn muốn bỏ qua phần lập trình, gói miễn phí của Thunderbit cho phép bạn thử ngay cách không cần code trên Amazon.

Xem thêm các hướng dẫn của chúng tôi về cách scrape sản phẩm và review Amazon, công cụ web scraping Python tốt nhất, và scrape giá Amazon. Bạn cũng có thể xem video hướng dẫn từng bước trên Thunderbit YouTube Channel.

Chúc bạn scrape vui vẻ — và mong selector của bạn sống sót cho tới lần Amazon cập nhật tiếp theo.

FAQs

1. Vì sao Amazon scraper bằng Python của tôi bị chặn sau vài request?

Amazon dùng hệ thống phòng thủ 6 lớp: phân tích uy tín IP, TLS fingerprinting (JA3/JA4), phát hiện môi trường trình duyệt, sinh trắc học hành vi, thử thách CAPTCHA và phát hiện bất thường bằng ML. Một script requests cơ bản chỉ thêm header User-Agent đạt khoảng 2% thành công. Bạn cần giả lập TLS (curl_cffi), xoay toàn bộ header, xoay proxy, và giới hạn tốc độ với jitter ngẫu nhiên để duy trì truy cập ổn định.

2. Thư viện Python nào tốt nhất để scrape sản phẩm Amazon trong năm 2025?

curl_cffi cho request HTTP có giả lập TLS là lựa chọn mang lại cải thiện lớn nhất, BeautifulSoup4 kết hợp lxml để parse HTML, pandas để cấu trúc và xuất dữ liệu, và Selenium hoặc Playwright làm phương án dự phòng cho nội dung render bằng JavaScript. Python đang được 69,6% nhà phát triển web scraping sử dụng.

3. Có hợp pháp để scrape dữ liệu sản phẩm Amazon không?

Scrape dữ liệu công khai nhìn chung là hợp pháp tại Mỹ, được hỗ trợ bởi các phán quyết như hiQ v. LinkedIn và Meta v. Bright Data. Điều khoản dịch vụ của Amazon cấm truy cập tự động, nhưng tòa án phân biệt giữa vi phạm ToS (dân sự) và vi phạm hình sự. Luôn tránh nội dung cần đăng nhập, tôn trọng giới hạn tốc độ và hỏi luật sư nếu dùng thương mại ở quy mô lớn.

4. Tôi có thể scrape Amazon mà không cần viết code không?

Có. Các công cụ như Thunderbit cho phép bạn scrape sản phẩm Amazon chỉ với 2 cú nhấp bằng Chrome extension. AI của nó tự nhận diện field và cấu trúc dữ liệu, và bạn có thể export miễn phí sang Excel, Google Sheets, Airtable hoặc Notion. Khi Amazon đổi HTML, AI của Thunderbit tự thích ứng mà không cần bạn chỉnh tay.

5. Amazon thay đổi selector HTML bao lâu một lần, và làm sao giữ scraper luôn cập nhật?

Rất thường xuyên và không báo trước. Cộng đồng scrape cho biết 10–15% crawler cần sửa hàng tuần vì thay đổi DOM. Để đi trước, hãy theo dõi tỷ lệ thành công của scraper, lưu HTML thô để parse lại, và kiểm tra selector trên trang thực tế thường xuyên. Hoặc dùng các công cụ AI như Thunderbit để tự thích ứng, loại bỏ gánh nặng bảo trì này.

Tìm hiểu thêm

Shuai Guan
Shuai Guan
CEO tại Thunderbit | Chuyên gia Tự động hóa Dữ liệu AI Shuai Guan là CEO của Thunderbit và là cựu sinh viên ngành Kỹ thuật của University of Michigan. Với gần một thập kỷ kinh nghiệm trong lĩnh vực công nghệ và kiến trúc SaaS, anh chuyên biến các mô hình AI phức tạp thành những công cụ trích xuất dữ liệu thực tiễn, không cần viết mã. Trên blog này, anh chia sẻ những góc nhìn thẳng thắn, đã được kiểm chứng qua thực chiến về web scraping và các chiến lược tự động hóa, giúp bạn xây dựng quy trình làm việc thông minh hơn, dựa trên dữ liệu. Khi không tối ưu hóa quy trình dữ liệu, anh áp dụng sự tỉ mỉ đó vào niềm đam mê nhiếp ảnh.
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