Chia sẻ bởi Little Excel
Bạn là một nhà sáng tạo nội dung trên TikTok, một marketer hay đơn giản là người tò mò muốn biết tổng số lượt xem mà một kênh TikTok đã đạt được? Thông thường, TikTok không hiển thị con số này một cách trực tiếp, buộc chúng ta phải cộng thủ công view của từng video – một công việc tốn thời gian và dễ sai sót, đặc biệt với những kênh có hàng trăm, hàng ngàn video.
May mắn thay, với sự trợ giúp của công nghệ, cụ thể là n8n và Puppeteer, chúng ta hoàn toàn có thể tự động hóa quy trình thu thập dữ liệu TikTok và tính toán tổng view một cách chính xác. Bài viết này sẽ hướng dẫn bạn chi tiết từng bước, kể cả khi bạn không phải là một chuyên gia lập trình.
Tại sao cần thu thập dữ liệu TikTok và tính tổng view kênh?
Việc biết được tổng số lượt xem của một kênh TikTok mang lại nhiều lợi ích thiết thực:
- Đánh giá tổng quan hiệu suất: Tổng view là một chỉ số quan trọng phản ánh mức độ tương tác và sức hút của toàn bộ nội dung trên kênh.
- Theo dõi sự tăng trưởng: Ghi nhận tổng view theo thời gian giúp bạn thấy rõ sự phát triển của kênh.
- Phân tích và so sánh: Bạn có thể so sánh hiệu quả giữa các kênh khác nhau (nếu bạn thu thập dữ liệu từ nhiều kênh) hoặc đánh giá hiệu quả của các chiến dịch cụ thể.
- Báo cáo và hoạch định chiến lược: Số liệu cụ thể giúp bạn xây dựng báo cáo chính xác và đưa ra quyết định tốt hơn cho chiến lược nội dung tương lai.
Thay vì cộng tay mệt mỏi, hãy để công cụ giúp bạn!
Chuẩn Bị Công Cụ và Kiến Thức Nền Tảng
Trước khi bắt tay vào thực hiện, chúng ta cần làm quen với các công cụ và khái niệm chính sẽ sử dụng:
- n8n (Nodemation): Đây là một nền tảng tự động hóa quy trình làm việc mã nguồn mở. n8n cho phép bạn kết nối các ứng dụng, dịch vụ khác nhau và tự động hóa các tác vụ lặp đi lặp lại mà không cần viết quá nhiều code. Trong trường hợp này, n8n sẽ là "bộ não" điều khiển kịch bản thu thập dữ liệu của chúng ta.
- Puppeteer: Là một thư viện Node.js mạnh mẽ được phát triển bởi Google. Puppeteer cung cấp một API cấp cao để điều khiển trình duyệt Chrome hoặc Chromium (phiên bản không giao diện - headless, hoặc có giao diện đầy đủ). Nó cực kỳ hữu ích cho việc tự động hóa các tác vụ trên web, bao gồm việc thu thập dữ liệu TikTok.
- Cơ chế tải video của TikTok: TikTok sử dụng kỹ thuật "infinite scroll" (cuộn vô hạn). Nghĩa là, các video mới chỉ được tải và hiển thị khi bạn cuộn chuột xuống cuối trang. Đây là một yếu tố quan trọng chúng ta cần xử lý để đảm bảo lấy được toàn bộ video của kênh.
- Thông tin lượt xem (View): Số lượt xem của mỗi video thường được lưu trữ trong một thuộc tính cụ thể của một thẻ HTML trên trang. Chúng ta sẽ cần "soi" mã HTML để tìm ra nó.
- Cookie: Hiểu đơn giản, cookie là những mẩu thông tin nhỏ mà website lưu trữ trên trình duyệt của bạn. Chúng giúp website ghi nhớ các thông tin như trạng thái đăng nhập, tùy chọn cá nhân, v.v. Cookie chính là chìa khóa giúp chúng ta tự động đăng nhập, vượt qua một số cơ chế bảo vệ của TikTok.
Vượt Qua Thử Thách: Xử Lý Cookie Banner, Captcha và Đăng Nhập Tự Động
Khi bắt đầu thu thập dữ liệu TikTok, bạn có thể gặp một số trở ngại ban đầu. Dưới đây là cách giải quyết:
1. Xử lý Cookie Banner
Khi truy cập TikTok lần đầu hoặc trong chế độ ẩn danh, bạn thường thấy một banner yêu cầu chấp nhận việc sử dụng cookie. Puppeteer có thể giúp bạn tự động "click" vào nút chấp nhận:
- Logic: Dùng một selector (bộ chọn) để xác định nút "Chấp nhận" hoặc "Đồng ý" trên banner.
- Thực thi: Sử dụng lệnh
page.click('selector_cua_nut_chap_nhan')
trong Puppeteer để tự động nhấn nút đó.
2. Đối phó với Captcha
Captcha (Completely Automated Public Turing test to tell Computers and Humans Apart) là cơ chế TikTok sử dụng để ngăn chặn bot. Captcha có thể xuất hiện nếu:
- Bạn truy cập từ một địa chỉ IP bị nghi ngờ.
- Bạn không đăng nhập tài khoản.
- Tần suất truy cập của bạn quá cao.
Giải pháp hiệu quả nhất là đăng nhập vào một tài khoản TikTok. Khi đã đăng nhập, TikTok sẽ "tin tưởng" bạn hơn và ít khi hiển thị captcha. Đây là lúc vai trò của cookie trở nên quan trọng.
3. Đăng Nhập Tự Động Bằng Cookie
Thay vì cố gắng tự động điền tên đăng nhập và mật khẩu (một việc khá phức tạp và dễ bị TikTok phát hiện), chúng ta sẽ sử dụng cookie từ một phiên đăng nhập đã có sẵn.
- HTTPOnly Cookie là gì? Một số cookie có thể được đánh dấu là
HTTPOnly
. Điều này có nghĩa là JavaScript chạy phía trình duyệt (client-side JS nhưdocument.cookie
) không thể đọc được những cookie này. Tuy nhiên, chúng ta vẫn có cách lấy thông tin cookie cần thiết. - Cách lấy Cookie thủ công:
- Mở trình duyệt (Chrome, Firefox,...) và đăng nhập vào tài khoản TikTok của bạn.
- Mở Developer Tools (nhấn F12 hoặc click chuột phải chọn "Inspect" / "Kiểm tra").
- Chuyển đến tab "Application" (trong Chrome) hoặc "Storage" (trong Firefox).
- Tìm mục "Cookies" trong menu bên trái và chọn domain của TikTok (ví dụ:
https://www.tiktok.com/
). - Bạn sẽ thấy danh sách các cookie. Video gốc có đề cập đến việc dùng
document.cookie
trong Console và một đoạn script để chuyển đổi nó sang định dạng JSON mà Puppeteer cần. Đoạn script này sẽ lặp qua các cookie, lấyname
,value
,domain
,path
. Bạn có thể hỏi ChatGPT hoặc các công cụ AI tương tự để giúp tạo đoạn script này dựa trên chuỗidocument.cookie
.- Ví dụ, bạn vào Console của Developer Tools, gõ
document.cookie
. Kết quả trả về là một chuỗi dài. Bạn cần một hàm JavaScript để phân tích chuỗi này thành một mảng các đối tượng, mỗi đối tượng có dạng:{name: "ten_cookie", value: "gia_tri_cookie", domain: ".tiktok.com", path: "/"}
.
- Ví dụ, bạn vào Console của Developer Tools, gõ
- Sử dụng
page.setCookie()
trong Puppeteer:
Khi đã có mảng các đối tượng cookie, bạn sẽ dùng Puppeteer để "áp" chúng vào trình duyệt mà nó điều khiển:
Sau bước này, Puppeteer sẽ truy cập TikTok với trạng thái đã đăng nhập.// const cookies = [{name: "...", value: "...", domain: "..."}, /* các cookie khác */]; for (const cookie of cookies) { await page.setCookie(cookie); } await page.reload(); // Tải lại trang để áp dụng cookie
Xây Dựng Kịch Bản Puppeteer Thu Thập Dữ Liệu TikTok Chi Tiết
Đây là phần cốt lõi, nơi chúng ta sẽ viết kịch bản để Puppeteer thực hiện các tác vụ.
1. Khởi tạo Puppeteer và Mở Trang (Ví dụ khi chạy local)
const puppeteer = require('puppeteer'); // Chỉ cần khi chạy local, n8n đã có sẵn
async function scrapeTikTokChannel(channelUrl, cookiesArray) {
// Khi dùng n8n, browser và page sẽ được cung cấp, không cần khởi tạo thế này
// const browser = await puppeteer.launch({ headless: false }); // headless: true để chạy ẩn danh
// const page = await browser.newPage();
// Đi đến trang kênh TikTok
await page.goto(channelUrl, { waitUntil: 'networkidle2' }); // Chờ trang tải xong cơ bản
// 1. Thiết lập Cookie (nếu cookiesArray được truyền vào)
if (cookiesArray && cookiesArray.length > 0) {
for (const cookie of cookiesArray) {
// Đảm bảo domain và path đúng, nếu không có trong object cookie thì Puppeteer có thể tự suy ra từ URL hiện tại
// Tuy nhiên, tốt nhất là cung cấp đầy đủ thông tin lấy từ trình duyệt
await page.setCookie(cookie);
}
await page.reload({ waitUntil: 'networkidle2' });
console.log('Đã thiết lập cookie và tải lại trang.');
}
// Các bước tiếp theo sẽ ở đây
// ...
// await browser.close(); // Đóng trình duyệt khi xong (chỉ khi chạy local)
}
Lưu ý: Trong môi trường n8n, bạn không cần require('puppeteer')
hay puppeteer.launch()
. Biến browser
và page
đã được n8n cung cấp sẵn.
2. Tự Động Cuộn Trang Để Load Hết Video (Xử lý Infinite Scroll)
Để lấy được tất cả video, chúng ta cần mô phỏng hành động cuộn trang của người dùng.
async function autoScrollToBottom(page) {
await page.evaluate(async () => {
await new Promise((resolve) => {
let totalHeight = 0;
const distance = 200; // Khoảng cách mỗi lần cuộn
let previousHeight = 0;
let noChangeAttempts = 0;
const maxNoChangeAttempts = 5; // Dừng nếu sau 5 lần cuộn mà chiều cao trang không đổi
const timer = setInterval(() => {
const scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (document.body.scrollHeight === previousHeight) {
noChangeAttempts++;
} else {
previousHeight = document.body.scrollHeight;
noChangeAttempts = 0; // Reset nếu có thay đổi
}
// Dừng nếu đã cuộn hết hoặc không có nội dung mới sau vài lần thử
if (totalHeight >= scrollHeight || noChangeAttempts >= maxNoChangeAttempts) {
clearInterval(timer);
resolve();
}
}, 300); // Thời gian chờ giữa mỗi lần cuộn (miligiây)
});
});
console.log('Đã cuộn đến cuối trang.');
}
// Cách gọi trong hàm chính:
// await autoScrollToBottom(page);
Logic ở đây là liên tục cuộn trang xuống một khoảng nhỏ, chờ một chút để nội dung mới tải, và kiểm tra xem chiều cao trang có còn tăng hay không. Nếu chiều cao không tăng sau vài lần cuộn liên tiếp, có nghĩa là đã hết video để tải.
3. Trích Xuất Thông Tin Link và View của Video
Sau khi đã load hết video, chúng ta sẽ dùng page.evaluate()
để chạy một đoạn mã JavaScript trực tiếp trên trang TikTok nhằm lấy ra thông tin cần thiết.
async function extractVideoData(page) {
const videoData = await page.evaluate(() => {
const videos = [];
// Selector này cần được kiểm tra và cập nhật thường xuyên vì cấu trúc TikTok có thể thay đổi
// Ví dụ selector cho từng item video, bạn cần Inspect Element trên trang TikTok để tìm selector chính xác
const videoElements = document.querySelectorAll('div[data-e2e="user-post-item"]');
// Hàm xử lý chuyển đổi view dạng "10.5K", "1.2M" thành số
function parseViews(viewStr) {
if (!viewStr) return 0;
const text = viewStr.toLowerCase().trim();
let num = parseFloat(text.replace(/,/g, ''));
if (text.includes('k')) {
num *= 1000;
} else if (text.includes('m')) {
num *= 1000000;
}
return Math.round(num);
}
videoElements.forEach(videoEl => {
const linkElement = videoEl.querySelector('a'); // Thường thẻ <a> chứa link video
const url = linkElement ? linkElement.href : null;
// Selector cho số lượt xem, video gốc dùng [data-e2e="video-views"]
// Cần Inspect Element để tìm đúng selector chứa số view
const viewElement = videoEl.querySelector('[data-e2e="video-views"]');
const viewText = viewElement ? viewElement.textContent || viewElement.innerText : '0';
if (url) { // Chỉ thêm video nếu có URL
videos.push({
url: url,
views: parseViews(viewText)
});
}
});
return videos;
});
console.log(`Đã trích xuất được ${videoData.length} video.`);
return videoData;
}
// Cách gọi trong hàm chính:
// const allVideos = await extractVideoData(page);
Quan trọng: Các selector (ví dụ div[data-e2e="user-post-item"]
hay [data-e2e="video-views"]
) là trái tim của việc trích xuất. Bạn cần mở Developer Tools (F12) trên trang kênh TikTok, "Inspect Element" (Kiểm tra phần tử) để tìm ra các thẻ HTML chứa thông tin video (link, view) và xác định selector chính xác cho chúng. Cấu trúc HTML của TikTok có thể thay đổi, nên bạn có thể cần cập nhật các selector này theo thời gian. Video gốc có gợi ý bạn có thể copy OuterHTML của một item video, sau đó đưa cho AI (như ChatGPT) và yêu cầu nó viết code để trích xuất thông tin.
4. Tính Tổng Lượt Xem
Khi đã có danh sách các video cùng với số view của từng video, việc tính tổng trở nên đơn giản với hàm reduce()
của JavaScript:
function calculateTotalViews(videoList) {
if (!videoList || videoList.length === 0) return 0;
const totalViews = videoList.reduce((sum, video) => sum + video.views, 0);
console.log('Tổng số lượt xem của kênh:', totalViews);
return totalViews;
}
// Cách gọi trong hàm chính:
// const totalChannelViews = calculateTotalViews(allVideos);
5. Trả về Kết Quả
Cuối cùng, kịch bản Puppeteer của bạn cần trả về dữ liệu đã thu thập được. Trong n8n, bạn sẽ return
một đối tượng chứa thông tin này.
// Trong hàm chính, sau khi có totalChannelViews và allVideos
// return {
// videos: allVideos, // Danh sách chi tiết các video và view
// totalViews: totalChannelViews // Tổng số view
// };
// Hoặc chỉ trả về tổng view nếu đó là yêu cầu duy nhất
// return { totalViews: totalChannelViews };
Video gốc chỉ return totalViews
.
Tích Hợp Kịch Bản Puppeteer vào n8n để Tự Động Hóa
Giờ là lúc đưa kịch bản Puppeteer của chúng ta vào n8n để chạy tự động:
-
Tạo Workflow trong n8n: Mở n8n và tạo một workflow mới.
-
Thêm Node "Execute Puppeteer Script": Tìm và thêm node này vào workflow của bạn.
-
Cấu hình Node:
- Script: Copy toàn bộ mã JavaScript Puppeteer bạn đã viết (bao gồm các hàm
autoScrollToBottom
,extractVideoData
,calculateTotalViews
và logic chính gọi chúng) vào phần "Script" của node. - Điều chỉnh cho n8n:
- Bạn không cần các dòng
const puppeteer = require('puppeteer');
,const browser = await puppeteer.launch(...);
,const page = await browser.newPage();
, vàawait browser.close();
. n8n sẽ tự động cung cấp các biếnbrowser
vàpage
đã được khởi tạo sẵn cho bạn trong môi trường thực thi của node. - Nhận URL Kênh Động: Để kịch bản linh hoạt, bạn nên truyền URL kênh TikTok từ một node trước đó (ví dụ: một node "Start" với tham số, hoặc một node "Edit Fields" nơi bạn nhập URL). Trong script Puppeteer, bạn có thể truy cập dữ liệu này thông qua đối tượng
$input
:// Giả sử node trước đó có output là { "json": { "channelUrl": "URL_KÊNH_TIKTOK" } } const channelUrl = $input.first().json.channelUrl; await page.goto(channelUrl, { waitUntil: 'networkidle2' });
- Nhận Cookie (Tùy chọn): Tương tự, bạn có thể truyền mảng cookie từ một node trước (ví dụ node "Edit Fields" hoặc "Function" nơi bạn lưu trữ/tạo cookie).
// const cookiesArray = $input.first().json.cookies; // Nếu bạn truyền cookie // if (cookiesArray && cookiesArray.length > 0) { ... thiết lập cookie ... }
- Bạn không cần các dòng
- Output của Node: Đảm bảo rằng dòng
return
cuối cùng trong script của bạn trả về đối tượng chứa dữ liệu mong muốn (ví dụ:{ totalViews: totalChannelViews }
). Dữ liệu này sẽ là output của node "Execute Puppeteer Script" và có thể được sử dụng bởi các node tiếp theo trong workflow.
- Script: Copy toàn bộ mã JavaScript Puppeteer bạn đã viết (bao gồm các hàm
-
Chạy và Kiểm Tra: Thực thi workflow để kiểm tra. Xem log của node "Execute Puppeteer Script" để theo dõi quá trình và gỡ lỗi nếu cần.
Kết Luận và Những Lưu Ý Khi Thu Thập Dữ Liệu TikTok
Chúng ta vừa cùng nhau xây dựng một giải pháp tự động để thu thập dữ liệu TikTok, cụ thể là tính tổng view của một kênh, bằng cách kết hợp sức mạnh của n8n và Puppeteer. Đây là một ví dụ điển hình cho thấy công nghệ có thể giúp chúng ta giải quyết các vấn đề lặp đi lặp lại một cách hiệu quả, ngay cả khi không phải là chuyên gia IT.
Tuy nhiên, cần lưu ý một số điểm quan trọng:
- Thay đổi cấu trúc HTML: TikTok (và các website khác) có thể thay đổi cấu trúc HTML của họ bất cứ lúc nào. Khi đó, các selectors bạn dùng trong kịch bản Puppeteer có thể không còn chính xác, dẫn đến việc script không hoạt động. Bạn sẽ cần phải kiểm tra và cập nhật lại selectors.
- Điều khoản dịch vụ: Luôn tôn trọng Điều khoản Dịch vụ (Terms of Service) của TikTok. Tránh việc cào dữ liệu với tần suất quá cao hoặc thực hiện các hành động có thể gây ảnh hưởng tiêu cực đến hệ thống của họ. Việc này có thể khiến IP của bạn bị chặn.
- Cookie hết hạn: Cookie dùng để đăng nhập có thể hết hạn sau một thời gian. Bạn cần có cơ chế để cập nhật cookie khi cần thiết.
- Đây là giải pháp khởi đầu: Mặc dù giải pháp này rất hữu ích cho người không chuyên, nhưng với các yêu cầu phức tạp hơn, đòi hỏi hiệu năng cao, hoặc cần sự ổn định lâu dài trước những thay đổi của website, vai trò của các lập trình viên chuyên nghiệp (IT) vẫn rất quan trọng để xây dựng các giải pháp tối ưu và bền vững.
- Khả năng mở rộng: Từ nền tảng này, bạn có thể mở rộng để thu thập nhiều loại dữ liệu khác từ TikTok như: danh sách comment, thông tin chi tiết của từng video, phân tích cảm xúc của người xem (sentiment analysis), v.v.
Hy vọng bài viết này đã cung cấp cho bạn kiến thức và công cụ cần thiết để bắt đầu hành trình thu thập dữ liệu TikTok của riêng mình. Chúc bạn thành công!