Hướng dẫn cách scrape video TikTok bằng Python

Cập nhật lần cuối vào April 14, 2026

TikTok hiện có khoảng và mỗi ngày có ước tính 23 triệu video được đăng tải. Nếu bạn từng cố thu thập dữ liệu từ dù chỉ một phần nhỏ của “dòng thác” này, bạn sẽ hiểu cảm giác mệt mỏi đến mức nào.

Thường thì mọi chuyện sẽ diễn ra như thế này: bạn tìm kiếm "scrape TikTok videos with Python", copy một đoạn mã từ bài hướng dẫn nào đó (hoặc nhờ ChatGPT viết giúp), chạy thử và nhận lại… chẳng có gì. HTML trống. Lỗi 403. Hoặc dòng thông báo đáng sợ "Process finished with exit code 0" nhưng không có bất kỳ kết quả nào. Tôi đã thấy vòng lặp này lặp đi lặp lại trong hàng chục issue GitHub và thảo luận Reddit, và đó là lý do tôi viết hướng dẫn này. Chúng ta sẽ đi qua 3 phương pháp Python thực sự hiệu quả trong năm 2025, hướng dẫn đầy đủ cách tải xuống file video .mp4 thực tế (không chỉ metadata — thứ mà hầu hết các bài hướng dẫn khác chỉ dừng ở đó), và một bảng so sánh để bạn chọn đúng cách cho nhu cầu của mình. Nếu bạn không cần dùng Python, tôi cũng sẽ giới thiệu các lựa chọn no-code như để lấy cùng loại dữ liệu chỉ trong khoảng hai cú nhấp chuột.

“Scraping TikTok Videos” Thực Ra Nghĩa Là Gì?

Trước khi đi vào code, cần làm rõ một chút về ý của cụm từ “scrape TikTok videos” — vì nó có thể nói đến hai việc rất khác nhau:

  1. Trích xuất metadata của video: Caption, hashtag, số lượt thích, bình luận, chia sẻ, lượt xem, ngày đăng, thông tin tác giả. Đây là phần mà hầu hết các bài hướng dẫn thường tập trung vào.
  2. Tải xuống file video gốc (.mp4): Lưu chính video về máy của bạn. Đây mới là thứ mà đa số người dùng thực sự muốn khi tìm "scrape TikTok videos" — và cũng là phần mà gần như không ai đề cập đầy đủ.

Hướng dẫn này bao quát cả hai. Mỗi phương pháp bên dưới đều có thể lấy metadata cung cấp URL tải xuống cần thiết để lưu file .mp4.

Vì Sao Nên Scrape Video TikTok Bằng Python?

Với và TikTok Shop tạo ra , lý do kinh doanh để khai thác dữ liệu TikTok là rất lớn. Dưới đây là những trường hợp sử dụng tôi gặp nhiều nhất:

| Trường hợp sử dụng | Bạn đang scrape dữ liệu gì | Dành cho ai | |---|---|---| | Nghiên cứu influencer & marketing | Tỷ lệ tương tác, follower, định dạng nội dung, hiệu quả hashtag | Đội marketing, agency | | Chiến lược nội dung | Hashtag xu hướng, định dạng video viral, tần suất đăng bài | Creator, social media manager | | Theo dõi thương hiệu | Lượt nhắc đến, độ phủ chiến dịch, cảm nhận của khán giả | Brand manager, PR team | | Phân tích đối thủ | Hiệu suất video đối thủ, creative quảng cáo, danh sách TikTok Shop | E-commerce, đội sản phẩm | | Nghiên cứu thị trường | Xu hướng mới nổi, hành vi người dùng, khám phá sản phẩm | Analyst, quỹ đầu tư, công ty nghiên cứu | | Lưu trữ & tuân thủ | File video để rà soát nội bộ hoặc lưu hồ sơ | Pháp lý, tuân thủ, agency |

Mức độ ảnh hưởng về doanh thu là rất thật: doanh thu quảng cáo TikTok tại Mỹ được dự báo đạt 23,4 tỷ USD vào năm 2026, và các creator affiliate tạo ra trong các nhóm sản phẩm hàng đầu trên TikTok Shop. Nếu bạn làm trong e-commerce hoặc influencer marketing, dữ liệu này có giá trị tiền tệ trực tiếp.

Vì Sao Code Python Cơ Bản Hay Thất Bại Khi Scrape TikTok

Nếu bạn đã thử kiểu như dưới đây nhưng không đi đến đâu, bạn không hề đơn độc:

1import requests
2from bs4 import BeautifulSoup
3resp = requests.get("https://www.tiktok.com/@someuser")
4soup = BeautifulSoup(resp.text, "html.parser")
5# ...rồi HTML vẫn chẳng có gì hữu ích

Lý do rất đơn giản: TikTok là một trong những nền tảng khó scrape nhất. Một requests.get() cơ bản chỉ trả về phần khung HTML gần như trống vì nội dung thật được render bằng JavaScript trong trình duyệt. Chưa kể TikTok còn triển khai lớp chống bot rất gắt, bao gồm phát hiện hành vi, TLS fingerprinting, tạo signature cho request, và các CSS selector thay đổi liên tục mà không báo trước.

tiktok-anti-bot-wall.webp

Theo báo cáo Imperva 2025 Bad Bot Report, lưu lượng tự động đã vượt lưu lượng người thật lần đầu tiên vào năm 2024 — bot hiện chiếm . TikTok hiểu rất rõ điều này và đã xây dựng hệ thống phòng thủ tương ứng.

Dưới đây là bảng chẩn đoán nhanh để bạn xác định vấn đề đang gặp và chọn đúng phương pháp:

| Triệu chứng | Nguyên nhân có thể | Phương pháp khắc phục | |---|---|---| | HTML trống / không có dữ liệu | Nội dung được render bằng JS; requests không chạy JavaScript | Phương pháp 1 (JSON ẩn) hoặc Phương pháp 3 (Playwright) | | Lỗi 403 / Access Denied | Header thiếu hoặc sai; bị hệ thống chống bot chặn | Phương pháp 1 với header đúng | | Chạy được một lần rồi dừng | Bị giới hạn tốc độ / chặn IP | Luân phiên proxy (tất cả phương pháp) | | Xuất hiện tường đăng nhập | Cần session/cookie | Phương pháp 3 (trình duyệt có session đã lưu) | | Code do ChatGPT tạo ra không trả kết quả | Cấu trúc TikTok đã thay đổi so với dữ liệu huấn luyện của model | Cả 3 phương pháp (đều là cách cập nhật) |

Ngưỡng giới hạn tốc độ vào khoảng 30–60 request mỗi phút cho mỗi IP trước khi bắt đầu gặp soft block hoặc CAPTCHA. IP datacenter sẽ bị gắn cờ chỉ trong vài phút — vì vậy proxy residential hoặc mobile gần như là bắt buộc nếu làm ở quy mô lớn.

Tổng Quan: 3 Cách Scrape Video TikTok Bằng Python

Dưới đây là lộ trình. Mỗi phương pháp có ưu và nhược điểm riêng, và tôi sẽ trình bày cả ba với code chạy được:

  1. Trích xuất JSON ẩn — Phân tích thẻ script __UNIVERSAL_DATA_FOR_REHYDRATION__ được nhúng trong trang TikTok. Nhanh nhất, đơn giản nhất, không cần trình duyệt.
  2. API nội bộ của TikTok — Gọi trực tiếp endpoint /api/post/item_list/ không được tài liệu hóa để lấy dữ liệu hàng loạt với phân trang theo cursor.
  3. Tự động hóa trình duyệt bằng Playwright — Render trang trong trình duyệt headless để xử lý infinite scroll, nội dung động và tường đăng nhập.

Cả ba phương pháp đều có thể dùng để tải xuống file video .mp4 thực tế — tôi sẽ hướng dẫn phần này riêng sau khi đi qua từng phương pháp. Cuối bài sẽ có bảng so sánh đầy đủ để bạn đưa ra lựa chọn phù hợp.

Phương Pháp 1: Scrape Video TikTok Bằng JSON Ẩn (Dễ Cho Người Mới)

Đây là cách tôi khuyên bạn nên thử đầu tiên. TikTok nhúng một khối JSON khổng lồ trong thẻ <script> có id __UNIVERSAL_DATA_FOR_REHYDRATION__ trên hầu hết mọi lần tải trang. Khối này chứa toàn bộ dữ liệu profile và video mà JavaScript frontend thường render ra — nghĩa là bạn chỉ cần một HTTP request là lấy được, không cần browser.

Bạn Cần Gì

  • Python 3.8+
  • requests (hoặc httpx)
  • beautifulsoup4 (hoặc parsel)
  • Header phù hợp: User-Agent, Referer, Accept-Language

Cài thư viện:

1pip install requests beautifulsoup4

Từng Bước: Trích Xuất Dữ Liệu Video TikTok Từ Script Tag

Bước 1: Gửi GET request với header trình duyệt giống thật.

Đây là chỗ nhiều người mới thường thất bại. Nếu bạn gửi requests.get() trần trụi không có header, TikTok sẽ trả về lỗi 403 hoặc một trang CAPTCHA. Tối thiểu bạn cần một User-Agent của trình duyệt hiện tại và header Referer.

1import requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.tiktok.com/@charlidamelio"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
7    "Referer": "https://www.tiktok.com/",
8    "Accept-Language": "en-US,en;q=0.9",
9}
10resp = requests.get(url, headers=headers)

Bước 2: Phân tích HTML và tìm script tag chứa dữ liệu hydration.

1soup = BeautifulSoup(resp.text, "html.parser")
2script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")

Nếu script_tagNone, có thể TikTok đã chặn bạn (hãy kiểm tra status code) hoặc họ đã đổi id của thẻ (hiếm nhưng vẫn có thể xảy ra).

Bước 3: Nạp nội dung script dưới dạng JSON.

1data = json.loads(script_tag.string)

Bước 4: Đi sâu vào cấu trúc JSON để lấy metadata video.

Cấu trúc dữ liệu nằm dưới __DEFAULT_SCOPE__. Với trang profile người dùng:

1user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
2user_info = user_detail["userInfo"]
3# Thống kê profile
4stats = user_info["stats"]
5print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
6# Danh sách video (trang đầu tiên)
7item_list = user_detail.get("itemList", [])
8for video in item_list:
9    print(video["desc"])  # Caption
10    print(video["stats"]["playCount"])  # Lượt xem
11    print(video["video"]["playAddr"])  # URL tải video (không watermark)
12    print(video["video"]["downloadAddr"])  # URL tải video (có watermark)

Bước 5: Lấy URL tải video.

Trường playAddr thường cung cấp phiên bản video sạch hơn (thường không có watermark TikTok), còn downloadAddr là bản có watermark tiêu chuẩn. Cả hai đều là URL trực tiếp tới file .mp4 — nhưng để tải xuống bạn cần header phù hợp (sẽ đề cập ở phần download bên dưới).

Lúc này bạn đã có một danh sách các đối tượng metadata video, mỗi đối tượng chứa caption, stats, thời gian tạo, hashtag (trong challenges[]textExtra), và URL video trực tiếp.

Hạn Chế Của Cách Dùng JSON Ẩn

  • Chỉ lấy dữ liệu của lần tải trang đầu tiên — thường là khoảng 30 video đầu tiên trên profile
  • Không xử lý được infinite scroll hay phân trang (không có "trang kế tiếp" để gọi)
  • Nếu TikTok đổi id của script tag hoặc cấu trúc JSON, parser sẽ hỏng (điều này xảy ra định kỳ — giúp phát hiện sớm)
  • Phù hợp nhất cho: scrape profile nhanh, lấy dữ liệu một lần, hoặc khi bạn chỉ cần các video mới nhất

Phương Pháp 2: Scrape Video TikTok Qua API Nội Bộ

Frontend của TikTok không tải tất cả video cùng lúc — nó gọi các endpoint API nội bộ qua XHR khi bạn cuộn trang. Endpoint chính cho video của user là /api/post/item_list/. Bạn có thể gọi endpoint này trực tiếp từ Python, từ đó lấy phân trang theo cursor và truy cập toàn bộ video trên profile, không chỉ trang đầu.

Cách Tìm Endpoint API Nội Bộ

Mở Chrome DevTools ở trang profile TikTok, vào tab Network, lọc theo XHR, rồi cuộn xuống. Bạn sẽ thấy các request tới URL như:

1https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...

Các tham số quan trọng là:

  • secUid — mã định danh duy nhất của profile (bạn có thể lấy từ JSON ở Phương pháp 1, trong userInfo.user.secUid)
  • cursor — vị trí phân trang (bắt đầu từ 0, mỗi response trả về cursor tiếp theo)
  • count — số lượng item mỗi trang (thường là 30–35)

Từng Bước: Gọi API Nội Bộ TikTok Bằng Python

Bước 1: Lấy secUid của profile mục tiêu.

Bạn có thể lấy từ JSON ẩn (Phương pháp 1) hoặc từ HTML của trang profile.

Bước 2: Tạo và gửi request tới API.

1import requests
2import json
3sec_uid = "MS4wLjABAAAA..."  # Từ Phương pháp 1
4api_url = "https://www.tiktok.com/api/post/item_list/"
5params = {
6    "aid": "1988",
7    "secUid": sec_uid,
8    "count": 35,
9    "cursor": 0,
10}
11headers = {
12    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; Gecko/20100101 Firefox/124.0",
13    "Referer": "https://www.tiktok.com/",
14}
15resp = requests.get(api_url, params=params, headers=headers)
16data = resp.json()

Bước 3: Phân tích response.

Mỗi item trong data["itemList"] đều chứa cấu trúc video giống Phương pháp 1 — desc, stats, video.playAddr, video.downloadAddr, v.v.

Bước 4: Duyệt qua toàn bộ video bằng phân trang.

1all_videos = []
2cursor = 0
3has_more = True
4while has_more:
5    params["cursor"] = cursor
6    resp = requests.get(api_url, params=params, headers=headers)
7    data = resp.json()
8    items = data.get("itemList", [])
9    all_videos.extend(items)
10    has_more = data.get("hasMore", False)
11    cursor = data.get("cursor", 0)
12    print(f"Fetched {len(items)} videos, total: {len(all_videos)}, hasMore: {has_more}")
13print(f"Total videos scraped: {len(all_videos)}")

Mỗi vòng lặp sẽ trả về lô video tiếp theo và một cursor mới. Vòng lặp tiếp tục cho đến khi hasMoreFalse.

Hạn Chế Của Phương Pháp API Nội Bộ

  • TikTok thay đổi các endpoint và tham số yêu cầu rất thường xuyên — đây là phương pháp phải bảo trì nhiều nhất. Trong vài tháng gần đây, một số request bắt đầu yêu cầu msToken, X-Bogus hoặc các tham số signature khác do của TikTok tạo ra (nói ngắn gọn: mô phỏng lại trong Python thuần không hề đơn giản).
  • Có thể cần session cookie hoặc token bổ sung cho một số loại dữ liệu
  • Vẫn chịu giới hạn tốc độ theo IP — nên dùng proxy rotation
  • Nếu bạn bắt đầu nhận về mảng itemList rỗng, nhiều khả năng msToken đã cũ (nó xoay vòng khoảng 10 giây một lần trong trình duyệt)
  • Phù hợp nhất cho: trích xuất dữ liệu hàng loạt khi bạn cần toàn bộ video từ một profile và giới hạn của Phương pháp 1 chỉ lấy trang đầu là không đủ

Phương Pháp 3: Scrape Video TikTok Bằng Playwright (Tự Động Hóa Trình Duyệt)

Khi hai cách đầu gặp tường — yêu cầu đăng nhập, CAPTCHA, hoặc tham số signature mà bạn không thể tái tạo — Playwright là phương án dự phòng. Nó khởi chạy một trình duyệt thật (headless), truy cập TikTok như một người dùng bình thường, và có thể xử lý render JavaScript, infinite scroll, thậm chí cả session đã đăng nhập.

Cài Đặt Playwright Cho Việc Scrape TikTok

Cài Playwright và bộ browser binary của nó:

1pip install playwright
2playwright install firefox

Tôi khuyên dùng Firefox thay vì Chromium khi scrape TikTok. Thử nghiệm từ cộng đồng cho thấy với Firefox, và hệ thống chống bot của TikTok đặc biệt khắt khe với các headless browser dựa trên Chromium.

Để tăng mức độ ẩn danh, bạn có thể kết hợp Playwright với (một bản fork đã chỉnh sửa của Playwright) hoặc (Firefox được chỉnh sửa ở mức C++ để chống phát hiện). Theo , Camoufox đạt điểm stealth gần như tối đa trước các dịch vụ phát hiện bot lớn.

Từng Bước: Scrape Video Profile TikTok Với Playwright

Bước 1: Khởi chạy trình duyệt Firefox headless và truy cập profile.

1import asyncio
2from playwright.async_api import async_playwright
3import json
4async def scrape_tiktok_profile(username):
5    async with async_playwright() as p:
6        browser = await p.firefox.launch(headless=True)
7        context = await browser.new_context(
8            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
9            viewport={"width": 1280, "height": 720},
10        )
11        page = await context.new_page()
12        await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")

Bước 2: Chờ lưới video tải xong.

1        # Chờ các video xuất hiện
2        await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

Nếu TikTok hiện overlay "Something went wrong", có thể bạn cần nhấn nút thử lại:

1        retry_btn = page.locator('button:has-text("Retry")')
2        if await retry_btn.count() &gt; 0:
3            await retry_btn.click()
4            await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

Bước 3: Lấy dữ liệu từ JSON ẩn (ngay cả khi dùng Playwright).

Cách đáng tin nhất vẫn là lấy JSON hydration, ngay cả khi đang dùng trình duyệt:

1        script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
2        raw_json = await script_el.inner_text()
3        data = json.loads(raw_json)
4        # Đi theo cùng cấu trúc JSON như Phương pháp 1
5        user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
6        videos = user_detail.get("itemList", [])

Bước 4: Xử lý infinite scroll để lấy thêm video.

Nếu bạn cần nhiều hơn khoảng 30 video đầu tiên, hãy cuộn xuống và bắt các response XHR bổ sung:

1        all_videos = list(videos)
2        # Chặn response API khi cuộn
3        api_responses = []
4        async def capture_response(response):
5            if "/api/post/item_list" in response.url:
6                try:
7                    body = await response.json()
8                    api_responses.append(body)
9                except:
10                    pass
11        page.on("response", capture_response)
12        # Cuộn xuống để kích hoạt tải thêm
13        for _ in range(5):  # Điều chỉnh số lần cuộn tùy nhu cầu
14            await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
15            await asyncio.sleep(2)
16        # Gom video từ các response đã bắt được
17        for api_resp in api_responses:
18            items = api_resp.get("itemList", [])
19            all_videos.extend(items)
20        print(f"Total videos: {len(all_videos)}")
21        await browser.close()
22        return all_videos
23# Chạy thử
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))

Lúc này bạn sẽ có danh sách video từ cả lần tải trang đầu tiên và các trang bổ sung được nạp qua thao tác cuộn.

Hạn Chế Của Phương Pháp Playwright

  • Là phương pháp chậm nhất trong ba cách (render đầy đủ trang, round-trip mạng, thời gian chờ cuộn)
  • Tốn nhiều tài nguyên hơn — mỗi browser instance dùng đáng kể RAM và CPU
  • Vẫn có thể bị chặn theo IP khi chạy ở quy mô lớn — nên kết hợp proxy rotation
  • Phù hợp nhất cho: tương tác phức tạp, nội dung có tường đăng nhập, xử lý CAPTCHA, hoặc khi Phương pháp 1 và 2 bị chặn

Cách Tải Xuống Video TikTok (.mp4) Bằng Python

Đây là phần lấp khoảng trống lớn nhất trong hầu hết các hướng dẫn scrape TikTok khác. Lấy metadata rất hữu ích, nhưng đa số người tìm "scrape TikTok videos" lại muốn file video thực tế.

TikTok nhúng URL tải xuống trong đối tượng dữ liệu video:

  • playAddr — thường là phiên bản không watermark hoặc watermark thấp hơn
  • downloadAddr — phiên bản TikTok dùng cho tải trong app (có watermark TikTok overlay)

Cả hai URL này đều có thời hạn, thường chỉ dùng được trong một khoảng ngắn (thường là vài giờ), nên bạn cần tải xuống ngay sau khi trích xuất.

Từng Bước: Tải Xuống File Video TikTok

Bước 1: Trích xuất URL video từ bất kỳ phương pháp nào ở trên.

1video_url = video["video"]["playAddr"]  # Phiên bản không watermark
2# hoặc
3video_url = video["video"]["downloadAddr"]  # Có watermark

Bước 2: Gửi GET request với header phù hợp.

Đây là bước dễ khiến mọi người gặp lỗi. Nếu bạn chỉ requests.get(video_url), rất có thể sẽ nhận lỗi 403. TikTok kiểm tra header Referer và mong đợi một User-Agent giống trình duyệt.

1import requests
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
4    "Referer": "https://www.tiktok.com/",
5}
6resp = requests.get(video_url, headers=headers, stream=True)

Bước 3: Ghi nội dung response ra file .mp4.

Dùng stream=True và ghi theo từng chunk — video TikTok có thể khá lớn, và bạn không muốn nạp toàn bộ file vào bộ nhớ:

1video_id = video["id"]
2filename = f"tiktok_{video_id}.mp4"
3with open(filename, "wb") as f:
4    for chunk in resp.iter_content(chunk_size=1024 * 1024):  # 1MB mỗi chunk
5        if chunk:
6            f.write(chunk)
7print(f"Downloaded: {filename}")

Bây giờ bạn đã có một file .mp4 có thể phát được trên máy của mình.

Tải Có Watermark Hay Không Watermark

TikTok lưu cả phiên bản có watermark và không watermark cho mỗi video. URL playAddr thường cung cấp phiên bản sạch hơn (phiên bản mà trình phát sử dụng), còn downloadAddr sẽ chứa watermark TikTok với tên người tạo.

Một lưu ý về đạo đức ở đây: watermark tồn tại để ghi công creator. Nếu bạn tải video để nghiên cứu, phân tích hoặc xem nội bộ, dùng playAddr thường là chấp nhận được. Nhưng nếu bạn định phân phối lại hoặc đăng lại nội dung, việc gỡ bỏ ghi nhận tác giả có thể dẫn đến cả vấn đề đạo đức lẫn bản quyền. Tôi sẽ nói kỹ hơn ở phần pháp lý bên dưới.

Nếu muốn một pipeline tải xuống mạnh mẽ hơn, bạn có thể cân nhắc — trình trích xuất TikTok của nó tự xử lý logic signature và giải quyết URL, nên bạn không phải tự quản lý header và thời hạn token.

So Sánh Trực Tiếp: Nên Dùng Phương Pháp Python Nào?

Đây là bảng so sánh mà tôi ước mình đã có khi bắt đầu các dự án scrape TikTok:

| Tiêu chí | Phương pháp 1: JSON ẩn | Phương pháp 2: API nội bộ | Phương pháp 3: Playwright | |---|---|---|---| | Độ khó | Người mới | Trung cấp | Trung cấp | | Tốc độ | Nhanh (1 request mỗi trang) | Nhanh (JSON API) | Chậm (render full page) | | Khả năng chống bot | Trung bình | Thấp (endpoint thay đổi) | Cao (mô phỏng browser thật) | | Tải được video .mp4? | Có (lấy playAddr) | Có (URL trong response) | Có (bắt network) | | Xử lý infinite scroll | Không (chỉ trang đầu) | Có (cursor pagination) | Có (mô phỏng cuộn trang) | | Có cần proxy khi scale lớn | Có | Có | Có | | Mức bảo trì | Trung bình (JSON thay đổi) | Cao (endpoint/signature đổi thường xuyên) | Thấp-Trung bình (browser thích ứng tốt hơn) | | Phù hợp nhất | Scrape profile nhanh, một lần | Trích xuất hàng loạt, lấy tất cả video | Nội dung có tường đăng nhập hoặc phức tạp |

Khuyến nghị của tôi:

  • Chỉ cần một ảnh chụp nhanh nhanh của một profile? Bắt đầu với Phương pháp 1. Thiết lập mất khoảng 30 giây và trả dữ liệu trong chưa đầy một giây mỗi trang.
  • Cần toàn bộ video của một profile có phân trang? Phương pháp 2 là lựa chọn hợp lý, nhưng hãy chuẩn bị tinh thần bảo trì khi TikTok đổi tham số API.
  • Gặp tường đăng nhập, CAPTCHA, hoặc cần độ bền tối đa? Dùng Phương pháp 3 với Playwright. Chậm hơn và nặng hơn, nhưng TikTok khó chặn hơn nhiều.

Trong thực tế, tôi thường bắt đầu với Phương pháp 1 và chỉ chuyển sang Phương pháp 2 hoặc 3 khi gặp giới hạn. Như vậy hạ tầng sẽ đơn giản hơn và chi phí thấp hơn.

Không Cần Python? Scrape Video TikTok Bằng Công Cụ No-Code

Rất nhiều người tìm kiếm "scrape TikTok videos with Python" thực ra không cần Python. Họ cần dữ liệu. Nếu bạn là marketing analyst muốn lấy metadata video từ vài profile đối thủ, hoặc brand manager đang theo dõi lượt nhắc đến thương hiệu, thì việc dựng môi trường Python, xoay proxy và xử lý signature là quá mức cần thiết.

python-vs-nocode-ai-comparison.webp

Dưới đây là so sánh thực tế giữa các cách tiếp cận:

| Cách tiếp cận | Trình độ cần có | Chi phí | Bảo trì | Phù hợp nhất | |---|---|---|---|---| | Python (tự làm) | Trung cấp trở lên | Miễn phí (+ chi phí proxy) | Cao (script dễ hỏng) | Kiểm soát toàn diện, pipeline tùy chỉnh | | (tiện ích Chrome) | Người mới | Có gói miễn phí | Không cần (AI đọc trang mới mỗi lần) | Trích xuất dữ liệu video nhanh, xuất sang Sheets/Excel | | Apify TikTok Scraper | Người mới | Trả phí (theo lần chạy) | Thấp (Apify bảo trì) | Chạy tự động hàng loạt theo lịch | | TikAPI | Developer | Trả phí thuê bao | Trung bình | Xây app trên dữ liệu TikTok |

Thunderbit Xử Lý Scrape TikTok Như Thế Nào?

là AI web scraper do Thunderbit xây dựng, và nó hoạt động khác với các công cụ scrape truyền thống. Thay vì dựa vào CSS selector hay XPath được định nghĩa sẵn (thứ sẽ hỏng ngay khi TikTok đổi bố cục), AI của Thunderbit đọc cấu trúc trang mới mỗi lần và đề xuất các cột phù hợp — caption, lượt thích, hashtag, URL video, tác giả, v.v.

Quy trình thực sự chỉ có hai bước nhấp chuột:

  1. Mở profile TikTok trong Chrome, nhấn tiện ích Thunderbit, rồi chọn "AI Suggest Fields." Thunderbit sẽ quét trang và đề xuất cấu trúc bảng.
  2. Kiểm tra các cột được gợi ý, chỉnh nếu cần, rồi nhấn "Scrape."

Dữ liệu được xuất trực tiếp sang Google Sheets, Excel, Airtable hoặc Notion. Không cần tự quản lý CSS selector, không cần debug code, không cần cấu hình proxy. Với một marketing analyst cần metadata video từ vài profile, cách này nhanh hơn đáng kể so với việc tự dựng môi trường Python — và nó không bị hỏng khi TikTok cập nhật frontend (theo phản ánh từ cộng đồng, điều này xảy ra vài tuần một lần).

Thunderbit cũng hỗ trợ — tức là có thể vào từng trang video riêng lẻ để làm giàu bảng dữ liệu với các thông tin như tổng số bình luận, thông tin nhạc, hoặc thời lượng video.

Bạn có thể dùng thử miễn phí qua . Để hiểu rõ hơn cách hoạt động, hãy xem của chúng tôi.

Các Ranh Giới Pháp Lý và Đạo Đức Khi Scrape TikTok

Không có bài hướng dẫn nào trong top kết quả tìm kiếm nói về tính hợp pháp, và đó là một thiếu sót đáng chú ý, nhất là khi TikTok đã chủ động theo đuổi các vụ kiện chống lại dịch vụ scraping. Đây là điều bạn cần biết.

Điều khoản dịch vụ của TikTok (§ 4.1) cấm rõ việc truy cập tự động. Vi phạm TOS là vi phạm hợp đồng, không phải tội hình sự — nhưng có thể dẫn đến khóa tài khoản, chặn IP, hoặc kiện dân sự.

Bức tranh pháp lý lại cởi mở hơn nhiều người nghĩ khi làm việc với dữ liệu công khai. Án lệ nổi bật là Meta Platforms v. Bright Data (N.D. Cal., tháng 1/2024), trong đó tòa xác định rằng việc scrape dữ liệu công khai khi đã đăng xuất không vi phạm Terms of Service của Meta. Meta đã rút vụ kiện và từ bỏ quyền kháng cáo. Trước đó, phán quyết hiQ v. LinkedIn ở Tòa phúc thẩm Khu vực 9 (được tái khẳng định sau Van Buren) xác lập rằng scraping dữ liệu công khai không phải vi phạm CFAA — dù cuối cùng hiQ vẫn dàn xếp, trả 500.000 USD và chấp nhận lệnh cấm vĩnh viễn, cho thấy việc thực thi TOS vẫn có thể gây rủi ro.

GDPR và CCPA áp dụng nếu bạn thu thập dữ liệu cá nhân từ người dùng EU hoặc California. Scrape bài đăng công khai là một chuyện; xây dựng cơ sở dữ liệu thông tin cá nhân của từng người dùng lại là chuyện khác.

Nguyên tắc thực tế:

  • Giới hạn tốc độ request của bạn (đừng spam server TikTok)
  • Đừng scrape tài khoản riêng tư hoặc nội dung của trẻ vị thành niên
  • Đừng phân phối lại nội dung video có bản quyền cho mục đích thương mại
  • Tôn trọng robots.txt (TikTok chặn phần lớn hoạt động crawl tự động)
  • Tải video cho nghiên cứu hoặc phân tích cá nhân khác với việc đăng lại chúng — hãy phân biệt rõ

Lưu ý: Đây là nội dung mang tính giáo dục, không phải tư vấn pháp lý. Nếu bạn đang xây dựng sản phẩm thương mại dựa trên dữ liệu TikTok đã scrape, hãy hỏi ý kiến luật sư.

Kết Lại: Những Điểm Chính Cần Nhớ

Scrape TikTok trong năm 2025 là một mục tiêu luôn thay đổi. Hệ thống chống bot của nền tảng này thuộc nhóm tinh vi nhất trên web, và những cách làm ngây thơ (plain requests, đoạn code do ChatGPT tạo, tutorial cũ) sẽ thất bại. Nhưng với đúng phương pháp, việc này hoàn toàn làm được.

Điều bạn nên ghi nhớ:

  • Phương pháp 1 (JSON ẩn) là nhanh và đơn giản nhất — hãy bắt đầu ở đây nếu bạn chỉ cần scrape nhanh profile.
  • Phương pháp 2 (API nội bộ) cho phép phân trang và lấy dữ liệu hàng loạt, nhưng cần bảo trì nhiều nhất vì endpoint và yêu cầu signature thay đổi thường xuyên.
  • Phương pháp 3 (Playwright) có khả năng chống lại các biện pháp anti-bot tốt nhất, đổi lại là tốc độ chậm và tốn tài nguyên hơn.
  • Cả ba phương pháp đều có thể trích xuất URL tải video — và đây là hướng dẫn duy nhất chỉ bạn cách tải file .mp4 thực tế với header đúng.
  • Với người không rành kỹ thuật, mang đến con đường nhanh hơn hẳn để lấy cùng dữ liệu mà không cần viết hay bảo trì code. Cách tiếp cận dựa trên AI giúp nó không bị hỏng khi TikTok đổi bố cục — điều mà theo phản ánh của cộng đồng, xảy ra thường xuyên hơn ai cũng mong muốn.

Nếu bạn muốn bắt đầu mà không cần cài Python, hãy — gói miễn phí đủ để thử trên vài profile và xem nó có phù hợp workflow của bạn không. Nếu đi theo hướng Python, hãy bắt đầu với Phương pháp 1, kiểm tra dữ liệu, rồi mở rộng sau.

Muốn tìm hiểu sâu hơn về kỹ thuật web scraping? Hãy xem các hướng dẫn của chúng tôi về , , và .

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

Có hợp pháp khi scrape video TikTok bằng Python không?

Scrape dữ liệu công khai là vùng xám pháp lý, không phải vi phạm trắng đen rõ ràng. Phán quyết Meta v. Bright Data (2024) ủng hộ quan điểm rằng việc scrape dữ liệu công khai khi đã đăng xuất không vi phạm Terms of Service của nền tảng. Tuy nhiên, TOS của TikTok cấm rõ việc truy cập tự động, và GDPR/CCPA cũng áp dụng với dữ liệu cá nhân. Điều này không “bất hợp pháp” theo cách nhiều người lo sợ, nhưng cũng không hề không có rủi ro. Hãy hỏi chuyên gia pháp lý cho trường hợp cụ thể của bạn.

Thư viện Python nào tốt nhất để scrape TikTok?

Tùy vào cách bạn làm. Với trích xuất JSON ẩn (Phương pháp 1), chỉ cần requests + beautifulsoup4. Với gọi API nội bộ (Phương pháp 2), requests hoặc httpx đều ổn. Với tự động hóa trình duyệt (Phương pháp 3), playwright hiện là tiêu chuẩn phổ biến nhất — nó đã vượt qua Selenium trong các dự án scraping mới, với so với khoảng 53 triệu của Selenium. Wrapper TikTok-Api (khoảng 6,3K sao GitHub) cũng đáng cân nhắc nếu bạn muốn giao diện cấp cao hơn, dù nó có thể khá dễ vỡ.

Có thể tải video TikTok không watermark bằng Python không?

Có. Dữ liệu gốc của TikTok có URL playAddr thường cung cấp phiên bản video không có watermark tiêu chuẩn. Hướng dẫn này chỉ bạn cách lấy URL đó từ cả ba phương pháp và tải file .mp4 với header phù hợp. Trong khi đó, trường downloadAddr sẽ bao gồm watermark.

Vì sao scraper TikTok của tôi trả về dữ liệu trống?

Nguyên nhân phổ biến nhất là TikTok cần JavaScript để render nội dung. Một requests.get() cơ bản chỉ lấy phần HTML khung — dữ liệu thật либо nằm trong thẻ script JSON ẩn (Phương pháp 1) hoặc được tải động bằng JavaScript (Phương pháp 3). Nếu bạn nhận HTML trống, hãy thử Phương pháp 1 trước. Nếu vẫn không được, kiểm tra header của bạn (thiếu Referer là nguyên nhân số 1 gây lỗi 403) hoặc chuyển sang Phương pháp 3 với Playwright.

Làm sao để tránh bị chặn khi scrape TikTok?

Dùng header trình duyệt giống thật (bao gồm User-Agent, Referer, và Accept-Language), xoay vòng proxy residential hoặc mobile (IP datacenter thường bị gắn cờ trong vài phút), thêm độ trễ ngẫu nhiên giữa các request (ít nhất 1–3 giây), và tránh scrape với lưu lượng quá cao. Phương pháp 3 (Playwright) có khả năng chống chặn tốt nhất vì mô phỏng phiên trình duyệt thật. Nếu chạy ở quy mô nghiêm túc, hãy tính luôn chi phí proxy — proxy residential gói cơ bản thường khoảng từ các nhà cung cấp lớn.

Dùng thử Thunderbit cho việc scrape TikTok
Shuai Guan
Shuai Guan
Co-founder/CEO @ Thunderbit. Passionate about cross section of AI and Automation. He's a big advocate of automation and loves making it more accessible to everyone. Beyond tech, he channels his creativity through a passion for photography, capturing stories one picture at a time.
Topics
Scrape Tiktok pythonTiktok data extraction pythonPython Tiktok scraper scriptHow to scrape Tiktok videos with python
Mục lục

Thử Thunderbit

Trích xuất lead và dữ liệu khác chỉ với 2 cú nhấp. Được hỗ trợ bởi AI.

Nhận Thunderbit 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
PRODUCT HUNT#1 Product of the Week