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

Cập nhật lần cuối vào April 16, 2026

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 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 trải dài hơn 30 danh mục, vận hành bởi khoảng . 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á , 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

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:

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

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

1import requests, bs4, curl_cffi, pandas
2print("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 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à 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:

1import requests
2url = "https://www.amazon.com/dp/B0DGNFM9YJ"
3response = requests.get(url)
4print(response.status_code)
5print(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 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ị .

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:

1from curl_cffi import requests as cfreq
2headers = {
3    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
4    "Accept-Language": "en-US,en;q=0.9",
5    "Accept-Encoding": "gzip, deflate, br",
6    "Referer": "https://www.google.com/",
7    "DNT": "1",
8    "Connection": "keep-alive",
9    "Upgrade-Insecure-Requests": "1",
10}
11url = "https://www.amazon.com/dp/B0DGNFM9YJ"
12response = cfreq.get(url, headers=headers, impersonate="chrome124")
13print(response.status_code)
14print(len(response.text))

Với curl_cffi giả lập Chrome 124, tỷ lệ thành công tăng lên khoảng — 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:

1from bs4 import BeautifulSoup
2soup = BeautifulSoup(response.text, "lxml")
3# Tên sản phẩm
4title_el = soup.select_one("span#productTitle")
5title = title_el.get_text(strip=True) if title_el else None
6# Giá
7price_el = soup.select_one(
8    "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
9)
10if not price_el:
11    price_el = soup.select_one("span.priceToPay .a-offscreen")
12if not price_el:
13    price_el = soup.select_one(".apexPriceToPay .a-offscreen")
14price = price_el.get_text(strip=True) if price_el else None
15# Rating
16rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17rating = rating_el.get_text(strip=True) if rating_el else None
18# Số review
19reviews_el = soup.select_one("span#acrCustomerReviewText")
20reviews = reviews_el.get_text(strip=True) if reviews_el else None
21# Tình trạng hàng
22avail_el = soup.select_one("div#availability span")
23availability = avail_el.get_text(strip=True) if avail_el else None
24# URL ảnh chính
25img_el = soup.select_one("#landingImage")
26image_url = img_el.get("src") if img_el else None
27print(f"Title: {title}")
28print(f"Price: {price}")
29print(f"Rating: {rating}")
30print(f"Reviews: {reviews}")
31print(f"Availability: {availability}")
32print(f"Image: {image_url}")

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

1Title: Apple AirPods Pro (2nd Generation) with USB-C
2Price: $189.99
3Rating: 4.7 out of 5 stars
4Reviews: 98,432 ratings
5Availability: In Stock
6Image: 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.

1import time
2import random
3def get_search_asins(keyword, max_pages=1):
4    """Thu thập ASIN từ kết quả tìm kiếm Amazon."""
5    asins = []
6    for page in range(1, max_pages + 1):
7        search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
8        resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
9        if resp.status_code != 200:
10            print(f"Search page {page} returned {resp.status_code}")
11            break
12        search_soup = BeautifulSoup(resp.text, "lxml")
13        results = search_soup.select('div[data-component-type="s-search-result"]')
14        for r in results:
15            asin = r.get("data-asin")
16            if asin:
17                asins.append(asin)
18        print(f"Page {page}: found {len(results)} products")
19        time.sleep(random.uniform(2, 5))  # Tạm dừng lịch sự
20    return asins
21asins = get_search_asins("wireless+earbuds", max_pages=2)
22print(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:

1import pandas as pd
2def scrape_product(asin):
3    """Scrape một trang chi tiết sản phẩm Amazon."""
4    url = f"https://www.amazon.com/dp/{asin}"
5    try:
6        resp = cfreq.get(url, headers=headers, impersonate="chrome124")
7        if resp.status_code != 200:
8            return None
9        soup = BeautifulSoup(resp.text, "lxml")
10        title_el = soup.select_one("span#productTitle")
11        price_el = (
12            soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
13            or soup.select_one("span.priceToPay .a-offscreen")
14            or soup.select_one(".apexPriceToPay .a-offscreen")
15        )
16        rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17        reviews_el = soup.select_one("span#acrCustomerReviewText")
18        avail_el = soup.select_one("div#availability span")
19        img_el = soup.select_one("#landingImage")
20        return {
21            "asin": asin,
22            "title": title_el.get_text(strip=True) if title_el else None,
23            "price": price_el.get_text(strip=True) if price_el else None,
24            "rating": rating_el.get_text(strip=True) if rating_el else None,
25            "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
26            "availability": avail_el.get_text(strip=True) if avail_el else None,
27            "image_url": img_el.get("src") if img_el else None,
28            "url": url,
29        }
30    except Exception as e:
31        print(f"Error scraping {asin}: {e}")
32        return None
33# Scrape tất cả ASIN đã thu thập
34products = []
35for i, asin in enumerate(asins):
36    print(f"Scraping {i+1}/{len(asins)}: {asin}")
37    product = scrape_product(asin)
38    if product:
39        products.append(product)
40    time.sleep(random.uniform(2, 5))  # Random delay giữa các request
41df = pd.DataFrame(products)
42print(f"\nScraped {len(df)} products successfully")
43print(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

1df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
2print("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à 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:

1import random
2USER_AGENTS = [
3    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.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/143.0.0.0 Safari/537.36",
5    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
6    "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",
7]
8def get_headers():
9    return {
10        "User-Agent": random.choice(USER_AGENTS),
11        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
12        "Accept-Language": "en-US,en;q=0.9",
13        "Accept-Encoding": "gzip, deflate, br",
14        "Referer": "https://www.google.com/",
15        "DNT": "1",
16        "Connection": "keep-alive",
17    }

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.

1from curl_cffi import requests as cfreq
2# Luân phiên cả target giả lập trình duyệt
3BROWSERS = ["chrome120", "chrome124", "chrome131"]
4response = cfreq.get(
5    url,
6    headers=get_headers(),
7    impersonate=random.choice(BROWSERS),
8)

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.

1PROXIES = [
2    "http://user:pass@proxy1.example.com:8080",
3    "http://user:pass@proxy2.example.com:8080",
4    "http://user:pass@proxy3.example.com:8080",
5]
6proxy = random.choice(PROXIES)
7response = cfreq.get(
8    url,
9    headers=get_headers(),
10    impersonate="chrome124",
11    proxies={"http": proxy, "https": proxy},
12)

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 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.

1import time
2import random
3def fetch_with_backoff(url, max_retries=3):
4    """Fetch một URL với exponential backoff khi lỗi."""
5    for attempt in range(max_retries):
6        response = cfreq.get(
7            url,
8            headers=get_headers(),
9            impersonate=random.choice(BROWSERS),
10        )
11        if response.status_code == 200:
12            return response
13        # Exponential backoff kèm jitter
14        wait = min(2 ** attempt + random.uniform(0, 1), 30)
15        print(f"Attempt {attempt+1} failed ({response.status_code}). Waiting {wait:.1f}s...")
16        time.sleep(wait)
17    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:

1from playwright.sync_api import sync_playwright
2def scrape_with_browser(url):
3    with sync_playwright() as p:
4        browser = p.chromium.launch(headless=True)
5        page = browser.new_page()
6        page.goto(url, wait_until="domcontentloaded")
7        page.wait_for_timeout(3000)  # Chờ JS render
8        html = page.content()
9        browser.close()
10        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 → 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 đó:

1import gspread
2from gspread_dataframe import set_with_dataframe
3gc = gspread.service_account()
4sh = gc.open("Amazon Scrape Data")
5worksheet = sh.sheet1
6set_with_dataframe(worksheet, df)
7print("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:

1import sqlite3
2conn = sqlite3.connect("amazon_products.db")
3df.to_sql("products", conn, if_exists="append", index=False)
4print(f"Stored {len(df)} products in SQLite")
5# Truy vấn sau:
6historical = pd.read_sql_query(
7    "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
8    conn,
9)

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, 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:

1crontab -e

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

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

Hoặc mỗi 6 giờ:

10 */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:

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

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:

1name: Amazon Scraper
2on:
3  schedule:
4    - cron: "0 6 * * *"  # Mỗi ngày lúc 6:00 UTC
5  workflow_dispatch:       # Chạy thủ công
6jobs:
7  scrape:
8    runs-on: ubuntu-latest
9    steps:
10      - uses: actions/checkout@v3
11      - name: Set up Python
12        uses: actions/setup-python@v4
13        with:
14          python-version: "3.11"
15      - name: Install dependencies
16        run: pip install -r requirements.txt
17      - name: Run scraper
18        run: python scraper.py
19      - name: Commit results
20        run: |
21          git config user.name 'GitHub Actions'
22          git config user.email 'actions@github.com'
23          git add data/
24          git diff --staged --quiet || git commit -m "Update scraped data"
25          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 . 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
  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 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 (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, (2024) và (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ề .

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, 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ề , , và . Bạn cũng có thể xem video hướng dẫn từng bước trên .

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 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 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ư 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 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

Mục lục

Thử Thunderbit

Trích xuất lead và dữ liệu khác chỉ trong 2 cú nhấp. Powered by AI.

Nhận Thunderbit Miễn phí
Trích xuất dữ liệu bằng AI
Dễ dàng chuyển dữ liệu sang Google Sheets, Airtable hoặc Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week