Quay lại blog

Xuất hồ sơ, bài đăng và dữ liệu cửa hàng TikTok sang CSV

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

03-Sep-2026

TL;DR:

  • Xuất dữ liệu TikTok sang CSV yêu cầu một bảng cho mỗi cấp thực thể. Hồ sơ, bài viết, sản phẩm và SKU không chia sẻ một sơ đồ phẳng an toàn.
  • Các định danh nên giữ nguyên dạng văn bản. Các ID tài khoản, bài viết, sản phẩm, người bán và SKU có thể mất độ chính xác khi phần mềm bảng tính hiểu chúng là số.
  • Các chỉ số số cần chuyển đổi rõ ràng. Giữ lại các giá trị bị thiếu trong khi chuyển đổi các số đếm và giá hợp lệ về các loại dự kiến.
  • Các danh sách lồng nhau cần được tuần tự hóa có chủ đích. Các thẻ hashtag và cặp tùy chọn có thể sử dụng văn bản phân tách có thể đọc hoặc các bảng con riêng biệt.
  • CSV được tạo bởi người gọi. Các tác nhân đã được tài liệu hóa trả về JSON thay vì sách công việc Excel gốc.
  • 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: làm phẳng JSON là một quyết định về mô hình dữ liệu

JSON có thể đại diện cho số liệu lồng nhau, mảng, tùy chọn sản phẩm và đối tượng SKU. Một tệp CSV thì không. Do đó, một xuất khẩu hữu ích bắt đầu bằng cách quyết định thực thể nào thuộc về mỗi hàng và cách các giá trị null, chuỗi và bộ sưu tập lồng nhau sẽ tồn tại sau khi chuyển đổi.

Hướng dẫn này ánh xạ phản hồi hồ sơ, bài viết và Cửa hàng Scrapeless TikTok thành bốn tệp CSV: hồ sơ, bài viết, sản phẩm và SKU. Chuyển đổi giữ nguyên độ chính xác của định danh, giữ cho các phản hồi gốc có sẵn và tránh sao chép tệp phương tiện khi một URL là đủ.

Tổng quan về tác nhân dữ liệu TikTok ánh xạ các đầu vào yêu cầu tạo ra các đối tượng JSON này.

Dòng chảy tổng quan

Đối tượng JSON Hạt CSV Ứng viên khóa chính
Chi tiết người dùng Một hồ sơ quan sát ID tài khoản + thời gian thu thập
Mục làm việc người dùng Một bài viết quan sát ID bài viết + thời gian thu thập
Sản phẩm trang cửa hàng Một sản phẩm quan sát ID sản phẩm + khu vực + thời gian thu thập
SKU trang cửa hàng Một biến thể quan sát ID sản phẩm + khu vực + ID SKU + thời gian thu thập

Việc xuất khẩu là một chuyển đổi trên ứng dụng. Nó không khẳng định rằng các tác nhân trả về tệp CSV hoặc Excel trực tiếp.

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

  • Các phản hồi JSON đã lưu từ scraper.tiktok.user.detail, scraper.tiktok.user.work, hoặc scraper.tiktok.shop.page
  • Một dấu thời gian thu thập được ghi lại bởi ứng dụng gọi
  • Một từ điển trường xác định loại và xử lý null
  • Phần mềm bảng tính hoặc phân tích tương thích UTF-8 để kiểm tra

Chuyển đổi dưới đây có thể chạy tại chỗ với các tệp JSON do người đọc cung cấp. Không cần xác thực Scrapeless sau khi các phản hồi đã được lưu.

Giai đoạn 1: Định nghĩa Bốn Sơ Đồ Xuất Khẩu

Các hồ sơ và bài viết kết nối thông qua các định danh tài khoản, trong khi sản phẩm và SKU kết nối thông qua ID sản phẩm và khu vực. Giữ cho các cấp thực thể này tách biệt:

Tệp Các trường được chọn
profiles.csv ID tài khoản, tên người dùng, sec_uid, thống kê công khai, cờ, thời gian thu thập
posts.csv ID bài viết, ID tài khoản, URL, mô tả, thẻ hashtag, chỉ số công khai, thời gian thu thập
products.csv ID sản phẩm, khu vực, ID người bán, tên, giá, tiền tệ, tồn kho, đánh giá, số lượng, thời gian thu thập
skus.csv ID sản phẩm, khu vực, ID SKU, tùy chọn, giá SKU, khả năng có sẵn, thời gian thu thập

RFC 4180 định nghĩa một định dạng CSV chung và các quy tắc trích dẫn; đặc tả định dạng CSV là hữu ích khi các xuất khẩu di chuyển giữa các hệ thống. Tài liệu Module CSV của Python giải thích tại sao các tệp nên được mở với newline="".

Giai đoạn 2: Bảo tồn ID và Null

Mỗi định danh trông giống như số nên được chuyển đổi thành chuỗi trước khi xuất. Điều này áp dụng cho các ID tài khoản, bài viết, sản phẩm, người bán, âm nhạc và SKU. Một bảng tính có thể hiển thị định dạng khoa học hoặc làm tròn các chữ số.

Các giá trị bị thiếu nên giữ nguyên trống hoặc sử dụng một dấu hiệu null đã được tài liệu hóa. Đừng biến số lượng người theo dõi, giá, số lượng tồn kho, đánh giá, hoặc chỉ số tương tác bị thiếu thành số không.

Tài liệu Decimal của Python mô tả toán học thập phân chính xác cho các mức giá. Đối với một xuất khẩu CSV đơn giản, việc bảo tồn văn bản giá gốc thường an toàn hơn so với việc chuyển đổi nó thành số dấu phẩy động nhị phân.

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

Tăng cường quy trình thu thập dữ liệu web và tự động hóa của bạn với Scrapeless!
Đăng ký 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ờ trong Bảng điều khiển Scrapeless.

Giai đoạn 3: Làm phẳng Các Trường Lồng Nhau Mà Không Mất Ý Nghĩa

Danh sách hiển thị nhỏ có thể sử dụng một dấu phân cách mà từ điển trường ghi lại. Ví dụ, các hashtag có thể được kết hợp với |, và các tùy chọn SKU có thể trở thành Color=Black | Size=M. Giữ một bảng con riêng biệt khi các phần tử danh sách cần có các trường hoặc phân tích riêng.

Các từ điển lồng nhau nên được ánh xạ một cách rõ ràng. Tiền tệ sản phẩm và giá cả sống dưới price; số lượng tổng hợp và tính khả dụng sống dưới stock; số lượng hồ sơ sống dưới statistics. Một bộ xử lý phẳng đệ quy chung có xu hướng tạo ra các tên cột không ổn định và trộn lẫn các cấp độ thực thể.

Giai đoạn 4: Xuất bốn bảng trong Python

Kịch bản dự kiến lên đến ba tệp đã lưu trong thư mục hiện tại: profile.json, posts.json, và shop-product.json. Nó chỉ ghi một CSV khi nguồn tương ứng tồn tại.

python Copy
import csv
import json
from pathlib import Path

COLLECTED_AT = "reader-supplied-utc-timestamp"


def load_if_present(path):
    return json.loads(path.read_text(encoding="utf-8")) if path.exists() else None


def text_id(value):
    return "" if value is None else str(value)


def write_csv(path, rows):
    if not rows:
        return
    with path.open("w", newline="", encoding="utf-8") as output:
        writer = csv.DictWriter(output, fieldnames=list(rows[0]))
        writer.writeheader()
        writer.writerows(rows)


profile = load_if_present(Path("profile.json"))
posts_response = load_if_present(Path("posts.json"))
shop = load_if_present(Path("shop-product.json"))

if profile:
    statistics = profile.get("statistics") or {}
    write_csv(Path("profiles.csv"), [{
        "collected_at": COLLECTED_AT,
        "account_id": text_id(profile.get("account_id")),
        "unique_id": profile.get("unique_id"),
        "sec_uid": profile.get("sec_uid"),
        "followers": statistics.get("followers"),
        "following": statistics.get("following"),
        "likes": statistics.get("likes"),
        "videos": statistics.get("videos"),
        "is_verified": profile.get("is_verified"),
        "is_private": profile.get("is_private"),
    }])

if posts_response:
    post_rows = []
    for item in posts_response.get("items") or []:
        post_rows.append({
            "collected_at": COLLECTED_AT,
            "post_id": text_id(item.get("post_id")),
            "author_id": text_id(item.get("author_id")),
            "post_url": item.get("post_url"),
            "description": item.get("description"),
            "create_time": item.get("create_time"),
            "hashtags": "|".join(str(v) for v in (item.get("hashtags") or [])),
            "play_count": item.get("play_count"),
            "like_count": item.get("like_count"),
            "comment_count": item.get("comment_count"),
            "share_count": item.get("share_count"),
            "collect_count": item.get("collect_count"),
            "is_pinned": item.get("is_pinned"),
        })
    write_csv(Path("posts.csv"), post_rows)

if shop:
    price = shop.get("price") or {}
    stock = shop.get("stock") or {}
    product_id = text_id(shop.get("product_id"))
    region = shop.get("region")
    write_csv(Path("products.csv"), [{
        "collected_at": COLLECTED_AT,
        "product_id": product_id,
        "region": region,
        "seller_id": text_id(shop.get("seller_id")),
        "name": shop.get("name"),
        "currency": price.get("currency"),
        "sale_price": price.get("sale_price"),
        "original_price": price.get("original_price"),
        "available_quantity": stock.get("available_quantity"),
        "in_stock": stock.get("in_stock"),
        "rating": shop.get("rating"),
        "review_count": shop.get("review_count"),
        "sold_count": shop.get("sold_count"),
    }])

    sku_rows = []
    for sku in shop.get("skus") or []:
        sku_price = sku.get("price") or {}
        sku_rows.append({
            "collected_at": COLLECTED_AT,
            "product_id": product_id,
            "region": region,
            "sku_id": text_id(sku.get("sku_id")),
            "options": " | ".join(
                f"{v.get('name', '')}={v.get('value', '')}"
                for v in (sku.get("options") or [])
            ),
            "currency": sku_price.get("currency"),
            "sale_price": sku_price.get("sale_price"),
            "available_quantity": sku.get("available_quantity"),
            "in_stock": sku.get("in_stock"),
        })
    write_csv(Path("skus.csv"), sku_rows)

Dấu thời gian được cung cấp có chủ ý bởi người đọc vì nó thuộc về sự kiện thu thập, không phải là phiên xuất. Thay thế dấu chấm chờ trước khi thực thi bằng dấu thời gian được lưu bên cạnh phản hồi nguồn.

Giai đoạn 5: Xác thực đầu ra CSV

Xác thực nên kiểm tra tệp và ý nghĩa phân tích:

  1. Mở mỗi CSV dưới dạng UTF-8 và xác nhận mô tả và tên sản phẩm vẫn còn đọc được.
  2. Nhập các cột định danh một cách rõ ràng dưới dạng văn bản và so sánh các chữ số của chúng với JSON nguồn.
  3. Đếm các thực thể nguồn và các hàng đã xuất ở cùng một độ tinh tế.
  4. Kiểm tra rằng các giá trị thiếu vẫn giữ nguyên là trống chứ không phải là không.
  5. Xác nhận giá luôn đi kèm với tiền tệ và ngữ cảnh sản phẩm hoặc SKU.
  6. Kiểm tra mô tả, hashtag và chuỗi tùy chọn chứa dấu phẩy, dấu ngoặc kép hoặc xuống dòng.

Giữ một từ điển trường nhỏ bên cạnh các tệp với đường dẫn nguồn, cột CSV, loại, chính sách null và độ tinh tế của thực thể. Điều này khiến mỗi xuất trở nên có thể tái sản xuất khi các trường được chọn hoặc công cụ bên dưới thay đổi.

Giữ phương tiện như các tham chiếu

Các trường hình đại diện, bìa, sản phẩm và hình ảnh SKU có thể chứa URL. Chỉ xuất các liên kết cần thiết cho phân tích và tránh tải xuống các phương tiện không liên quan vào tập dữ liệu. Thời gian tồn tại của URL có thể thay đổi, vì vậy một liên kết CSV không nên được coi là một kho lưu trữ phương tiện vĩnh viễn.

Đối với các pipeline lớn hơn, giữ nguyên JSON thô và siêu dữ liệu thu thập trong lưu trữ bền vững, sau đó tái tạo các chế độ xem CSV cho mỗi nhà phân tích hoặc công cụ. Scrapeless cung cấp các tác nhân qua Scraping API; xem lại trang giá hiện tại khi lên kế hoạch cho khối lượng thu thập.

Kết luận: xuất theo thực thể, không theo hình thức phản hồi

Xuất dữ liệu TikTok sang CSV hoạt động khi việc chuyển đổi bảo tồn độ tinh tế của thực thể, chuỗi định danh, null, ý nghĩa trường lồng nhau, tiền tệ và thời gian thu thập. Bốn tệp chú ý dễ xác thực và kết hợp hơn một bảng rộng trộn lẫn hồ sơ, bài đăng, sản phẩm và biến thể.

Sẵn sàng xây dựng các xuất CSV sẵn sàng phân tích?

Tham gia Scrapeless Discord hoặc Cộng đồng Telegram để so sánh các sơ đồ xuất. Tạo tài khoản trong Scrapeless Dashboard khi bạn đã sẵn sàng thu thập JSON nguồn.

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

H: Các tác nhân TikTok có thể xuất tệp CSV hoặc Excel trực tiếp không?

Các tác nhân đã tài liệu trả về JSON. Ứng dụng gọi sẽ chuyển đổi phản hồi thành CSV hoặc định dạng phân tích khác.

H: Tại sao các ID TikTok nên được xuất dưới dạng văn bản?

Văn bản bảo tồn mỗi chữ số khi các công cụ bảng tính và phân tích sẽ ép buộc một định danh dạng số dài.

H: Hồ sơ, bài đăng, sản phẩm và SKU có nên chia sẻ một CSV không?

Hồ sơ, bài đăng, sản phẩm và SKU nên sử dụng các bảng riêng biệt vì mỗi cái có một độ tinh tế hàng khác nhau và khóa khác nhau.

H: Các chỉ số TikTok thiếu nên xuất hiện trong CSV như thế nào?

Các chỉ số thiếu nên giữ nguyên là trống hoặc sử dụng một dấu hiệu null đã tài liệu. Chúng không nên trở thành không mà không có bằng chứng từ nguồn.

H: Có cần tải xuống hình ảnh và video cho xuất không?

Xuất không cần tải xuống phương tiện. Chỉ lưu trữ các URL nguồn cần thiết cho phân tích và tôn trọng chính sách lưu giữ của dự án.

H: Xuất dữ liệu công khai TikTok có hợp pháp không?

Tính hợp pháp phụ thuộc vào khu vực pháp lý, mục đích, phương pháp truy cập, dữ liệu và các điều khoản áp dụng. Giảm thiểu các trường xuất khẩu và xin lời khuyên pháp lý cho mục đích sử dụng dự kiến.

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