Thu thập dữ liệu Etsy bằng Python: Tìm kiếm, sản phẩm, shop & đánh giá

Cập nhật lần cuối vào April 28, 2026
Thu thập dữ liệu Etsy bằng Python: Tìm kiếm, sản phẩm, shop & đánh giá

Etsy có hơn 100 triệu danh sách đang hoạt động, 5,6 triệu người bán và khoảng 450 triệu lượt truy cập mỗi tháng. Đó là một kho dữ liệu công khai khổng lồ về giá cả, xu hướng, đánh giá và đối thủ — và nếu từng cố thu thập thủ công, bạn sẽ hiểu cảm giác “đau khổ” đó.

Có lần tôi đã dành cả một cuối tuần chỉ để tự tay lập danh mục sản phẩm của đối thủ cho một dự án nghiên cứu thị trường. Đến sản phẩm thứ 30, tôi bắt đầu nghi ngờ mọi quyết định cuộc đời đã dẫn mình đến bảng tính đó. Vấn đề là dữ liệu Etsy cực kỳ giá trị cho phân tích giá, phát triển sản phẩm, khám phá ngách và đối chiếu người bán — nhưng chỉ khi bạn thật sự lấy được dữ liệu ở quy mô lớn. Đó chính là nội dung của hướng dẫn này: một bài hướng dẫn duy nhất bao quát cách thu thập dữ liệu Etsy bằng Python trên cả bốn loại trang chính (kết quả tìm kiếm, trang sản phẩm, trang shop và đánh giá), kèm theo hướng dẫn thẳng thắn về cơ chế chống bot của Etsy và một lựa chọn không cần code cho những ai muốn bỏ qua phần viết script hoàn toàn.

Thu thập dữ liệu Etsy bằng Python nghĩa là gì?

Nói đơn giản, web scraping là việc viết code để truy cập các trang web và tự động trích xuất dữ liệu bạn quan tâm — tên sản phẩm, giá, mô tả, hình ảnh, điểm đánh giá, review, thông tin shop — rồi sắp xếp chúng vào định dạng có cấu trúc như bảng tính hoặc cơ sở dữ liệu.

Python là ngôn ngữ được ưu tiên cho kiểu công việc này. Nó thân thiện với người mới, có cộng đồng rất lớn và sở hữu hệ sinh thái thư viện cực kỳ mạnh cho scraping: Requests (để tải trang), BeautifulSoup (để phân tích HTML), SeleniumPlaywright (để tự động hóa trình duyệt), và pandas (để tổ chức và xuất dữ liệu). Python luôn nằm trong top 3 ngôn ngữ phổ biến nhất trong khảo sát nhà phát triển hằng năm của Stack Overflow, và các thư viện scraping của nó cũng thuộc nhóm được tải xuống nhiều nhất trên PyPI.

Khi thu thập dữ liệu Etsy, bạn đang lấy dữ liệu từ HTML (và đôi khi là JSON ẩn) mà Etsy trả về cho trình duyệt của bạn. Những loại dữ liệu bạn có thể trích xuất gồm:

  • Tên sản phẩm, giá, mô tả, hình ảnh và biến thể
  • Thông tin người bán/shop (tên, số lượt bán, địa điểm, đánh giá)
  • Điểm sao và toàn bộ nội dung review
  • Danh sách trong kết quả tìm kiếm, danh mục và tín hiệu xu hướng

Vì sao nên thu thập dữ liệu Etsy? Các trường hợp sử dụng thực tế tạo ROI

Thu thập dữ liệu Etsy không chỉ là một bài tập kỹ thuật — mà còn là lợi thế cạnh tranh. Dù bạn là người bán, quản lý sản phẩm hay nhà phân tích dữ liệu, việc có dữ liệu Etsy có cấu trúc ngay trong tầm tay có thể tác động trực tiếp đến lợi nhuận.

etsy_stats_4f1f4d51c3.png

Trường hợp sử dụngBạn thu thập gìAi được lợiTác động kinh doanh
Phân tích giá cạnh tranhKết quả tìm kiếm + giá sản phẩmVận hành TMĐT, người bánĐịnh giá động có thể tăng doanh thu trung bình 5–22%
Khám phá ngách & xu hướngKết quả tìm kiếm, danh sách đang hotNhà sáng lập, nhà phân tíchPhát hiện sớm ngách đang lên (ví dụ: “preppy pajamas” tăng trưởng tìm kiếm +1.112%)
Phát triển & cải tiến sản phẩmReview, chi tiết sản phẩmNhóm sản phẩmMột thương hiệu đồ bếp đã giành lại vị trí Best Seller số 1 chỉ sau 60 ngày nhờ dữ liệu cảm xúc từ review
SEO & nghiên cứu từ khóaKết quả tìm kiếm, tiêu đề/tag sản phẩmNhóm marketingXác định từ khóa có nhu cầu cao, cạnh tranh thấp
Đối chiếu người bánTrang shop, số lượt bánNhóm sales, nhà phân tíchTạo danh sách lead đủ chất lượng với giá 0,01–0,10 USD/bản ghi thay vì mua danh sách
Theo dõi tồn kho & hàng hóaTình trạng còn hàngVận hành TMĐTPhản ứng nhanh hơn trước biến động tồn kho của đối thủ

Mỗi trường hợp sử dụng này đều cần dữ liệu từ các loại trang Etsy khác nhau — và đó chính là lý do hướng dẫn này bao quát cả bốn loại.

Tiết kiệm thời gian: thủ công vs. tự động

  • Nghiên cứu Etsy thủ công: 30–45 phút cho mỗi sản phẩm (50–75 giờ cho 100 sản phẩm)
  • Thu thập tự động: 100 danh sách trong 2–5 phút
  • Thu thập bằng AI nhanh hơn 30–40% với độ chính xác lên tới 99,5%

Etsy API vs. web scraping: nên chọn cái nào?

Trước khi viết một dòng code nào, bạn nên tự hỏi: mình nên dùng API chính thức của Etsy hay thu thập trực tiếp từ website? Đây là câu hỏi tôi thấy xuất hiện liên tục trên các diễn đàn, và câu trả lời phụ thuộc vào dữ liệu bạn cần.

Etsy API làm được gì và không làm được gì

Etsy cung cấp API v3 với xác thực OAuth 2.0. API này dùng tốt để truy cập dữ liệu của chính shop bạn — danh sách sản phẩm, đơn hàng, biên nhận. Nhưng nó có những giới hạn thực sự:

  • Dữ liệu đối thủ: API chủ yếu chỉ giới hạn trong shop của bạn. Bạn không thể lấy giá, doanh số hay danh sách của người bán khác.
  • Đánh giá: Không có endpoint mạnh để lấy toàn bộ review theo lô lớn.
  • Giới hạn tốc độ: Mặc định là 10 yêu cầu/giây, 10.000 yêu cầu/ngày. Ngưỡng offset là 12.000 bản ghi.
  • Dùng cho AI/ML: Bị từ chối rõ ràng trong quá trình xét duyệt ứng dụng.
  • Tài liệu: Phàn nàn từ cộng đồng rất nhiều — ví dụ kém, endpoint lỗi thời, hỗ trợ chậm.

Khi web scraping là con đường tốt hơn

Nếu bạn cần dữ liệu tình báo đối thủ, cảm xúc từ review, phân tích chéo giữa nhiều shop, hoặc dữ liệu vượt ngoài phạm vi API, thì scraping là lựa chọn phù hợp. Đổi lại, bạn sẽ phải đối mặt với hệ thống chống bot của Etsy (sẽ nói kỹ hơn bên dưới) và cần đầu tư phần thiết lập.

Bảng so sánh: API vs. scraping vs. no-code

Tiêu chíAPI chính thức của EtsyPython Web ScrapingThunderbit (No-code)
Truy cập giá sản phẩm✅ (trường dữ liệu giới hạn)✅ HTML/JSON-LD đầy đủ✅ AI trích xuất mọi trường hiển thị
Dữ liệu review❌ Không có theo lô✅ Qua endpoint reviews/HTML✅ Scrape trang con
Dữ liệu shop đối thủ❌ Chỉ shop của bạn✅ Bất kỳ shop công khai nào✅ Bất kỳ shop công khai nào
Cần xác thực✅ OAuth 2.0⚠️ Cần cookies cho dữ liệu đã đăng nhập⚠️ Scrape trong trình duyệt cho phần đăng nhập
Rủi ro chống botKhông cóCAO (DataDome)Được xử lý (native trong trình duyệt)
Thời gian thiết lậpTrung bình (API key, OAuth)Cao (code + proxy)Khoảng 2 phút

Nếu bạn cần dữ liệu đối thủ, review hoặc phân tích đa shop, thì API đơn giản là không bao phủ được. Đó là bức tranh thực tế.

Chọn phương pháp scraping Python trước khi viết code

Một câu tôi thấy trên Reddit và Stack Overflow suốt: “Nên dùng Requests + BeautifulSoup, Selenium, proxy API hay thứ gì khác?” Câu trả lời đúng phụ thuộc vào trình độ, ngân sách và trường hợp sử dụng của bạn.

Cách tiếp cậnPhù hợp nhất vớiĐộ khó họcXử lý JS?Chống botChi phí
Requests + BeautifulSoupDev muốn toàn quyền kiểm soátTrung bìnhThủ công (header, proxy)Miễn phí + chi phí proxy
Selenium / PlaywrightTrang nặng JS, luồng đăng nhậpCaoMột phần (browser fingerprint)Miễn phí + chi phí proxy
Dịch vụ proxy APIQuy mô lớn + vượt chống botTrung bình✅ (qua API)✅ Tích hợp sẵnTừ 49 USD/tháng
Thunderbit (no-code)Người không biết code, cần trích xuất nhanhRất thấp✅ (native trong trình duyệt)✅ (phiên trình duyệt)Có gói miễn phí

Nếu bạn muốn toàn quyền kiểm soát và thoải mái với Python, hãy chọn Requests + BeautifulSoup. Nếu cần render JS hoặc luồng đăng nhập, dùng Selenium. Nếu cần vượt chống bot ở quy mô lớn, hãy cân nhắc dịch vụ proxy. Còn nếu muốn lấy dữ liệu Etsy mà không phải viết hay bảo trì code, Thunderbit rất đáng thử — sẽ nói thêm ở phần sau.

Etsy chống lại như thế nào: hiểu về DataDome

Phần lớn hướng dẫn scraping sẽ bảo bạn “chỉ cần dùng proxy” rồi thôi. Nhưng với Etsy, như vậy là chưa đủ. Etsy dùng DataDome, một trong những hệ thống chống bot mạnh tay nhất trên web. Case study của chính DataDome còn nêu Etsy như một câu chuyện thành công, cho biết scraper từng chiếm khoảng 1% chi phí tính toán của Etsy.

etsy_antibot_5431142c9c.png

DataDome là gì và hoạt động ra sao?

DataDome không chỉ kiểm tra địa chỉ IP của bạn. Nó chạy một hệ thống phát hiện nhiều lớp:

  • TLS fingerprinting (JA3): Thư viện requests của Python có dấu TLS đặc trưng mà DataDome có thể nhận ra ngay.
  • Kiểm tra header/giao thức HTTP: Xem các header trình duyệt có đầy đủ và nhất quán không — thiếu hoặc sắp xếp sai header là dấu hiệu đáng ngờ.
  • JavaScript fingerprinting (giao thức Picasso): Chạy thử thách JS trong trình duyệt để xác minh bạn là người dùng thật.
  • ML hành vi: Phân tích hơn 35 tín hiệu cho mỗi request, với hơn 85.000 mô hình riêng cho từng site.
  • Chấm điểm uy tín IP: IP từ datacenter bị gắn cờ ngay.
  • Xác minh cookie: Cookie datadome phải tồn tại và hợp lệ.

Dấu hiệu bạn đã bị chặn (và cách kiểm tra)

Một lỗi rất phổ biến: bạn nhận được phản hồi 200 OK, nhưng HTML thực ra là trang CAPTCHA chứ không phải dữ liệu bạn muốn. Các dấu hiệu khác:

  • Lỗi 403 Forbidden
  • Vòng lặp chuyển hướng
  • Nội dung phản hồi chứa đối tượng JavaScript dd hoặc HTML CAPTCHA dạng slider

Luôn kiểm tra phần thân phản hồi, không chỉ mã trạng thái. Một kiểm tra nhanh:

if "captcha" in resp.text.lower() or "datadome" in resp.text.lower():
    print("Bị chặn! Nhận được trang CAPTCHA thay vì dữ liệu.")

Header và cookie giúp giảm bị phát hiện

Bạn không thể đảm bảo 100% sẽ không bị chặn, nhưng header thực tế và quản lý cookie đúng cách sẽ giúp rất nhiều:

session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/133.0.0.0 Safari/537.36",
    "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",
    "Sec-Ch-Ua": '"Chromium";v="133", "Not-A.Brand";v="99", "Google Chrome";v="133"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Upgrade-Insecure-Requests": "1",
})

Ngoài ra còn rất quan trọng:

  • Lưu cookie xuyên suốt các request bằng requests.Session().
  • Thêm độ trễ ngẫu nhiên (2–7 giây) giữa các request.
  • Mô phỏng chuỗi referrer: vào homepage trước, rồi tìm kiếm, rồi đến trang sản phẩm.
  • Ở quy mô lớn, xoay vòng proxy residential là bắt buộc. IP datacenter bị gắn cờ gần như ngay lập tức.

Những kỹ thuật này giúp giảm khả năng bị phát hiện nhưng không loại bỏ hoàn toàn. Với scraping khối lượng lớn, bạn nhiều khả năng sẽ cần dịch vụ proxy hoặc cách tiếp cận dựa trên trình duyệt.

Thiết lập môi trường Python để thu thập dữ liệu Etsy

Trước khi bắt đầu:

  • Độ khó: Trung bình
  • Thời gian cần thiết: Khoảng 30–60 phút (thiết lập + lần scrape đầu tiên)
  • Bạn cần: Python 3.8+, pip, trình soạn thảo code, trình duyệt Chrome (để kiểm tra DevTools)

Cài đặt phụ thuộc

Tạo thư mục dự án, thiết lập môi trường ảo và cài các thư viện cần dùng:

mkdir etsy-scraper && cd etsy-scraper
python -m venv venv
source venv/bin/activate  # Trên Windows: venv\Scripts\activate

pip install requests beautifulsoup4 lxml pandas
  • requests — tải trang web
  • beautifulsoup4 — phân tích HTML
  • lxml — trình phân tích HTML nhanh hơn (không bắt buộc nhưng nên dùng)
  • pandas — tổ chức và xuất dữ liệu sang CSV/Excel

Nếu sau này cần tự động hóa trình duyệt (đăng nhập hoặc trang nhiều JS), hãy cài thêm:

pip install selenium

Hiểu cấu trúc trang Etsy trước khi viết code

Một mẹo giúp tiết kiệm rất nhiều thời gian: Etsy nhúng dữ liệu sản phẩm có cấu trúc bên trong các thẻ <script type="application/ld+json"> trên hầu hết các trang. Dữ liệu JSON-LD này đã được tổ chức sẵn — tên sản phẩm, giá, đánh giá, hình ảnh — nên bạn không phải vật lộn với các CSS selector dễ vỡ cho từng trường.

Mở bất kỳ trang sản phẩm Etsy nào, nhấp chuột phải, chọn “View Page Source”, rồi tìm application/ld+json. Bạn sẽ thấy một khối có @type: Product chứa phần lớn dữ liệu cần lấy. Trang kết quả tìm kiếm có @type: ItemList.

CSS selector vẫn hữu ích như phương án dự phòng (cho dữ liệu không nằm trong JSON-LD như thông tin vận chuyển hoặc nội dung review), nhưng JSON-LD nên là điểm bắt đầu đầu tiên.

Bước 1: Thu thập kết quả tìm kiếm Etsy bằng Python

Kết quả tìm kiếm là điểm khởi đầu của hầu hết dự án scraping Etsy — dù bạn đang theo dõi một ngách, theo dõi giá đối thủ hay xây dựng cơ sở dữ liệu sản phẩm.

Tạo URL tìm kiếm

URL tìm kiếm của Etsy có dạng:

https://www.etsy.com/search?q={keyword}&ref=pagination&page={page_number}

Với truy vấn nhiều từ, hãy mã hóa khoảng trắng trong URL (ví dụ: handmade+jewelry hoặc handmade%20jewelry). Tham số ref=pagination khiến request trông giống hơn một lần điều hướng thật từ trình duyệt.

Các tham số hữu ích khác: order (most_relevant, price_asc, price_desc, date_desc), min_price, max_price, ship_to, free_shipping=true. Mỗi trang trả về 48 mục.

Gửi request và phân tích HTML

import requests
from bs4 import BeautifulSoup
import json
import time
import random

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}

def scrape_etsy_search(query, max_pages=3):
    all_products = []
    for page in range(1, max_pages + 1):
        url = f"https://www.etsy.com/search?q={query}&ref=pagination&page={page}"
        resp = requests.get(url, headers=headers, timeout=30)
        if "captcha" in resp.text.lower():
            print(f"Bị chặn ở trang {page}. Hãy thử thêm độ trễ hoặc proxy.")
            break
        soup = BeautifulSoup(resp.text, "lxml")
        for script in soup.find_all("script", type="application/ld+json"):
            data = json.loads(script.string)
            if data.get("@type") == "ItemList":
                for item in data.get("itemListElement", []):
                    all_products.append({
                        "name": item.get("name"),
                        "url": item.get("url"),
                        "image": item.get("image"),
                        "price": item.get("offers", {}).get("price"),
                        "currency": item.get("offers", {}).get("priceCurrency"),
                        "position": item.get("position"),
                    })
        time.sleep(random.uniform(2, 5))
    return all_products

Trích xuất dữ liệu listing từ JSON-LD

Mảng itemListElement cho bạn tên, URL, hình ảnh, giá và đơn vị tiền tệ của từng listing. Nếu bạn cũng cần điểm sao hoặc số lượng kết quả (không phải lúc nào cũng có trong JSON-LD), hãy chuyển sang CSS selector:

  • Thẻ listing: .v2-listing-card
  • Tiêu đề: h3.v2-listing-card__title
  • Giá: span.currency-value
  • Link: a.listing-link (href)

Xử lý phân trang

Lặp qua các trang và thêm độ trễ ngẫu nhiên giữa mỗi request. Etsy thường trả về tối đa 20–250 trang tùy theo truy vấn.

results = scrape_etsy_search("handmade+jewelry", max_pages=5)
print(f"Đã thu thập {len(results)} sản phẩm.")

Với một lần scrape 5 trang, thử nghiệm của tôi mất khoảng 20 giây — so với hơn 30 phút copy-paste thủ công.

Bước 2: Thu thập trang sản phẩm Etsy bằng Python

Khi đã có danh sách URL sản phẩm từ tìm kiếm, bước tiếp theo là lấy dữ liệu chi tiết từ từng trang listing.

Tải trang sản phẩm

def scrape_etsy_product(url):
    resp = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(resp.text, "lxml")
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "Product":
            offers = data.get("offers", {})
            price = offers.get("price") or offers.get("lowPrice")
            rating_data = data.get("aggregateRating", {})
            return {
                "name": data.get("name"),
                "description": data.get("description", "")[:500],
                "brand": data.get("brand", {}).get("name") if isinstance(data.get("brand"), dict) else data.get("brand"),
                "category": data.get("category"),
                "price": price,
                "currency": offers.get("priceCurrency"),
                "availability": offers.get("availability"),
                "rating": rating_data.get("ratingValue"),
                "review_count": rating_data.get("reviewCount"),
                "images": data.get("image", []),
                "sku": data.get("sku"),
                "material": data.get("material"),
            }
    return None

Xử lý biến thể giá

Một số sản phẩm chỉ có offers.price. Sản phẩm khác (có biến thể như size hoặc màu) dùng offers.lowPriceoffers.highPrice. Đoạn code trên xử lý cả hai bằng cách ưu tiên price, nếu không có thì lấy lowPrice.

Phân tích thêm trường dữ liệu bằng CSS selector

Với dữ liệu không nằm trong JSON-LD — như thông tin vận chuyển, tùy chọn biến thể, chi tiết người bán đầy đủ — bạn sẽ cần CSS selector:

  • Tiêu đề: h1[data-buy-box-listing-title]
  • Biến thể: select[data-selector-id] hoặc div[data-option-set]
  • Vận chuyển: div.wt-text-caption gần khu vực shipping

Đổi lại, JSON-LD sạch hơn và ổn định hơn trước thay đổi giao diện. CSS selector thì dễ vỡ hơn nhưng bao phủ được nhiều trường hơn.

Bước 3: Thu thập trang shop Etsy bằng Python

Đây là phần mà hầu hết hướng dẫn đối thủ bỏ qua hoàn toàn — và cũng có thể là phần giá trị nhất đối với đội sales và nhà phân tích cạnh tranh.

Tạo URL shop và tải trang

def scrape_etsy_shop(shop_name):
    url = f"https://www.etsy.com/shop/{shop_name}"
    resp = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(resp.text, "lxml")

    # Siêu dữ liệu shop từ HTML (không nằm trong JSON-LD)
    sales_el = soup.select_one("div.shop-sales-reviews a")
    rating_el = soup.find("input", {"name": "initial-rating"})
    location_el = soup.select_one("div.shop-location")

    shop_data = {
        "name": shop_name,
        "sales": sales_el.text.strip() if sales_el else None,
        "rating": rating_el["value"] if rating_el else None,
        "location": location_el.text.strip() if location_el else None,
    }

    # Danh sách sản phẩm từ JSON-LD
    listings = []
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "ItemList":
            for item in data.get("itemListElement", []):
                listings.append({
                    "name": item.get("name"),
                    "url": item.get("url"),
                    "price": item.get("offers", {}).get("price"),
                })
    shop_data["listings"] = listings
    return shop_data

Bạn có thể trích xuất gì từ trang shop?

JSON-LD trên trang shop là @type: ItemList — nó bao phủ danh sách sản phẩm, nhưng không bao phủ siêu dữ liệu cấp shop như số lượt bán, địa điểm hay đánh giá. Với những trường đó, bạn cần CSS selector:

Điểm dữ liệuSelectorGhi chú
Tên shoph1 hoặc meta titleThường nằm trong tiêu đề trang
Tổng lượt bándiv.shop-sales-reviews aVăn bản như "12,345 sales"
Đánh giá saogiá trị của input[name="initial-rating"]Số từ 1–5
Địa điểmdiv.shop-locationThành phố, quốc gia
Thành viên từ khi nàodiv.shop-infoDạng ngày tháng

Dữ liệu shop đặc biệt hữu ích để xây dựng danh sách lead, đối chiếu đối thủ hoặc xác định người bán hàng đầu trong một ngách.

Bước 4: Thu thập đánh giá Etsy bằng Python

Review là một trong những dữ liệu giá trị nhất — và cũng rắc rối nhất — trên Etsy. Toàn bộ nội dung review, điểm sao và ngày tháng không nằm trong HTML ban đầu của trang; chúng được tải qua một endpoint API nội bộ.

Cách 1: Tìm endpoint API review nội bộ của Etsy

Mở một trang sản phẩm trong Chrome, mở DevTools (F12), vào tab Network và cuộn xuống phần review. Bạn sẽ thấy một request POST tới một địa chỉ kiểu như:

https://www.etsy.com/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews

Endpoint này trả về các đoạn HTML chứa thẻ review. Để dùng được, bạn cần:

  • listing_id — ID số từ URL sản phẩm
  • shop_id — trích từ HTML của trang sản phẩm bằng regex
  • csrf_nonce — trích từ thẻ <meta> trên trang

Trích xuất ID và CSRF token

import re

def get_review_params(product_url):
    resp = requests.get(product_url, headers=headers)
    html = resp.text
    listing_id = product_url.split("/")[-1].split("?")[0]
    shop_id_match = re.search(r'"shopId"\s*:\s*(\d+)', html)
    shop_id = shop_id_match.group(1) if shop_id_match else None
    soup = BeautifulSoup(html, "lxml")
    csrf_meta = soup.find("meta", {"name": "csrf_nonce"})
    csrf = csrf_meta["content"] if csrf_meta else None
    return listing_id, shop_id, csrf

Thu thập review có phân trang

def scrape_reviews(listing_id, shop_id, csrf, max_pages=5):
    session = requests.Session()
    session.headers.update(headers)
    all_reviews = []
    for page in range(1, max_pages + 1):
        payload = {
            "specs": {
                "deep_dive_reviews": {
                    "module_path": "neu/specs/deep_dive_reviews",
                    "listing_id": listing_id,
                    "shop_id": shop_id,
                    "page": page,
                }
            }
        }
        resp = session.post(
            "https://www.etsy.com/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews",
            json=payload,
            headers={"x-csrf-token": csrf, "Content-Type": "application/json"},
        )
        data = resp.json()
        html_fragment = data.get("output", {}).get("deep_dive_reviews", "")
        review_soup = BeautifulSoup(html_fragment, "lxml")
        for card in review_soup.select("div.review-card"):
            rating_el = card.find("input", {"name": "rating"})
            text_el = card.select_one("div.wt-text-body")
            user_el = card.select_one("a[data-review-username]")
            date_el = card.select_one("p.wt-text-body-small")
            all_reviews.append({
                "rating": rating_el["value"] if rating_el else None,
                "text": text_el.text.strip() if text_el else None,
                "reviewer": user_el.text.strip() if user_el else None,
                "date": date_el.text.strip() if date_el else None,
            })
        time.sleep(random.uniform(2, 5))
    return all_reviews

Cách 2: Phân tích review trực tiếp từ HTML (phương án dự phòng)

Nếu cách dùng API không thành công (ví dụ do lỗi CSRF token), bạn có thể phân tích trang review đầu tiên ngay từ HTML của trang sản phẩm. Hạn chế là: chỉ lô review ban đầu mới có trong HTML tĩnh. Muốn lấy thêm, bạn cần API hoặc công cụ tự động hóa trình duyệt như Selenium.

Xử lý dữ liệu yêu cầu đăng nhập: thu thập shop Etsy của chính bạn

Đây là một khoảng trống mà không hướng dẫn nào khác đề cập, nhưng lại là nhu cầu rất thực tế — đặc biệt với người bán Etsy muốn trích xuất đơn hàng, doanh thu và số liệu của chính mình.

Vấn đề là: chỉ dùng requests thì không thể truy cập dashboard Etsy vì nó không mang theo cookie phiên đăng nhập.

Tùy chọn 1: Selenium với đăng nhập thủ công và lấy cookie

Dùng Selenium để mở trình duyệt, đăng nhập thủ công (hoặc tự động hóa đăng nhập), rồi tiếp tục scraping khi đã xác thực:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.etsy.com/signin")
# Đăng nhập thủ công trong cửa sổ trình duyệt, rồi:
input("Nhấn Enter sau khi đã đăng nhập...")

cookies = driver.get_cookies()
# Sau đó dùng driver.get() để đi tới các trang dashboard và thu thập dữ liệu

Bạn cũng có thể lưu cookie từ phiên Selenium và dùng lại với requests.Session() để scraping nhanh và nhẹ hơn sau lần đăng nhập đầu tiên.

Tùy chọn 2: Xuất cookie trình duyệt để dùng với Requests

Dùng một tiện ích mở rộng trình duyệt (như “EditThisCookie”) để xuất cookie phiên Etsy đang hoạt động, rồi nạp chúng vào session Requests:

import requests

session = requests.Session()
# Thêm cookie đã xuất từ trình duyệt của bạn
session.cookies.set("uaid", "YOUR_UAID_VALUE", domain=".etsy.com")
session.cookies.set("user_prefs", "YOUR_USER_PREFS_VALUE", domain=".etsy.com")
# ... thêm các cookie phiên khác nếu cần

resp = session.get("https://www.etsy.com/your/orders", headers=headers)

Cách dễ nhất: chế độ scraping bằng trình duyệt của Thunderbit

Thunderbit chạy ngay trong trình duyệt Chrome của bạn, nó tự động kế thừa phiên Etsy đang hoạt động. Không cần code xác thực, không cần xuất cookie — chỉ cần mở dashboard Etsy và scrape. Đây thực sự là một cách rất hữu ích để trích xuất đơn hàng, doanh thu, số liệu và các dữ liệu chỉ dành cho người bán mà không cần viết script.

Thu thập dữ liệu Etsy Dashboard của bạn bằng AI

Xuất và sử dụng dữ liệu Etsy đã thu thập

Lưu sang CSV hoặc JSON

import pandas as pd

df = pd.DataFrame(results)
df.to_csv("etsy_products.csv", index=False, encoding="utf-8")
df.to_json("etsy_products.json", orient="records", indent=2)

Thực hành tốt nhất: thêm dấu thời gian vào tên tệp, dùng mã hóa UTF-8 và xử lý ký tự đặc biệt trong tên sản phẩm (người bán Etsy rất thích emoji và ký tự có dấu).

Xuất sang Google Sheets, Airtable hoặc Notion

Với người dùng Python, các thư viện như gspread (Google Sheets) hoặc Airtable API cho phép đẩy dữ liệu bằng code. Nhưng nếu bạn dùng Thunderbit, mọi thao tác xuất — sang Google Sheets, Excel, Airtable và Notion — đều miễn phí và chỉ cần một cú nhấp. Không cần API key, không cần thiết lập OAuth.

Bỏ qua code: cách thu thập dữ liệu Etsy bằng Thunderbit (giải pháp no-code)

Không phải ai cũng muốn viết Python script, bảo trì cấu hình proxy, hay gỡ lỗi CSS selector lúc 2 giờ sáng. Nếu đó là bạn, đây là cách lấy dữ liệu Etsy với Thunderbit.

Cài đặt tiện ích Chrome của Thunderbit

Truy cập Chrome Web Store và cài Thunderbit. Tạo tài khoản miễn phí — gói miễn phí cho bạn 6 trang/tháng và mọi lần xuất đều miễn phí.

Dùng AI Suggest Fields trên bất kỳ trang Etsy nào

Mở trang tìm kiếm, sản phẩm hoặc shop của Etsy. Nhấp “AI Suggest Fields” ở thanh bên Thunderbit. AI sẽ quét trang và đề xuất các cột — tên sản phẩm, giá, đánh giá, hình ảnh, tên shop, tag, thông tin vận chuyển. Bạn có thể điều chỉnh hoặc thêm cột theo ý muốn.

Nhấp Scrape và xuất dữ liệu

Nhấp “Scrape” để trích xuất dữ liệu từ trang hiện tại. Với kết quả nhiều trang, dùng tính năng scrape phân trang của Thunderbit. Nếu muốn bổ sung chi tiết từ từng URL sản phẩm trong danh sách (mô tả, review, vận chuyển), hãy dùng scrape trang con — Thunderbit sẽ tự truy cập từng link và kéo dữ liệu bổ sung.

Xuất sang Excel, Google Sheets, Airtable hoặc Notion — tất cả miễn phí.

Khi Thunderbit tốt hơn Python cho scraping Etsy

  • Không cần thiết lập proxy hay code chống bot. Thunderbit chạy trong chính trình duyệt Chrome thật của bạn, nên kế thừa phiên đăng nhập và trông như một người dùng bình thường đối với DataDome.
  • AI tự thích ứng với thay đổi bố cục. Không còn selector bị gãy mỗi khi Etsy cập nhật frontend.
  • Rất hợp cho nghiên cứu một lần, phân tích cạnh tranh hoặc thành viên không chuyên kỹ thuật. Nếu bạn chỉ cần một bộ dữ liệu nhanh, bạn không cần môi trường Python.
  • Scrape trang con cho phép bổ sung dữ liệu chi tiết cho danh sách URL sản phẩm mà không phải viết vòng lặp lồng nhau.

Để xem hướng dẫn từng bước, hãy xem kênh YouTube của Thunderbit.

So sánh chi phí 6 tháng: Python vs. Thunderbit

Yếu tốPython tự làmThunderbit
Thời gian thiết lập8–20 giờDưới 5 phút
Chi phí 6 tháng (gồm công sức, proxy)2.720–9.450 USD90–228 USD
Bảo trì hằng tháng4–10+ giờ (selector đổi = 80%+ chi phí phát sinh)0–1 giờ
Xử lý chống botProxy residential với chi phí tín dụng cao gấp 85 lầnDựa trên trình duyệt, tự vượt DataDome
Chất lượng dữ liệuCao (nếu đầu tư công sức)Cao (dựa trên AI)

Tôi không nói Python là lựa chọn sai — nếu bạn cần toàn quyền kiểm soát, logic tùy chỉnh hoặc tích hợp vào pipeline lớn hơn, code vẫn là vua. Nhưng với phần lớn người dùng doanh nghiệp chỉ cần dữ liệu Etsy, bài toán ROI thường nghiêng về công cụ no-code.

Mẹo pháp lý và đạo đức khi thu thập dữ liệu Etsy

Tôi được hỏi về tính hợp pháp ở mọi bài viết về scraping, nên đây là bản tóm tắt ngắn:

  • Điều khoản sử dụng của Etsy cấm truy cập tự động một cách rõ ràng. Dù vậy, Etsy chủ yếu dựa vào thực thi kỹ thuật (DataDome) thay vì kiện tụng — hiện chưa có vụ kiện nào được biết đến nhắm riêng vào scraper của Etsy.
  • Chỉ thu thập dữ liệu công khai. Đừng vượt qua xác thực hoặc truy cập dashboard riêng tư của người bán không thuộc về bạn.
  • Dùng tốc độ request hợp lý. Chèn độ trễ 2–7 giây giữa các request và đừng bắn dồn dập vào server của Etsy.
  • Tôn trọng robots.txt. Etsy cho phép các trang tìm kiếm nhưng hạn chế một số đường dẫn.
  • Xử lý dữ liệu cá nhân có trách nhiệm theo các luật về quyền riêng tư như GDPR.
  • Tham khảo tư vấn pháp lý nếu bạn làm scraping ở quy mô thương mại lớn.

Để biết thêm bối cảnh, xem bài viết của chúng tôi về hệ quả pháp lý của web scraping — bao gồm Meta v. Bright Data (2024), nơi việc scraping dữ liệu công khai được tòa chấp nhận.

Kết luận: những điểm chính cần nhớ

Chúng ta đã đi qua khá nhiều nội dung. Đây là những điều tôi muốn bạn mang theo:

  • Dữ liệu có cấu trúc JSON-LD của Etsy giúp trích xuất sạch hơn nhiều so với phân tích HTML thô ở hầu hết các trường.
  • DataDome là một rào cản thực sự — hãy dùng header đúng, độ trễ, quản lý cookie và proxy residential khi scraping Python ở quy mô lớn.
  • API của Etsy khá hạn chế. Nếu bạn cần review, shop đối thủ hoặc phân tích chéo giữa nhiều người bán, scraping là con đường thực tế hơn.
  • Thunderbit cung cấp lựa chọn no-code xử lý chống bot và xác thực ngay từ gốc — rất đáng thử nếu bạn muốn có dữ liệu Etsy mà không phải bảo trì script.
  • Luôn thu thập dữ liệu có trách nhiệm và tôn trọng điều khoản của Etsy.

Nếu bạn muốn bắt đầu mà không phải viết code, hãy thử Thunderbit miễn phí. Hoặc dùng đoạn code Python trong bài này để xây dựng scraper riêng của bạn — và cầu cho selector của bạn không bao giờ hỏng vào một chiều thứ Sáu.

Để xem thêm các hướng dẫn scraping, hãy xem hướng dẫn Etsy scraper và bài tổng hợp best AI web scrapers.

Thử Thunderbit để thu thập dữ liệu Etsy nhanh hơn Get Started Free

Câu hỏi thường gặp

1. Có hợp pháp khi dùng Python để thu thập dữ liệu Etsy không?

Việc thu thập dữ liệu công khai nhìn chung được phép theo các tiền lệ pháp lý gần đây (ví dụ: Meta v. Bright Data, hiQ v. LinkedIn). Tuy nhiên, Điều khoản sử dụng của Etsy cấm truy cập tự động, vì vậy hãy luôn xem kỹ ToS và robots.txt trước khi scrape. Với mục đích thương mại hoặc quy mô lớn, hãy hỏi ý kiến luật sư.

2. Tôi có thể thu thập dữ liệu Etsy mà không bị chặn không?

Etsy dùng DataDome, một trong những hệ thống chống bot khó nhằn nhất hiện nay. Header thực tế, độ trễ request, duy trì cookie và xoay vòng proxy residential đều giúp giảm nguy cơ bị chặn. Cách tiếp cận chạy ngay trên trình duyệt của Thunderbit tránh được phần lớn phát hiện vì nó hoạt động trong phiên Chrome thật của bạn.

3. Etsy có API để dùng thay cho scraping không?

Có — Etsy cung cấp API v3, nhưng chủ yếu chỉ giới hạn dữ liệu của shop bạn và thiếu khả năng truy cập review mạnh mẽ. Phần lớn nhu cầu tình báo cạnh tranh và phân tích chéo giữa nhiều shop đều cần scraping.

4. Tôi cần những thư viện Python nào để thu thập dữ liệu Etsy?

Tối thiểu: requests, beautifulsoup4, pandas (để xuất dữ liệu) và json (có sẵn). Với trang nhiều JS hoặc cần đăng nhập, thêm selenium. Để phân tích HTML nhanh hơn, dùng lxml.

5. Làm sao để thu thập riêng review Etsy?

Review Etsy được tải qua một endpoint API nội bộ (/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews). Bạn cần trích xuất listing ID, shop ID và CSRF token từ trang sản phẩm, rồi POST tới endpoint đó kèm phân trang. Nếu cần, bạn cũng có thể phân tích lô review đầu tiên ngay từ HTML của trang sản phẩm — cả hai cách đều được hướng dẫn từng bước trong bài 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

Cào một trang web chỉ bằng cách hỏi

Nói bạn cần gì bằng tiếng Anh đơn giản. Hoặc tốt hơn, không cần nói gì cả.

Dùng Thunderbit ngay 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