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:
- 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.
- 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 và 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ụng | Dữ liệu bạn sẽ scrape | Ai cần dùng |
|---|---|---|
| Nghiên cứu influencer & marketing | Tỷ 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 dung | Hashtag đang trend, format video viral, tần suất đăng bài | Creator, social media manager |
| Giám sát 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, độ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 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 xem, khám phá sản phẩm | Nhà 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.

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ứng | Nguyên nhân có khả năng nhất | 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 (Hidden JSON) hoặc Phương pháp 3 (Playwright) |
| 403 / Access Denied | Thiếu hoặc sai headers; bị phát hiện là bot | Phương pháp 1 với headers đúng |
| Lúc đầu chạy được, sau đó dừng | Bị giới hạn tốc độ / chặn IP | Luân phiên proxy (mọi phương pháp) |
| Xuất hiện login wall | Cần session/cookie | Phươ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ình | Cả 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:
- 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. - 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. - 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ặchttpx)beautifulsoup4(hoặcparsel)- 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_tag là None, 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[] và 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, tronguserInfo.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 hasMore là False.
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
itemListrỗ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() > 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ơndownloadAddr— 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 JSON | Phương pháp 2: Internal API | Phương pháp 3: Playwright |
|---|---|---|---|
| Độ khó | Người mới | Trung cấp | Trung cấp |
| Tốc độ | Nhanh (1 request/trang) | Nhanh (JSON API) | Chậm (render đầy đủ trang) |
| Khả năng chống bot | Trung bình | Thấ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 scroll | Không (chỉ trang đầu) | Có (cursor pagination) | Có (mô phỏng cuộn trang) |
| Cần proxy khi ở quy mô lớn | Có | Có | Có |
| 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 cho | Scrape nhanh một profile | Trích xuất hàng loạt, lấy toàn bộ video | Nộ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.

Dưới đây là so sánh thẳng thắn giữa các cách tiếp cận:
| Phương án | Trình độ cần có | Chi phí | Bảo trì | Phù hợp nhất cho |
|---|---|---|---|---|
| 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 |
| Thunderbit (tiện ích Chrome) | Người mới | Có 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 Scraper | Người mới | Trả 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 |
| TikAPI | Nhà phát triển | Trả phí theo gói | Trung bình | Xâ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:
- 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.
- 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, Referer và Accept-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