Tìm Hiểu Cách Scrape Video TikTok Bằng Python

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

Hiện giờ TikTok có khoảng và ước tính mỗi ngày có tới 23 triệu video được đăng lên. Nếu bạn từng thử gom dữ liệu chỉ từ một lát rất nhỏ trong dòng nội dung khổng lồ này, chắc chắn bạn sẽ hiểu cảm giác “đuối sức” nó ra sao.

Thường thì hành trình sẽ diễn ra kiểu này: bạn gõ “scrape TikTok videos with Python,” copy một đoạn code từ bài hướng dẫn nào đó (hoặc nhờ ChatGPT viết giúp), chạy thử rồi nhận lại… chẳng có gì. HTML trống trơn. Lỗi 403. Hoặc dòng thông báo đáng sợ “Process finished with exit code 0” nhưng không có kết quả nào cả. Tôi đã thấy vòng lặp này lặp đi lặp lại trong vô số issue trên GitHub và thread trên Reddit, nên mới viết bài này. Ở đây, chúng ta sẽ đi qua 3 phương pháp Python thực sự còn hoạt động trong năm 2025, hướng dẫn đầy đủ để tải chính file video .mp4 (không chỉ metadata — thứ mà phần lớn bài viết 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 muố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.

“Scrape TikTok Videos” Thực Sự Nghĩa Là Gì?

Trước khi vào code, cần làm rõ người ta thường muốn nói gì khi nhắc tới “scrape TikTok videos” — vì cụm này thực ra có hai việc hoàn toàn 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à đa số tutorial tập trung vào.
  2. Tải về chính file video (.mp4): Lưu video xuống máy của bạn. Đây mới là thứ mà phần lớn người dùng thật sự muốn khi gõ “scrape TikTok videos” — và cũng là phần gần như không ai hướng dẫn trọn vẹn.

Hướng dẫn này sẽ bao gồm 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 để bạn lưu file .mp4.

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

Với và TikTok Shop tạo ra , giá trị kinh doanh của 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 thường xuyên nhất:

Trường hợp sử dụngDữ liệu bạn sẽ scrapeAi cần dùng
Nghiên cứu influencer & marketingTỷ lệ tương tác, số follower, định dạng nội dung, hiệu quả hashtagĐội marketing, agency
Chiến lược nội dungHashtag đang trend, format video viral, tần suất đăng bàiCreator, social media manager
Giám sát thương hiệuLượt nhắc đến, độ phủ chiến dịch, cảm nhận của khán giảBrand manager, đội PR
Phân tích đối thủHiệu suất video của đối thủ, mẫu quảng cáo, listing TikTok ShopE-commerce, đội sản phẩm
Nghiên cứu thị trườngXu hướng mới nổi, hành vi người xem, khám phá sản phẩmNhà phân tích, quỹ đầu tư, công ty nghiên cứu
Lưu trữ & tuân thủFile video phục vụ kiểm tra nội bộ hoặc lưu hồ sơPháp chế, compliance, agency

Tác động thương mại là rất rõ: 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 làm affiliate tạo ra ở các nhóm sản phẩm hàng đầu trên TikTok Shop. Nếu bạn làm trong thương mại điện tử hoặc marketing influencer, dữ liệu này có giá trị tiền tệ trực tiếp.

Vì Sao Code Python Cơ Bản Của Bạn Không Hoạt Động Với TikTok

Nếu bạn đã thử kiểu này mà vẫn không ra gì, 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# ...và rồi HTML chẳng có gì hữu ích cả

Lý do rất đơn giản: TikTok là một trong những nền tảng khó scrape nhất. Một lệnh 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 có một lớp chống bot rất mạnh, gồm phát hiện hành vi, TLS fingerprinting, để tạo request signature, và CSS selector động thay đổi liên tục.

tiktok-anti-bot-wall.webp

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

Dưới đây là bảng chẩn đoán nhanh để bạn nhận diện vấn đề và chọn đúng phương pháp:

Triệu chứngNguyên nhân có khả năng nhấtPhương pháp khắc phục
HTML trống / không có dữ liệuNội dung được render bằng JS; requests không chạy JavaScriptPhương pháp 1 (Hidden JSON) hoặc Phương pháp 3 (Playwright)
403 / Access DeniedThiếu hoặc sai headers; bị phát hiện là botPhương pháp 1 với headers đúng
Lúc đầu chạy được, sau đó dừngBị giới hạn tốc độ / chặn IPLuân phiên proxy (mọi phương pháp)
Xuất hiện login wallCần session/cookiePhương pháp 3 (trình duyệt với session đã lưu)
Code do ChatGPT tạo ra không trả gìCấu trúc TikTok đã đổi so với dữ liệu huấn luyện của mô hìnhCả 3 phương pháp (cập nhật theo thời gian thực)

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

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

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

  1. Trích xuất Hidden JSON — 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. TikTok Internal API — Gọi trực tiếp endpoint không được tài liệu hóa /api/post/item_list/ để 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 với Playwright — Render trang trong trình duyệt headless để xử lý infinite scroll, nội dung động và login wall.

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

Phương Pháp 1: Scrape Video TikTok Bằng Hidden JSON (Phù Hợp Cho Người Mới)

Đây là cách tôi khuyên bạn nên bắt đầu. TikTok nhúng một khối JSON rất lớn trong thẻ <script> với id __UNIVERSAL_DATA_FOR_REHYDRATION__ trên gần như mọi trang. Khối này chứa toàn bộ dữ liệu profile và video mà JavaScript phía giao diện sẽ render — nghĩa là bạn chỉ cần một HTTP request là lấy được, không cần trình duyệt.

Bạn Cần Gì

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

Cài thư viện:

1pip install requests beautifulsoup4

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

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

Đây là chỗ nhiều người mới hay vấp. Nếu bạn chỉ gửi requests.get() trần trụi mà không có headers, TikTok thường trả về 403 hoặc một trang CAPTCHA. Tối thiểu bạn cần User-Agent mớ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 thẻ script 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, rất có thể TikTok đã chặn bạn (hãy kiểm tra status code) hoặc họ đã đổi id của thẻ này (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 qua cấu trúc JSON để lấy metadata video.

Dữ liệu nằm sâu 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: Trích xuất URL tải video.

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

Bây giờ bạn sẽ có danh sách object metadata của video, mỗi object gồm caption, thống kê, thời gian tạo, hashtag (trong challenges[]textExtra), và URL video trực tiếp.

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

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

Phương Pháp 2: Scrape Video TikTok Qua Internal API

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

Cách Tìm Endpoint Internal API

Mở Chrome DevTools trên 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 — ID 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)

Hướng Dẫn Từng Bước: Query Internal API Của TikTok Bằng Python

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

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

Bước 2: Tạo và gửi request 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) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
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 có 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 phân trang qua toàn bộ video.

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ề một batch mới cùng cursor mới. Vòng lặp tiếp tục cho đến khi hasMoreFalse.

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

  • TikTok đổi endpoint và tham số yêu cầu rất thường xuyên — đây là phương pháp cần bảo trì nhiều nhất. Trong những tháng gần đây, một số request bắt đầu cần msToken, X-Bogus, hoặc các tham số chữ ký khác do của TikTok tạo ra (nghĩa là: mô phỏng lại bằng Python thuần không hề đơn giản).
  • Có thể cần cookie phiên đăng nhập 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, rất có thể msToken đã cũ (nó thay đổi khoảng mỗi 10 giây 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 của profile và giới hạn chỉ lấy trang đầu của Phương pháp 1 là chưa đủ

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

Khi hai phương pháp đầu gặp rào cản — yêu cầu đăng nhập, CAPTCHA, hoặc các tham số signature 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ư người dùng bình thường, và có thể xử lý render JavaScript, infinite scroll, thậm chí cả session đã xác thực.

Cài Đặt Playwright Để Scrape TikTok

Cài Playwright và các gói browser binary:

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 phát hiện bot của TikTok đặc biệt gắt với các headless browser dựa trên Chromium.

Để tăng mức “ẩn mình”, bạn có thể kết hợp Playwright với (một bản fork đã vá của Playwright) hoặc (Firefox được chỉnh sửa ở mức C++ để chống phát hiện). Trong , 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.

Hướng Dẫn Từng Bước: Scrape Video Profile TikTok Bằng Playwright

Bước 1: Khởi chạy 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ờ video item xuất hiện
2        await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

Nếu TikTok hiện lớp phủ “Something went wrong”, bạn có thể cần bấm 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: Trích xuất dữ liệu từ hidden JSON (ngay cả khi dùng Playwright).

Cách ổn định nhất vẫn là lấy JSON hydration, kể 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ều hướng JSON giống 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, 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 trong lúc 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        # Thu thập 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"))

Bây giờ bạn sẽ có danh sách object video từ cả lần tải trang đầu và các trang bổ sung được load khi cuộn.

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

  • Chậm nhất trong ba cách (render đầy đủ trang, round-trip mạng, chờ cuộn trang)
  • Tốn tài nguyên cao hơn — mỗi browser instance dùng khá nhiều CPU và bộ nhớ
  • Vẫn có thể bị chặn theo IP ở 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 bị chặn sau đăng nhập, xử lý CAPTCHA, hoặc khi Phương pháp 1 và 2 đều bị chặn

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

Đây là phần mà hầu hết tutorial scrape TikTok khác bỏ qua nhiều nhất. Trích xuất metadata thì hữu ích, nhưng phần lớn người tìm “scrape TikTok videos” thật ra muốn file video thực tế.

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

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

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

Hướng Dẫn Từng Bước: Tải File Video TikTok

Bước 1: Trích xuất URL video từ một trong ba phương pháp ở 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 request GET với headers phù hợp.

Đây là bước dễ lỗi nhất. Nếu bạn chỉ requests.get(video_url), gần như chắc sẽ gặp 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 phần — video TikTok có thể khá lớn, nên đừng nạp cả 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):  # Từng khối 1MB
5        if chunk:
6            f.write(chunk)
7print(f"Downloaded: \{filename\}")

Lúc này bạn sẽ có một file .mp4 có thể phát được trên máy của mình.

So Sánh Download Có Watermark Và Không Watermark

TikTok lưu cả hai phiên bản video: có watermark và không watermark. URL playAddr thường trả về phiên bản sạch hơn (phiên bản mà player dùng), còn downloadAddr sẽ có watermark TikTok cùng username của creator.

Một lưu ý về đạo đức: watermark dùng để ghi nhận tác giả. Nếu bạn tải video để nghiên cứu, phân tích hoặc xem nội bộ, việc dùng playAddr thường là phù hợp. Nhưng nếu bạn phân phối lại hoặc đăng lại nội dung, việc gỡ attribution của creator có thể kéo theo 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 bạn muốn một pipeline tải xuống ổn định hơn, hãy cân nhắc — extractor TikTok của nó tự xử lý signature math và giải URL, nên bạn không cần tự quản lý header và thời hạn token.

So Sánh Trực Diện: 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: Hidden JSONPhương pháp 2: Internal APIPhương pháp 3: Playwright
Độ khóNgười mớiTrung cấpTrung cấp
Tốc độNhanh (1 request/trang)Nhanh (JSON API)Chậm (render đầy đủ trang)
Khả năng chống botTrung bìnhThấp (endpoint thay đổi)Cao (mô phỏng trình duyệt thật)
Tải được video .mp4?Có (trích xuất playAddr)Có (URL trong response)Có (bắt network)
Xử lý infinite scrollKhông (chỉ trang đầu)Có (cursor pagination)Có (mô phỏng cuộn trang)
Cần proxy khi ở quy mô lớn
Mức bảo trìTrung bình (JSON structure thay đổi)Cao (endpoint/signature đổi thường xuyên)Thấp-Trung bình (trình duyệt thích nghi)
Phù hợp nhất choScrape nhanh một profileTrích xuất hàng loạt, lấy toàn bộ videoNội dung phức tạp hoặc bị chặn sau đăng nhập

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

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

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

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

Rất nhiều người tìm “scrape TikTok videos with Python” nhưng thực ra không cần Python. Họ cần dữ liệu. Nếu bạn là nhà phân tích marketing muốn lấy metadata video từ vài profile đối thủ, hoặc là brand manager theo dõi lượt nhắc đến, việc dựng môi trường Python cùng proxy rotation và xử lý signature là hơi quá tay.

python-vs-nocode-ai-comparison.webp

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

Phương ánTrình độ cần cóChi phíBảo trìPhù hợp nhất cho
Python (tự làm)Trung cấp trở lênMiễn phí (+ chi phí proxy)Cao (script dễ hỏng)Kiểm soát toàn diện, pipeline tùy chỉnh
Thunderbit (tiện ích Chrome)Người mớiCó gói miễn phíGần như không cần (AI đọc lại trang mỗi lần)Lấy dữ liệu video nhanh, xuất sang Sheets/Excel
Apify TikTok ScraperNgười mớiTrả phí (theo lần chạy)Thấp (được Apify bảo trì)Chạy tự động số lượng lớn theo lịch
TikAPINhà phát triểnTrả phí theo góiTrung bìnhXây ứng dụng dựa 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 selector CSS hoặc quy tắc XPath dựng sẵn — vốn sẽ hỏng mỗi khi TikTok đổi giao diện — AI của Thunderbit sẽ đọc lại cấu trúc trang từ đầu mỗi lần và đề xuất các cột phù hợp như caption, lượt thích, hashtag, URL video, tác giả, v.v.

Quy trình thật ra chỉ có hai cú nhấp:

  1. Mở trang profile TikTok trong Chrome, bấm extension Thunderbit, rồi chọn “AI Suggest Fields.” Thunderbit sẽ quét trang và đề xuất cấu trúc bảng.
  2. Xem lại các cột được gợi ý, chỉnh nếu cần, rồi bấm “Scrape.”

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

Thunderbit cũng hỗ trợ — nó có thể mở từng trang video riêng để bổ sung cho bảng dữ liệu các thông tin như số bình luận đầy đủ, thông tin nhạc, hoặc thời lượng video.

Bạn có thể dùng thử miễn phí qua . Nếu muốn hiểu rõ hơn cách nó hoạt động, hãy xem .

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

Không nhiều bài hướng dẫn top đầu chủ đề này thực sự bàn về tính pháp lý, và đó là một thiếu sót đáng chú ý vì TikTok đã chủ động theo đuổi các hành động pháp lý chống lại dịch vụ scrape. Dưới đây là những điều bạn cần biết.

Điều khoản dịch vụ của TikTok (§ 4.1) cấm rõ ràng 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 hành động dân sự.

Bối cảnh pháp lý hiện nay cởi mở hơn nhiều người nghĩ đối với dữ liệu công khai. Tiền lệ nổi bật là Meta Platforms v. Bright Data (N.D. Cal., tháng 1/2024), trong đó tòa cho rằng việc scrape dữ liệu công khai khi đã đăng xuất không vi phạm Điều khoản dịch vụ của Meta. Meta sau đó rút vụ kiện và từ bỏ quyền kháng cáo. Phán quyết trước đó trong vụ hiQ v. LinkedIn tại 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 việc scrape dữ liệu công khai không cấu thành vi phạm CFAA — dù cuối cùng hiQ vẫn dàn xếp, trả 500.000 USD và đồng ý lệnh cấm vĩnh viễn, cho thấy việc thực thi TOS vẫn có thể gây tác động thực tế.

GDPR và CCPA sẽ á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 chứa 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 (đừng “xả” dồn dập vào server TikTok)
  • Không scrape tài khoản riêng tư hoặc nội dung của trẻ vị thành niên
  • Không phân phối lại 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 để nghiên cứu/phân tích cá nhân là khác với việc đăng lại chúng — hãy hiểu rõ sự khác biệt

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 Luận: 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. Lớp chống bot của nền tảng này thuộc hàng tinh vi nhất trên web, và các cách làm ngây thơ (plain requests, đoạn code do ChatGPT tạo, tutorial cũ) gần như chắc chắn 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 (Hidden JSON) nhanh nhất và đơn giản nhất — hãy bắt đầu từ đây nếu chỉ cần scrape nhanh một profile.
  • Phương pháp 2 (Internal API) cho bạn phân trang và truy cập 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) bền bỉ nhất trước cơ chế chống bot, đổi lại là tốc độ và tài nguyên hệ thống.
  • Cả ba phương pháp đều có thể trích xuất URL tải video — và đây là hướng dẫn hiếm hoi chỉ cho bạn cách tải thực sự file .mp4 với headers đúng cách.
  • Với người không rành kỹ thuật, mang lại con đường nhanh hơn hẳn để lấy cùng loại 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 giao diện — điều mà theo phản hồi cộng đồng thì xảy ra khá thường xuyên.

Nếu bạn muốn bắt đầu mà không cần setup Python, hãy — gói miễn phí đủ để thử trên vài profile và xem có hợp với quy trình của bạn không. Còn 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ới mở rộng dần.

Bạn 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

Scrape video TikTok bằng Python có hợp pháp không?

Việc scrape dữ liệu công khai là một vùng xám pháp lý, không phải vi phạm rõ ràng. Phán quyết Meta v. Bright Data (2024) ủng hộ quan điểm rằng scrape dữ liệu công khai khi đã đăng xuất không vi phạm Điều khoản dịch vụ của nền tảng. Tuy nhiên, TOS của TikTok cấm rõ truy cập tự động, và nghĩa vụ GDPR/CCPA áp dụng với dữ liệu cá nhân. Nó không “bất hợp pháp” theo cách nhiều người lo, nhưng cũng không hoàn toàn an toàn. Hãy tham khảo 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?

Điều này tùy vào cách bạn chọn. Với hidden JSON extraction (Phương pháp 1), requests + beautifulsoup4 là đủ. Với gọi internal API (Phương pháp 2), requests hoặc httpx đều dùng được. Với tự động hóa trình duyệt (Phương pháp 3), playwright hiện là tiêu chuẩn — nó đã vượt Selenium về mức độ phổ biến trong các dự án scrape mới, với so với ~53 triệu của Selenium. Wrapper TikTok-Api (~6,3K sao trên GitHub) cũng đáng cân nhắc nếu bạn muốn một interface cấp cao hơn, dù nó có thể khá mong manh.

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

Có. Dữ liệu của TikTok có sẵn URL playAddr thường cho ra phiên bản video không có watermark tiêu chuẩn. Hướng dẫn này chỉ cho bạn cách trích xuất URL đó từ cả ba phương pháp và tải file .mp4 với headers phù hợp. Ngược lại, trường downloadAddr sẽ chứa 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 lệnh requests.get() cơ bản chỉ lấy phần shell HTML — dữ liệu thật либо nằm trong thẻ script JSON ẩn (Phương pháp 1) hoặc được tải động qua JavaScript (Phương pháp 3). Nếu bạn đang 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 headers của bạn (thiếu Referer là nguyên nhân số 1 gây lỗi 403) hoặc nâng cấp sang Phương pháp 3 với Playwright.

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

Dùng headers trình duyệt giống thật (gồm User-Agent, RefererAccept-Language), luân phiên 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ối thiểu 1–3 giây), và đừng scrape ở lưu lượng cực lớn. Phương pháp 3 (Playwright) có độ bền cao nhất trước việc bị chặn vì nó mô phỏng một phiên trình duyệt thật. Nếu làm ở quy mô nghiêm túc, hãy tính luôn chi phí proxy — proxy residential gói nhập môn thường vào khoảng từ các nhà cung cấp lớn.

  • Tìm Hiểu Thêm
Topics
Scrape Tiktok pythonTiktok data extraction pythonPython Tiktok scraper scriptHow to scrape Tiktok videos with python

Thử Thunderbit

Lấy leads và dữ liệu khác chỉ với 2 cú nhấp. Vận hành bằng AI.

Nhận Thunderbit Miễn phí