Tự động theo dõi giá sản phẩm trên Tiki.vn bằng API là một phương pháp mới và linh hoạt nhất trong việc phân tích thị trường trong môi trường E-commerce 2025, việc theo dõi giá đối thủ không chỉ là một lợi thế cạnh tranh—đó là một cuộc chiến công nghệ. Các phương pháp scraping (cào dữ liệu) lỗi thời dựa trên phân tích HTML đã không còn hiệu quả trước các biện pháp chống bot ngày càng tinh vi.
Bài viết này sẽ không đưa bạn một con cá. Nó sẽ dạy bạn cách câu cá.
Chúng ta sẽ tập trung vào phương pháp duy nhất được khuyên dùng cho các sàn TMĐT lớn: Phân tích API ẩn. Bạn sẽ học cách xây dựng một hệ thống theo dõi giá chuyên nghiệp, có khả năng tự thích ứng và vượt qua các thử thách thực tế, từ việc lấy token xác thực động cho đến việc tự động bóc tách ID sản phẩm.
Trong bài viết này, chúng ta sẽ sử dụng trang web Tiki.vn làm ví dụ thực tế để minh họa các kỹ thuật, nhưng bạn hoàn toàn có thể áp dụng tư duy tương tự cho bất kỳ sàn TMĐT nào khác như Shopee hay Amazon.
Tóm tắt nhanh: Những gì bạn sẽ học được
Phân tích & tìm kiếm API ẩn của các trang thương mại điện tử hiện đại.
Xây dựng script Python hoàn chỉnh để tự động lấy giá, tồn kho, và nhiều dữ liệu khác.
Lấy guest-token xác thực tự động để vượt qua các biện pháp bảo vệ cơ bản.
Lưu trữ dữ liệu giá theo thời gian vào file CSV để phục vụ việc phân tích.
Tự động hóa toàn bộ quá trình bằng cách lập lịch chạy cho script.
Thách thức khi theo dõi giá đối thủ & tại sao API là giải pháp
Thử thách cốt lõi của việc scraping các trang web hiện đại là hầu hết thông tin quan trọng (như giá cả, số lượng tồn kho) không hiển thị trong mã HTML ban đầu. Thay vào đó, họ dùng JavaScript để tải động các dữ liệu này sau khi trang web đã được hiển thị trên trình duyệt của bạn.
Phương pháp HTML (lỗi thời): Cố gắng “đọc” giao diện sau khi nó đã hiển thị. Cách này cực kỳ không ổn định vì giao diện (HTML selectors) thay đổi liên tục theo tuần, thậm chí theo ngày.
Phương pháp API (hiện đại & bền vững): Tìm ra kênh giao tiếp (API) mà chính trang web dùng để lấy dữ liệu. Chúng ta sẽ “giả dạng” thành ứng dụng của họ để yêu cầu dữ liệu trực tiếp. Cách này hiệu quả, nhanh và ổn định hơn gấp nhiều lần vì cấu trúc API ít khi thay đổi.
Trong bài viết này, chúng ta sẽ tập trung 100% vào phương pháp API.
Trước khi viết code, chúng ta cần chuẩn bị môi trường làm việc.
Cài đặt các thư viện cần thiết
Python mạnh mẽ nhờ vào hệ sinh thái thư viện mã nguồn mở. Bạn chỉ cần mở Terminal (macOS/Linux) hoặc Command Prompt (Windows) và chạy lệnh sau để cài đặt các thư viện cần thiết:
pandas: “Cuốn sổ kế toán” để ghi lại dữ liệu một cách khoa học.
apscheduler: “Người thư ký” cần mẫn để tự động hóa công việc theo lịch.
python-dotenv: “Chiếc két sắt” để bảo mật các thông tin nhạy cảm.
Mẹo chuyên nghiệp: Bảo mật thông tin Proxy
Việc viết thẳng thông tin proxy (username, password) vào code là một rủi ro bảo mật nghiêm trọng, đặc biệt khi bạn chia sẻ code hoặc lưu trữ trên Git. Chúng ta sẽ dùng biến môi trường để bảo mật thông tin này.
Tạo một file mới trong cùng thư mục với script, đặt tên chính xác là .env
Trong file .env, thêm thông tin proxy của bạn theo định dạng sau:
Đây là kỹ năng quan trọng nhất bạn cần trang bị. Đừng bao giờ tin vào một URL API có sẵn trong bài hướng dẫn, vì chúng có thể thay đổi bất cứ lúc nào. Bạn phải tự mình tìm ra nó.
Mở trang sản phẩm bạn muốn theo dõi trên trình duyệt.
Nhấn F12 (hoặc click chuột phải -> Inspect) để mở Developer Tools.
Chuyển sang tab Network (Mạng).
Chọn bộ lọc Fetch/XHR. Đây là nơi các yêu cầu API thường xuất hiện.
Tải lại trang (F5). Bạn sẽ thấy một danh sách các yêu cầu xuất hiện.
Dò tìm trong danh sách, click vào các yêu cầu có tên hoặc đường dẫn khả nghi (thường chứa api, product, v2, v3…). Xem tab Preview hoặc Response để tìm yêu cầu nào chứa dữ liệu bạn cần (tên sản phẩm, giá, sku…).
Sử dụng tab Preview trong công cụ Developer Tools để xem trước dữ liệu JSON và xác nhận đã tìm đúng API chứa thông tin sản phẩm trên Tiki.
Khi đã tìm thấy, hãy chuyển sang tab Headers và ghi lại những thông tin quan trọng:
Request URL: Đây là API endpoint (ví dụ: .../api/v2/products/...&version=3).
Request Headers: Các “giấy tờ tùy thân” bạn cần để giả mạo yêu cầu, đặc biệt là User-Agent, Referer, và các header xác thực như x-guest-token.
Kiểm tra tab Headers trong công cụ Developer Tools để tìm User-Agent và X-Guest-Token khi phân tích API của Tiki.
Ghi chú chuyên sâu: Phân biệt API công khai và API cho đối tác
Khi tìm kiếm, bạn có thể thấy các tài liệu về API chính thức của Tiki (hoặc các sàn TMĐT khác). Cần lưu ý rằng đó thường là API dành cho đối tác/nhà bán hàng, yêu cầu một mã khóa xác thực riêng và phục vụ mục đích quản lý sản phẩm. Phương pháp của chúng ta tập trung vào việc tìm kiếm API công khai (public-facing) – là API mà chính website dùng để hiển thị dữ liệu cho bạn xem. API này thường dễ tiếp cận hơn và phù hợp với mục đích theo dõi giá của chúng ta.
Xây dựng script theo dõi giá trên Tiki.vn hoàn chỉnh bằng Python
Lưu ý quan trọng: Toàn bộ mã nguồn dưới đây được xây dựng và thử nghiệm cho trang Tiki.vn. Các API endpoint, cấu trúc URL, tên cookie (tiki_guest_token), và cấu trúc JSON response sẽ khác nhau trên các trang web khác như Shopee hay Lazada. Bạn cần áp dụng kỹ năng ở Phần 3 để tùy chỉnh lại cho phù hợp.
Giờ là lúc kết hợp tất cả kiến thức để xây dựng file price_tracker.py hoàn chỉnh. Chúng ta sẽ đi qua từng khối logic của script.
Khối 1: Khai báo thư viện và cấu hình
Đây là phần nền móng, nơi chúng ta khai báo các “nguyên liệu” cần thiết.
import requests
import random
import pandas as pd
from datetime import datetime
import os
import time
import re
from apscheduler.schedulers.blocking import BlockingScheduler
from dotenv import load_dotenv
# --- CẤU HÌNH SCRIPT ---
load_dotenv() # Tải các biến môi trường từ file .env
# CHỈ CẦN DÁN URL SẢN PHẨM MUỐN THEO DÕI VÀO ĐÂY
URLS_TO_TRACK = [
"https://tiki.vn/dien-thoai-poco-c75-8gb-256gb-hang-chinh-hang-dk-p278098703.html?spid=278098705",
"https://tiki.vn/dien-thoai-samsung-galaxy-a36-5g-hang-chinh-hang-p277466537.html?pid=277466543"
]
# Đọc thông tin proxy an toàn từ biến môi trường
PROXY_INFO = os.getenv("MY_PROXY_INFO")
if not PROXY_INFO:
print("❌ LỖI: Không tìm thấy thông tin proxy. Hãy chắc chắn bạn đã tạo file .env và điền đúng biến MY_PROXY_INFO.")
exit() # Thoát chương trình nếu không có proxy
Script báo PROXY_INFO rỗng: File .env của bạn có tồn tại không? Tên biến MY_PROXY_INFO và định dạng user:pass@host:port có đúng chưa?
Khối 2: Các hàm tiện ích (Tự động hóa)
Đây là những công cụ giúp script của bạn thông minh và tiện lợi hơn.
def extract_ids_from_url(url):
"""Bóc tách product_id và spid tự động từ URL Tiki."""
match = re.search(r'-p(\d+)\.html\?spid=(\d+)', url)
if match:
return {'product_id': match.group(1), 'spid': match.group(2)}
print(f"⚠️ Không thể bóc tách ID từ URL: {url}")
return None
def get_guest_token(session):
"""Lấy x-guest-token động bằng cách truy cập trang chủ Tiki."""
try:
print("ℹ️ Đang lấy guest token...")
# Sử dụng một User-Agent đơn giản cho yêu cầu này
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
# Truy cập một trang bất kỳ để được cấp token trong cookie
response = session.get("https://tiki.vn/", headers=headers, timeout=15)
response.raise_for_status()
token = session.cookies.get("tiki_guest_token")
if token:
print("✅ Đã lấy token thành công!")
return token
print("⚠️ Không tìm thấy tiki_guest_token trong cookie.")
return None
except requests.RequestException as e:
print(f"❌ Lỗi khi lấy token: {e}")
return None
Nếu lỗi, cần kiểm tra gì?
Hàm extract_ids_from_url lỗi: Cấu trúc URL của Tiki đã thay đổi. Hãy xem một URL sản phẩm mới và điều chỉnh lại biểu thức chính quy trong re.search(...).
Hàm get_guest_token lỗi: Tiki đã đổi tên cookie chứa token. Hãy dùng F12 -> tab Application -> Cookies để tìm tên cookie mới và cập nhật vào dòng session.cookies.get("tên_cookie_mới"). Để ẩn mình tốt hơn, bạn nên tìm hiểu về dấu vân tay trình duyệt (Browser Fingerprint).
Khối 3: Hàm lấy dữ liệu sản phẩm từ API (cập nhật T8/2025)
Đây là trái tim của hệ thống, nơi gửi yêu cầu đến API và trích xuất tất cả các dữ liệu giá trị. Đây cũng là nơi dễ cần cập nhật nhất khi Tiki thay đổi.
def get_product_data_api(session, product_id, spid, guest_token):
"""Gửi yêu cầu đến API của Tiki với token động để lấy dữ liệu."""
# URL API của Tiki, được cập nhật với tham số version
api_url = f"https://tiki.vn/api/v2/products/{product_id}?platform=web&spid={spid}&version=3"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'en-US,en;q=0.9,vi;q=0.8',
'x-guest-token': guest_token, # Sử dụng token động đã lấy được
'Referer': f"https://tiki.vn/-p{product_id}.html", # Thêm Referer để giả lập hành vi người dùng: truy cập từ trang sản phẩm
}
proxies = {"http": f"http://{PROXY_INFO}", "https": f"http://{PROXY_INFO}"}
print(f"🔄 [API] Đang lấy dữ liệu cho sản phẩm ID: {product_id}")
try:
response = session.get(api_url, headers=headers, proxies=proxies, timeout=20)
response.raise_for_status() # Dừng lại nếu có lỗi HTTP (4xx, 5xx)
data = response.json()
# Trích xuất dữ liệu dựa trên cấu trúc JSON thực tế
return {
'Timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'SKU': data.get('sku'),
'Name': data.get('name'),
'Brand': data.get('brand', {}).get('name'),
'Price': data.get('price'),
'ListPrice': data.get('list_price'),
'DiscountRate': data.get('discount_rate'),
'Seller': data.get('current_seller', {}).get('name'),
'StockStatus': data.get('inventory_status'),
'StockQuantity': data.get('stock_item', {}).get('qty'),
'Rating': data.get('rating_average'),
'ReviewCount': data.get('review_count'),
'SoldQuantityText': data.get('quantity_sold', {}).get('text'),
'SoldQuantityValue': data.get('quantity_sold', {}).get('value'),
'URL': data.get('short_url')
}
except requests.exceptions.HTTPError as e:
print(f"❌ Lỗi HTTP {e.response.status_code}. Có thể sai token, sai URL API hoặc đã bị chặn.")
return None
except Exception as e:
print(f"❌ Lỗi không xác định khi xử lý dữ liệu: {e}")
return None
Nếu lỗi, cần kiểm tra gì?
Lỗi 401/403 (Unauthorized/Forbidden):guest_token sai hoặc Tiki yêu cầu một header xác thực mới.
Lỗi 404 (Not Found):api_url đã lỗi thời. Hãy dùng tab Network để tìm URL API mới nhất.
Lỗi KeyError hoặc dữ liệu trả về None: Cấu trúc JSON đã thay đổi. Hãy thêm dòng print(data) vào sau data = response.json() để xem cấu trúc mới và cập nhật lại các dòng data.get(...) cho đúng.
Các phần cuối cùng để ghép nối và khởi động cỗ máy.
def save_to_csv(data, filename="price_history_api.csv"):
"""Lưu một dictionary dữ liệu vào file CSV."""
if not data or data.get('Price') is None:
print("➡️ Dữ liệu không hợp lệ, bỏ qua việc lưu.")
return
# Chuyển đổi dictionary thành một DataFrame của Pandas
df = pd.DataFrame([data])
# Kiểm tra xem file đã tồn tại chưa để quyết định có ghi header không
file_exists = os.path.isfile(filename)
# Dùng mode 'a' (append) để ghi nối vào cuối file, không ghi đè
df.to_csv(filename, mode='a', header=not file_exists, index=False, encoding='utf-8-sig')
print(f"✅ Đã lưu: {data['Name']} - Giá: {data['Price']}đ")
def price_tracking_job():
"""Hàm điều phối toàn bộ quy trình làm việc."""
print(f"\n--- BẮT ĐẦU PHIÊN LÀM VIỆC LÚC: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} ---")
# Sử dụng 'with' để quản lý session, đảm bảo nó tự động xử lý cookie và đóng kết nối đúng cách
with requests.Session() as session:
# Lấy guest token một lần cho cả phiên làm việc
guest_token = get_guest_token(session)
if not guest_token:
print("❌ Không thể tiếp tục nếu không có guest token. Dừng phiên làm việc.")
return
# Lặp qua từng URL trong danh sách để theo dõi
for url in URLS_TO_TRACK:
ids = extract_ids_from_url(url)
if ids:
product_data = get_product_data_api(session, ids['product_id'], ids['spid'], guest_token)
if product_data:
save_to_csv(product_data)
# Tạm dừng ngẫu nhiên giữa các lần gọi để tránh bị chặn
sleep_time = random.uniform(5, 10)
print(f"--- Tạm nghỉ {sleep_time:.2f} giây... ---")
time.sleep(sleep_time)
print(f"--- PHIÊN LÀM VIỆC KẾT THÚC. ---\n")
# --- ĐIỂM KHỞI ĐỘNG CHƯƠNG TRÌNH ---
if __name__ == "__main__":
scheduler = BlockingScheduler(timezone="Asia/Ho_Chi_Minh")
# Lập lịch để chạy hàm `price_tracking_job` vào 9 giờ sáng mỗi ngày
scheduler.add_job(price_tracking_job, 'cron', hour=9, minute=0)
print("🚀 HỆ THỐNG THEO DÕI GIÁ (API-FIRST) ĐÃ KHỞI ĐỘNG.")
print("Hãy để cửa sổ terminal này chạy nền. Nhấn Ctrl+C để thoát.")
# Chạy tác vụ lần đầu tiên ngay khi khởi động
price_tracking_job()
# Bắt đầu bộ lập lịch
scheduler.start()
Câu hỏi thường gặp (FAQ)
1. Việc theo dõi giá bằng API có hợp pháp không?
Về mặt kỹ thuật, việc lấy dữ liệu công khai không phải là bất hợp pháp. Tuy nhiên, bạn cần hành động một cách có đạo đức và tôn trọng. Hãy luôn kiểm tra file robots.txt của website (ví dụ: Tiki.vn/robots.txt) để xem họ cho phép hay không cho phép cào dữ liệu ở những đường dẫn nào. Quan trọng nhất là không gửi yêu cầu với tần suất quá cao gây ảnh hưởng đến máy chủ của họ.
2. Làm cách nào để áp dụng kỹ thuật này cho Shopee hoặc Lazada?
Tư duy hoàn toàn tương tự, nhưng chi tiết kỹ thuật sẽ khác. Bạn cũng sẽ dùng Developer Tools -> Network để tìm các yêu cầu API, nhưng tên của API endpoint, các tham số cần truyền lên, và cơ chế xác thực (token) của Shopee/Lazada sẽ khác với Tiki. Việc tìm ra những điểm khác biệt này chính là kỹ năng cốt lõi của một chuyên gia cào dữ liệu.
3. Tại sao phải sử dụng Proxy khi theo dõi giá?
Khi bạn gửi nhiều yêu cầu từ cùng một địa chỉ IP trong thời gian ngắn, các trang TMĐT sẽ dễ dàng phát hiện và chặn IP của bạn. Sử dụng Proxy, đặc biệt là Proxy Dân Cư Xoay, giúp mỗi yêu cầu của bạn được gửi đi từ một địa chỉ IP khác nhau, trông giống như nhiều người dùng thật đang truy cập. Điều này giúp bạn tránh bị chặn, vượt qua giới hạn truy cập và thu thập dữ liệu một cách ổn định, liên tục.
4. Tại sao chúng ta không sử dụng API chính thức mà Tiki cung cấp?
API chính thức mà Tiki công bố trong tài liệu Open API dành cho các đối tác bán hàng đã đăng ký và yêu cầu một “seller token key” để xác thực. Phương pháp trong bài viết này sử dụng API công khai mà website Tiki dùng để hiển thị thông tin cho mọi người dùng. Đối với mục đích theo dõi giá từ góc độ người mua, việc sử dụng API công khai là phương pháp phù hợp và khả thi duy nhất.
Kết luận
Bạn đã đi hết một hành trình không chỉ để xây dựng một công cụ, mà để trang bị một tư duy và bộ kỹ năng bền vững. Bằng cách làm chủ phương pháp API-first, học cách tự tìm endpoint, tự lấy token, phân tích JSON và cập nhật code khi cần thiết, bạn không còn phụ thuộc vào những đoạn code có sẵn sắp hết hạn.
Giờ đây, bạn đã có khả năng “câu cá” trong đại dương dữ liệu đầy biến động. Hãy tiếp tục phát triển hệ thống của mình với các tính năng cảnh báo qua Telegram/Email, mở rộng sang các sàn thương mại điện tử khác, hay trực quan hóa dữ liệu để có cái nhìn sâu sắc về nghiên cứu thị trường. Với các kỹ năng này, bạn cũng có thể áp dụng cho việc thu thập dữ liệu Facebook hoặc tự động hóa Instagram.
Tự động theo dõi giá sản phẩm trên Tiki.vn bằng API là một phương pháp mới và linh hoạt nhất trong việc phân tích thị trường trong môi trường E-commerce 2025, việc theo dõi giá đối thủ không chỉ là một lợi thế cạnh tranh—đó là một cuộc chiến công nghệ. Các phương pháp scraping […]
Trong kỷ nguyên 2025, việc nuôi tài khoản Instagram số lượng lớn đã trở thành một thách thức thực sự cho giới Marketing và MMO. Bạn có thể đã dồn hết tâm huyết để xây dựng hệ thống, để rồi một buổi sáng thức dậy và thấy tất cả “bay màu” hàng loạt không một […]
Bạn vừa đầu tư một proxy mới, háo hức cài đặt để bắt đầu công việc nhưng màn hình lại đột ngột hiển thị thông báo “The proxy server is refusing connections”. Đừng lo lắng, đây là một trong những sự cố kết nối phổ biến nhất mà bất kỳ ai sử dụng proxy cũng […]
Thử thách vượt qua anti-bot Instagram đã trở thành một trong những bài toán khó khăn nhất đối với cộng đồng lập trình viên và chuyên gia marketing. Các phương pháp scraping, tự động hóa cũ kỹ giờ đây gần như “thất thủ” trước hệ thống phòng thủ ngày càng tinh vi của nền tảng […]
Quản lý hàng chục tài khoản, mỗi tài khoản lại cần một địa chỉ IP riêng biệt là bài toán đau đầu của nhiều anh em làm MMO. Việc thay đổi IP thủ công vừa tốn thời gian, vừa dễ nhầm lẫn và tiềm ẩn rủi ro, ảnh hưởng trực tiếp đến hiệu suất công […]
Nếu bạn là dân cày MMO chính hiệu, bạn chắc chắn đã quá quen với cảnh tượng này: hàng chục profile trình duyệt, hàng trăm tài khoản game, Facebook, Google cần đăng nhập liên tục. Việc quản lý IP cho từng tài khoản để tránh bị “đánh dấu” là một cuộc chiến không hồi kết, […]