Quay lại blog

Theo dõi giá TikTok Shop với ảnh chụp sản phẩm trong Python

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

01-Sep-2026

TL;DR:

  • Theo dõi giá là một quy trình chụp ảnh. Gọi scraper.tiktok.shop.page theo lịch trình, đóng dấu thời gian cho mỗi phản hồi và so sánh những điều tương tự với nhau.
  • Chìa khóa so sánh bao gồm bối cảnh thị trường. ID sản phẩm, khu vực trả về, tiền tệ và danh tính SKU ngăn chặn những sự trùng khớp sai.
  • Những thay đổi sản phẩm và SKU là các sự kiện khác nhau. Theo dõi giá sản phẩm hiển thị và hàng tồn kho riêng biệt với tình trạng sẵn có hoặc giá biến thể.
  • Thiếu không phải là không có. Một trường thiếu không nên kích hoạt cảnh báo hết hàng hoặc cảnh báo giá miễn phí.
  • Diễn viên không tạo ra lịch sử hoặc cảnh báo. Lưu trữ SQLite, quy tắc so sánh, lịch trình và giao hàng sống trong ứng dụng gọi.
  • Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm tín dụng miễn phí thông qua Bảng điều khiển Scrapeless.

Giới thiệu: một trình theo dõi là hơn cả một yêu cầu lặp lại

Một phản hồi sản phẩm từ TikTok Shop đơn lẻ trả lời những gì trang hiện đang hiển thị. Một trình theo dõi giá trả lời một câu hỏi khác: điều gì đã thay đổi giữa hai quan sát tương tự, và liệu sự thay đổi có đủ ý nghĩa để thông báo cho ai đó không?

Sự phân biệt đó ảnh hưởng đến toàn bộ thiết kế. Diễn viên Scrapeless Shop cung cấp các bức ảnh sản phẩm có cấu trúc. Ứng dụng thêm một dấu thời gian, lưu trữ các dòng sản phẩm và SKU, so sánh mỗi dòng với quan sát trước đó, và phát ra một sự kiện sẵn sàng cảnh báo. Hướng dẫn này xây dựng quy trình đó bằng Python và SQLite.

Để biết về mẫu yêu cầu đằng sau các bức ảnh sản phẩm, đọc hướng dẫn diễn viên dữ liệu Scrapeless trực tiếp.

Quy trình qua cái nhìn tổng quát

Giai đoạn Hành động Đầu ra bền vững
Lấy Yêu cầu một sản phẩm đã biết theo ID và khu vực Bức ảnh JSON thô
Chuẩn hóa Tách biệt các trường sản phẩm và SKU Các dòng có thể so sánh
Lưu trữ Chèn các quan sát có đóng dấu thời gian Lịch sử sản phẩm và SKU
So sánh Tìm bản ghi khớp trước đó Các sự kiện thay đổi
Giao hàng Áp dụng các quy tắc kinh doanh JSON sẵn sàng cảnh báo

Quy trình này theo dõi danh sách sản phẩm do ứng dụng cung cấp. Nó không phát hiện mọi sản phẩm trong một cửa hàng hoặc tiết lộ sổ đặt hàng riêng tư.

Điều kiện tiên quyết

  • Một tài khoản Scrapeless và mã thông báo API từ Bảng điều khiển Scrapeless
  • Python với thư viện tiêu chuẩn và hỗ trợ SQLite
  • Các ID sản phẩm TikTok Shop công cộng đã biết
  • Một quy tắc khu vực cho mỗi sản phẩm
  • Một chính sách cảnh báo xác định những thay đổi nào là quan trọng

Mã cần một mã thông báo trực tiếp trong SCRAPELESS_API_KEY. Danh sách sản phẩm được cung cấp bởi ứng dụng của bạn.

Giai đoạn 1 — Lấy một Bức ảnh Sản phẩm

Gọi POST https://api.scrapeless.com/api/v1/scraper/request với diễn viên scraper.tiktok.shop.page. Đầu vào của nó chứa product_id dưới dạng chuỗi và region. Tài liệu hướng dẫn diễn viên trang TikTok Shop cho thấy các trường yêu cầu và phản hồi.

Kết quả có thể bao gồm danh tính sản phẩm, khu vực trả về, người bán, tên, số lượng đã bán, giá, tiền tệ, hàng tồn kho, xếp hạng, số lượng đánh giá, hình ảnh, tùy chọn, SKU, danh mục và chi tiết vận chuyển. Lưu trữ phản hồi thô trước khi chuẩn hóa để các thay đổi sơ đồ sau này có thể được xử lý mà không cần thu thập lại cùng một quan sát.

Giai đoạn 2 — Chuẩn hóa Các Dòng Sản phẩm và SKU

Sử dụng một chìa khóa sản phẩm được tạo từ ID sản phẩm và khu vực trả về. Đối với các biến thể, thêm định danh SKU. Tiền tệ thuộc về bản ghi so sánh; một giá số không có ý nghĩa chắc chắn trên thị trường khác khi đứng một mình.

Tham khảo mã tiền tệ ISO giải thích vai trò của các định danh tiền tệ. Giữ giá trị nguồn, ngay cả khi một lớp báo cáo hạ lưu cũng chuyển đổi giá.

Hàng tồn kho sản phẩm và biến thể nên vẫn tách biệt. Tài liệu hàng tồn kho của TikTok Shop coi định danh sản phẩm và SKU là các chiều truy vấn khác nhau, điều này phù hợp với một sơ đồ chụp ảnh sạch.

Bắt đầu thu thập dữ liệu với Scrapeless

Nâng cấp quy trình thu thập dữ liệu và tự động hóa của bạn với Scrapeless!
Đăng ký ngay hôm nay và nhận $5 tín dụng miễn phíkhông cần thẻ tín dụng.

Nhận tín dụng miễn phí của bạn ngay bây giờ tại Bảng điều khiển Scrapeless.

Giai đoạn 3 — Lưu trữ Các Bức ảnh trong SQLite

SQLite rất phù hợp cho một bộ theo dõi nhỏ vì cơ sở dữ liệu và các hàm thời gian có sẵn từ Python mà không cần dịch vụ riêng biệt. Tài liệu TÀI LIỆU TẠO BẢNG SQLITE định nghĩa các ràng buộc bảng được sử dụng trong sơ đồ.

python Copy
import json
import os
import sqlite3
from datetime import datetime, timezone
from urllib.request import Request, urlopen

ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"


def fetch_product(product_id, region):
    body = json.dumps({
        "actor": "scraper.tiktok.shop.page",
        "input": {"product_id": str(product_id), "region": region},
    }).encode()
    request = Request(
        ENDPOINT,
        data=body,
        headers={
            "x-api-token": os.environ["SCRAPELESS_API_KEY"],
            "content-type": "application/json",
        },
        method="POST",
    )
    with urlopen(request, timeout=60) as response:
        return json.load(response)


def open_database(path="tiktok_shop_history.sqlite3"):
    database = sqlite3.connect(path)
    database.execute("""
        CREATE TABLE IF NOT EXISTS product_snapshots (
            observed_at TEXT NOT NULL,
            product_id TEXT NOT NULL,
            region TEXT NOT NULL,
            currency TEXT,
            price TEXT,
            stock INTEGER,
            sold_count INTEGER,
            raw_json TEXT NOT NULL,
            PRIMARY KEY (observed_at, product_id, region)
        )
    """)
    return database


def store_product(database, raw):
    observed_at = datetime.now(timezone.utc).isoformat()
    row = (
        observed_at,
        str(raw.get("product_id", "")),
        str(raw.get("region", "")),
        raw.get("currency"),
        None if raw.get("price") is None else str(raw.get("price")),
        raw.get("stock"),
        raw.get("sold_count"),
        json.dumps(raw, ensure_ascii=False),
    )
    database.execute(
        "INSERT INTO product_snapshots VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
        row,
    )
    database.commit()
    return row

Lưu trữ giá cả dưới dạng văn bản nguồn hoặc kiểu thập phân chính xác trong các hệ thống hỗ trợ. Số thực nhị phân là một lựa chọn lưu trữ kém cho tiền vì một số giá trị thập phân không thể được biểu diễn chính xác.

Giai đoạn 4 — So Sánh Với Quan Sát Trước

So sánh chỉ xảy ra trong cùng một ID sản phẩm, khu vực trả lại và tiền tệ. Truy vấn hàng trước gần đây nhất, sau đó tạo ra một sự kiện cho các trường có mặt trong cả hai quan sát.

python Copy
from decimal import Decimal


def previous_snapshot(database, product_id, region, observed_at):
    return database.execute(
        """
        SELECT observed_at, currency, price, stock
        FROM product_snapshots
        WHERE product_id = ? AND region = ? AND observed_at < ?
        ORDER BY observed_at DESC
        LIMIT 1
        """,
        (str(product_id), region, observed_at),
    ).fetchone()


def compare(current, previous):
    if previous is None:
        return {"state": "baseline", "changes": []}

    _, old_currency, old_price, old_stock = previous
    changes = []
    if current[3] == old_currency and current[4] is not None and old_price is not None:
        new_price = Decimal(current[4])
        prior_price = Decimal(old_price)
        if new_price != prior_price:
            changes.append({
                "field": "price",
                "before": str(prior_price),
                "after": str(new_price),
                "currency": current[3],
            })
    if current[5] is not None and old_stock is not None and current[5] != old_stock:
        changes.append({"field": "stock", "before": old_stock, "after": current[5]})
    return {"state": "compared", "changes": changes}


database = open_database()
raw = fetch_product(os.environ["TIKTOK_SHOP_PRODUCT_ID"], "GB")
current = store_product(database, raw)
prior = previous_snapshot(database, current[1], current[2], current[0])
print(json.dumps(compare(current, prior), indent=2))

Quan sát đầu tiên thiết lập một cơ sở và không nên tạo ra một cảnh báo thay đổi giá. Một giá trị bị thiếu cũng không nên trở thành bằng không hoặc một sự kiện hết hàng.

Giai đoạn 5 — Theo Dõi Thay Đổi SKU

Tạo một bảng lịch sử thứ hai được khóa bởi thời gian quan sát, ID sản phẩm, khu vực trả lại và ID SKU. Lưu trữ các nhãn tùy chọn, giá SKU khi được lộ ra, tiền tệ và tình trạng có sẵn. So sánh một SKU chỉ với hàng trước đó của chính nó.

Danh sách biến thể có thể thay đổi. Một SKU mới được quan sát là một sự kiện phát hiện; một SKU bị thiếu là một sự vắng mặt cần xác nhận theo chính sách thu thập của ứng dụng. Không tuyên bố một biến thể ngừng hoạt động từ một phản hồi bị thiếu.

Giai đoạn 6 — Tạo Sự Kiện Sẵn Sàng Cảnh Báo

Giữ việc thu thập tách biệt với thông báo. Công việc so sánh có thể ghi lại các sự kiện như:

  • giá sản phẩm đã thay đổi trong cùng tiền tệ và khu vực
  • tổng số tồn kho vượt qua ngưỡng kinh doanh
  • tình trạng có sẵn của SKU đã biết đã thay đổi
  • một SKU mới xuất hiện

Áp dụng các ngưỡng sau khi các thay đổi chính xác đã được tính toán. Bao gồm thời gian quan sát trước và hiện tại, ID sản phẩm, khu vực, tiền tệ, trường, và giá trị trước/sau. Một công nhân hạ nguồn có thể chuyển hướng sự kiện đến email, trò chuyện, một webhook, hoặc một bảng điều khiển nội bộ.

Đọc sold_count Cẩn Thận

Bảo tồn sold_count như đã trả lại với ảnh chụp sản phẩm. Nó không xác định một khoảng thời gian báo cáo, đơn hàng cá nhân, khoản hoàn trả, hoặc GMV. Một thay đổi giữa các quan sát là một thay đổi nhãn trang, không phải là một sổ cái doanh số hoàn chỉnh.

Scrapeless cung cấp diễn viên sản phẩm thông qua Scraping API. Sử dụng trang giá hiện tại để ước tính chi phí của bộ sản phẩm và lịch trình đã chọn.

Kết Luận: giữ ảnh chụp có thể so sánh

Theo dõi giá TikTok Shop cần một khóa ổn định, một dấu thời gian thu thập, lịch sử sản phẩm và SKU tách biệt, và các quy tắc thay đổi cẩn thận. Diễn viên cung cấp mỗi ảnh chụp sản phẩm công khai; công việc Python xung quanh biến các quan sát đó thành lịch sử và sự kiện sẵn sàng cảnh báo.

Sẵn Sàng Xây Dựng Bộ Giám Sát Giá Của Bạn?

Tham gia Scrapeless Discord hoặc cộng đồng Telegram để thảo luận về các sơ đồ giám sát. Tạo một tài khoản trong Scrapeless Dashboard khi danh sách sản phẩm và chính sách cảnh báo đã sẵn sàng.

Câu Hỏi Thường Gặp

Q: Scrapeless có cung cấp lịch sử giá TikTok Shop tự động không?

Không. Diễn viên trả lại các ảnh chụp sản phẩm; ứng dụng gọi xuống lên lịch yêu cầu, lưu trữ các quan sát, so sánh các hàng, và gửi thông báo.

Q: Một bộ theo dõi giá TikTok Shop nên sử dụng khóa gì?

Sử dụng ID sản phẩm cộng với khu vực trả lại cho các bản ghi sản phẩm, và thêm ID SKU cho các bản ghi biến thể. Giữ tiền tệ trong mọi so sánh giá.

Q: Liệu giá hoặc giá trị tồn kho bị thiếu có nên được lưu trữ là không?

Không. Bị thiếu có nghĩa là không xác định, trong khi không là một giá trị rõ ràng với ý nghĩa kinh doanh khác.

Q: Có thể sử dụng số lượng đã bán làm doanh số hàng ngày hoặc GMV không?

Không. Nhãn trả lại không xác lập một khoảng thời gian báo cáo hoặc cung cấp một sổ cái đơn hàng và doanh thu hoàn chỉnh.

Q: Bộ theo dõi nên chạy thường xuyên như thế nào?

Chọn một nhịp độ dựa trên quyết định kinh doanh, sự biến động của sản phẩm, cách sử dụng được phép, và ngân sách. Ghi lại lịch trình để các khoảng trống trong lịch sử vẫn được nhìn thấy.

Q: Việc theo dõi giá Shop công khai có hợp pháp không?

Tính hợp pháp phụ thuộc vào khu vực tài phán, thị trường, mục đích, phương pháp truy cập, và các điều khoản áp dụng. Theo dõi dữ liệu sản phẩm công khai cho một mục đích được phép và nhận tư vấn pháp lý cho mục đích sử dụng dự kiến.

Q: Tôi có cần quản lý proxy, phòng thủ trang, hoặc bộ chọn DOM không?

Scrapeless xử lý bề mặt thu thập. Ứng dụng quản lý danh sách sản phẩm, dấu thời gian, lưu trữ, so sánh, và thông báo.

Q: Liệu điều này có thể chạy mà không cần một đại lý AI không?

Có. Quy trình làm việc sử dụng các yêu cầu HTTP trực tiếp, SQLite, và mã Python thông thường.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục