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), Selenium và Playwright (để 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.

| Trường hợp sử dụng | Bạn thu thập gì | Ai được lợi | Tác động kinh doanh |
|---|---|---|---|
| Phân tích giá cạnh tranh | Kết quả tìm kiếm + giá sản phẩm | Vậ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ướng | Kết quả tìm kiếm, danh sách đang hot | Nhà sáng lập, nhà phân tích | Phá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ẩm | Review, chi tiết sản phẩm | Nhóm sản phẩm | Mộ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óa | Kết quả tìm kiếm, tiêu đề/tag sản phẩm | Nhóm marketing | Xác định từ khóa có nhu cầu cao, cạnh tranh thấp |
| Đối chiếu người bán | Trang shop, số lượt bán | Nhóm sales, nhà phân tích | Tạ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óa | Tình trạng còn hàng | Vận hành TMĐT | Phả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 Etsy | Python Web Scraping | Thunderbit (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 bot | Không có | CAO (DataDome) | Được xử lý (native trong trình duyệt) |
| Thời gian thiết lập | Trung 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ận | Phù hợp nhất với | Độ khó học | Xử lý JS? | Chống bot | Chi phí |
|---|---|---|---|---|---|
| Requests + BeautifulSoup | Dev muốn toàn quyền kiểm soát | Trung bình | ❌ | Thủ công (header, proxy) | Miễn phí + chi phí proxy |
| Selenium / Playwright | Trang nặng JS, luồng đăng nhập | Cao | ✅ | Một phần (browser fingerprint) | Miễn phí + chi phí proxy |
| Dịch vụ proxy API | Quy mô lớn + vượt chống bot | Trung bình | ✅ (qua API) | ✅ Tích hợp sẵn | Từ 49 USD/tháng |
| Thunderbit (no-code) | Người không biết code, cần trích xuất nhanh | Rấ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.

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
requestscủ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
datadomephả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
ddhoặ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.lowPrice và offers.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ặcdiv[data-option-set] - Vận chuyển:
div.wt-text-captiongầ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ệu | Selector | Ghi chú |
|---|---|---|
| Tên shop | h1 hoặc meta title | Thường nằm trong tiêu đề trang |
| Tổng lượt bán | div.shop-sales-reviews a | Văn bản như "12,345 sales" |
| Đánh giá sao | giá trị của input[name="initial-rating"] | Số từ 1–5 |
| Địa điểm | div.shop-location | Thành phố, quốc gia |
| Thành viên từ khi nào | div.shop-info | Dạ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
Vì 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àm | Thunderbit |
|---|---|---|
| Thời gian thiết lập | 8–20 giờ | Dưới 5 phút |
| Chi phí 6 tháng (gồm công sức, proxy) | 2.720–9.450 USD | 90–228 USD |
| Bảo trì hằng tháng | 4–10+ giờ (selector đổi = 80%+ chi phí phát sinh) | 0–1 giờ |
| Xử lý chống bot | Proxy residential với chi phí tín dụng cao gấp 85 lần | Dựa trên trình duyệt, tự vượt DataDome |
| Chất lượng dữ liệu | Cao (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
- Cách dùng Etsy scraper để tăng hiệu quả chiến lược bán hàng
- Cách thu thập sản phẩm từ các website thương mại điện tử một cách dễ dàng
- Cách viết web scraper với Python: từ đầu đến cuối
- Cách thu thập dữ liệu từ website bằng Python hiệu quả
- Cách thu thập dữ liệu bằng Python: hướng dẫn cho người mới bắt đầu


