Puppeteer để thu thập dữ liệu web: Hướng dẫn từng bước

Cập nhật lần cuối vào May 22, 2026
 Puppeteer scraper web scraping step-by-step guide title with browser window illustration on a spider web.

Nếu bạn từng thử lấy dữ liệu từ một trang web chỉ tải nội dung khi bạn cuộn xuống, giấu giá sau lớp đăng nhập, hoặc cứ như thể vài tuần lại đổi bố cục một lần, chắc bạn hiểu cảm giác “vật lộn” là thế nào. Những công cụ crawl tĩnh giờ không còn đủ nữa. Thực tế, hơn 67% cố vấn đầu tư tại Mỹ hiện dựa vào web scraping để lấy dữ liệu thay thế, và 81% nhà bán lẻ tại Mỹ tự động hóa việc theo dõi giá của đối thủ. Nhưng điểm mấu chốt là: phần lớn dữ liệu đó nằm trên các trang động, được tải bằng JavaScript và ẩn sau các tương tác của người dùng. Đó là lúc tự động hóa trình duyệt không giao diện — và những công cụ như Puppeteer — phát huy tác dụng.

Là người đã dành nhiều năm xây dựng các công cụ tự động hóa và AI (và đúng vậy, cũng từng scrape không ít website cho các đội sales và vận hành), tôi đã tận mắt thấy Puppeteer có thể mở khóa những dữ liệu mà các scraper truyền thống bỏ sót. Nhưng tôi cũng thấy rõ phần “gánh nặng code” có thể là điểm khiến người dùng doanh nghiệp chùn bước. Vì vậy, trong hướng dẫn này, tôi sẽ đi cùng bạn qua chính xác Puppeteer scraper là gì, cách dùng nó để thu thập dữ liệu web, và khi nào bạn nên chọn một giải pháp đơn giản hơn nữa — như Thunderbit, công cụ thu thập dữ liệu web bằng AI, không cần code của chúng tôi.

Puppeteer Scraper là gì? Tổng quan nhanh

puppeteer-scraper-data-extraction-automation.png Hãy bắt đầu từ những điều cơ bản. Puppeteer là một thư viện Node.js mã nguồn mở của Google, cho phép bạn điều khiển trình duyệt Chrome hoặc Chromium ở chế độ headless bằng JavaScript. Nói ngắn gọn: nó giống như có một con robot có thể mở trang web, bấm nút, điền biểu mẫu, cuộn trang và — quan trọng nhất — trích xuất dữ liệu, tất cả mà không hiện gì trên màn hình của bạn.

Điều gì khiến Puppeteer đặc biệt?

  • Nó có thể hiển thị nội dung động — nghĩa là nó chờ JavaScript tải xong, giống như một người dùng thật.
  • Nó có thể mô phỏng thao tác người dùng: bấm, gõ, cuộn, và thậm chí xử lý pop-up.
  • Nó rất phù hợp để thu thập dữ liệu từ những trang mà thông tin chỉ hiện ra sau khi tương tác, như danh sách thương mại điện tử, feed mạng xã hội hoặc dashboard.

Puppeteer so với các công cụ khác thì sao?

  • Selenium: “ông lớn” đời đầu của tự động hóa trình duyệt. Hoạt động với nhiều trình duyệt và ngôn ngữ, nhưng cồng kềnh hơn và hơi mang phong cách cũ. Tuyệt vời cho kiểm thử đa trình duyệt, nhưng Puppeteer gọn và nhanh hơn cho các dự án Chrome/Node.js.
  • Thunderbit: Đây là phần khiến tôi hào hứng. Thunderbit là một web scraper không cần code, có AI hỗ trợ, chạy ngay trong trình duyệt của bạn. Thay vì viết script, bạn chỉ cần bấm “AI Suggest Fields” và để AI tự xác định nên trích xuất gì. Rất lý tưởng cho người dùng doanh nghiệp muốn có kết quả mà không cần code (tôi sẽ nói thêm ở phần sau).

Tóm lại: Puppeteer = kiểm soát tối đa (nếu bạn biết code). Thunderbit = tiện lợi tối đa (nếu bạn không muốn code).

Vì sao thu thập dữ liệu web bằng Puppeteer quan trọng với người dùng doanh nghiệp

Data Scraping là gì và cách thực hiện vào năm 2026 Get Started Free

Nói thật nhé: web scraping giờ không còn chỉ dành cho hacker hay nhà khoa học dữ liệu nữa. Các đội sales, vận hành, marketing, thậm chí cả bất động sản, đều đang dùng dữ liệu web để đi trước đối thủ. Và vì quá nhiều thông tin quan trọng nằm sau các trang động, Puppeteer thường là chìa khóa để mở ra chúng.

Dưới đây là vài trường hợp ứng dụng thực tế:

Trường hợp sử dụngAi được lợiTác động / ROI
Tìm kiếm leadSales, Phát triển kinh doanhTự động xây dựng danh sách khách hàng tiềm năng; tiết kiệm hơn 8 giờ/tuần cho mỗi nhân sự (case study)
Theo dõi giáThương mại điện tử, vận hành sản phẩmTheo dõi đối thủ theo thời gian thực; một doanh nghiệp tiết kiệm 3,8 triệu USD/năm (nguồn)
Nghiên cứu thị trườngMarketing, Chiến lược, Tài chính67% cố vấn đầu tư dùng dữ liệu scrape từ web; trong một số trường hợp ROI lên tới 890% (nguồn)
Tổng hợp bất động sảnMôi giới, nhà phân tíchScrape hơn 50 trang bất động sản trong vài phút thay vì vài giờ (nguồn)
Theo dõi tuân thủVận hành, Pháp lýTự động giám sát; một công ty bảo hiểm tránh được 50 triệu USD tiền phạt (nguồn)

Và cũng đừng quên: hơn 40% người lao động dành một phần tư tuần làm việc cho các tác vụ lặp đi lặp lại như thu thập dữ liệu. Tự động hóa việc này bằng web scraping không chỉ là “có thì tốt” — mà là một lợi thế cạnh tranh.

Bắt đầu: Thiết lập Puppeteer scraper của bạn

Sẵn sàng xắn tay áo chưa? Đây là cách để chạy Puppeteer trong chưa đầy 10 phút (giả sử bạn đã quen với một chút JavaScript):

1. Cài Node.js
Puppeteer chạy trên Node.js. Tải phiên bản LTS mới nhất từ nodejs.org.

2. Tạo một thư mục dự án mới
Mở terminal và chạy:

mkdir puppeteer-scraper-demo
cd puppeteer-scraper-demo
npm init -y

3. Cài Puppeteer

npm install puppeteer

Lệnh này cũng sẽ tải về một phiên bản Chromium tương thích (khoảng 100MB).

4. Tạo script đầu tiên của bạn
Tạo một file tên là scrape.js:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  const title = await page.title();
  console.log('Tiêu đề trang:', title);
  await browser.close();
})();

Chạy nó bằng:

node scrape.js

Nếu bạn thấy “Tiêu đề trang: Example Domain” thì xin chúc mừng — bạn vừa tự động hóa Chrome rồi đấy!

Xây dựng script thu thập dữ liệu web bằng Puppeteer đầu tiên

Hãy làm thực tế hơn. Giả sử bạn muốn scrape các câu trích dẫn từ quotes.toscrape.com (một site demo cho scraper).

Bước 1: Điều hướng đến trang

await page.goto('http://quotes.toscrape.com', { waitUntil: 'networkidle0' });

Bước 2: Trích xuất dữ liệu

const quotes = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('.quote')).map(node => ({
    text: node.querySelector('.text')?.innerText.trim(),
    author: node.querySelector('.author')?.innerText.trim(),
    tags: Array.from(node.querySelectorAll('.tag')).map(tag => tag.innerText.trim())
  }));
});
console.log(quotes);

Bước 3: Xử lý phân trang

let hasNext = true;
let allQuotes = [];
while (hasNext) {
  // Trích xuất quotes như ở trên
  const quotes = await page.evaluate(/* ... */);
  allQuotes.push(...quotes);

  const nextButton = await page.$('li.next > a');
  if (nextButton) {
    await Promise.all([
      page.click('li.next > a'),
      page.waitForNavigation({ waitUntil: 'networkidle0' })
    ]);
  } else {
    hasNext = false;
  }
}

Bước 4: Lưu ra JSON

const fs = require('fs');
fs.writeFileSync('quotes.json', JSON.stringify(allQuotes, null, 2));

Vậy là xong — một Puppeteer scraper cơ bản có thể điều hướng, trích xuất, phân trang và lưu dữ liệu.

Kỹ thuật Puppeteer scraper nâng cao: Xử lý nội dung động

Phần lớn các trang thực tế không đơn giản như một danh sách tĩnh. Đây là cách xử lý những phần khó:

1. Chờ phần tử động

await page.waitForSelector('.product-list-item');

Cách này đảm bảo nội dung bạn cần đã tải xong trước khi bạn cố lấy nó.

2. Mô phỏng thao tác người dùng

  • Bấm nút: await page.click('#load-more');
  • Gõ vào ô nhập: await page.type('#search', 'laptop');
  • Cuộn cho infinite scroll:
    // Lưu ý: page.waitForTimeout đã bị xóa trong Puppeteer v22. Hãy dùng promise thông thường thay thế.
    const sleep = (ms) => new Promise(r => setTimeout(r, ms));
    
    let previousHeight = await page.evaluate('document.body.scrollHeight');
    while (true) {
      await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
      await sleep(1500);
      const newHeight = await page.evaluate('document.body.scrollHeight');
      if (newHeight === previousHeight) break;
      previousHeight = newHeight;
    }
    


**3. Xử lý đăng nhập**
```javascript
await page.goto('https://exampleshop.com/login');
await page.type('#login-username', 'myusername');
await page.type('#login-password', 'mypassword');
await page.click('#login-button');
await page.waitForNavigation({ waitUntil: 'networkidle0' });

4. Xử lý dữ liệu tải qua AJAX Đôi khi dữ liệu không nằm trong DOM mà đến từ một API call. Bạn có thể chặn phản hồi mạng bằng:

page.on('response', async response => {
  if (response.url().includes('/api/products')) {
    const data = await response.json();
    // Xử lý dữ liệu
  }
});

Ví dụ thực tế: Scrape dữ liệu sản phẩm từ một website thương mại điện tử

Hãy ghép tất cả lại với nhau. Giả sử bạn muốn scrape tên sản phẩm, giá và hình ảnh từ một website thương mại điện tử (demo) sau khi đăng nhập.

const puppeteer = require('puppeteer');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  // Bước 1: Đăng nhập
  await page.goto('https://exampleshop.com/login');
  await page.type('#login-username', 'myusername');
  await page.type('#login-password', 'mypassword');
  await page.click('#login-button');
  await page.waitForNavigation({ waitUntil: 'networkidle0' });

  // Bước 2: Đi đến trang danh mục
  await page.goto('https://exampleshop.com/category/laptops', { waitUntil: 'networkidle0' });

  // Bước 3: Trích xuất sản phẩm
  const products = await page.evaluate(() => {
    return Array.from(document.querySelectorAll('.product-item')).map(item => ({
      name: item.querySelector('.product-title')?.innerText.trim() || '',
      price: item.querySelector('.product-price')?.innerText.trim() || '',
      image: item.querySelector('img.product-image')?.src || ''
    }));
  });

  // Bước 4: Lưu ra JSON
  fs.writeFileSync('products.json', JSON.stringify(products, null, 2));

  await browser.close();
})();

Script này đăng nhập, điều hướng, scrape và lưu — tất cả đều tự động. Với nhu cầu nâng cao hơn, bạn có thể thêm vòng lặp phân trang hoặc thậm chí bấm vào từng sản phẩm để lấy thêm chi tiết.

Thunderbit: Làm cho Puppeteer scraper đơn giản hơn nhờ AI

Thử tiện ích mở rộng Thunderbit trên Chrome Thu thập dữ liệu từ bất kỳ website nào bằng AI chỉ trong 2 cú nhấp. Get Started Free

Nếu bạn đã đọc đến đây và đang nghĩ: “Hay đấy, nhưng tôi không muốn mỗi lần cần một bộ dữ liệu mới lại phải viết code,” thì bạn không hề đơn độc. Đó chính là lý do chúng tôi xây dựng Thunderbit.

Điều gì làm Thunderbit khác biệt?

  • Không cần code: Chỉ cần cài Thunderbit Chrome Extension, mở trang bạn muốn scrape và bấm “AI Suggest Fields”.
  • Tự động nhận diện trường dữ liệu bằng AI: Thunderbit đọc trang và gợi ý những cột tốt nhất để trích xuất — như “Tên sản phẩm”, “Giá”, “Hình ảnh”, v.v.
  • Xử lý nội dung động: Infinite scroll, pop-up và các trang con? AI của Thunderbit có thể xử lý, tự động bấm qua phân trang hoặc thậm chí ghé vào trang chi tiết của từng sản phẩm để làm giàu dữ liệu.
  • Xuất dữ liệu ngay lập tức: Gửi dữ liệu thẳng sang Excel, Google Sheets, Notion hoặc Airtable chỉ với một cú nhấp. Không tính thêm phí cho xuất dữ liệu.
  • Mẫu dựng sẵn cho các trang phổ biến: Cần scrape Amazon, Zillow hay LinkedIn? Thunderbit có các mẫu dùng ngay — không cần thiết lập.
  • Scraping trên cloud hoặc trong trình duyệt: Với tác vụ lớn, Thunderbit có thể scrape cùng lúc tới 50 trang trên cloud.

Tôi đã thấy người dùng đi từ “Giá mà mình lấy được dữ liệu này” đến “Đây là file spreadsheet của tôi” chỉ trong chưa đầy năm phút. Và phần hay nhất? Không còn phải lo script bị hỏng khi website thay đổi — AI của Thunderbit tự thích ứng ngay lập tức.

Dùng thử Thunderbit AI Web Scraper miễn phí

Puppeteer vs. Thunderbit: Chọn công cụ thu thập dữ liệu web phù hợp

Vậy nên dùng cái nào? Đây là cách tôi phân tích cho các đội nhóm:

Yếu tốPuppeteer (Code)Thunderbit (Không cần code, có AI)
Dễ sử dụngCần biết JavaScript và DOMNhấp là chạy, AI gợi ý trường dữ liệu
Tốc độ thiết lậpMất vài giờ đến vài ngày cho tác vụ phức tạpTính bằng phút — chỉ cần cài và dùng
Kiểm soát/Linh hoạtTối đa: viết logic tùy chỉnh bất kỳ, tích hợp với code khácMạnh với các trường hợp tiêu chuẩn; ít phù hợp với quy trình quá tùy biến
Nội dung độngPhải tự viết script để chờ, bấm, cuộnAI tích hợp xử lý nội dung động, phân trang và các trang con tự động
Bảo trìBạn phải tự quản lý script — cập nhật khi site thay đổiAI thích ứng với thay đổi bố cục; người dùng ít phải bảo trì hơn
Xuất dữ liệuTự viết logic xuất dữ liệuXuất sang Excel, Sheets, Notion, Airtable, CSV, JSON chỉ với một cú nhấp
Phù hợp nhất choDeveloper, các dự án scrape quy mô lớn hoặc rất tùy biếnNgười dùng doanh nghiệp, dự án cần kết quả nhanh, đội ngũ không kỹ thuật
Chi phíMiễn phí (trừ thời gian của bạn và hạ tầng nếu có)Có gói miễn phí; gói trả phí theo credits (xem Thunderbit Pricing)

Kết luận ngắn gọn:

  • Dùng Puppeteer nếu bạn cần toàn quyền kiểm soát, có nguồn lực lập trình, hoặc cần tích hợp việc scrape vào một ứng dụng lớn hơn.
  • Dùng Thunderbit nếu bạn muốn có kết quả nhanh, không muốn code, hoặc cần trao quyền cho các đồng đội không chuyên kỹ thuật.

Thật lòng mà nói, tôi đã thấy nhiều đội dùng cả hai: Thunderbit cho các thắng lợi nhanh và dựng prototype, Puppeteer cho các tích hợp sâu hoặc các trường hợp biên.

Checklist từng bước: Chạy một dự án thu thập dữ liệu web bằng Puppeteer thành công

scraping-project-checklist-steps.png Đây là checklist “ruột” của tôi để một dự án Puppeteer chạy mượt:

  1. Xác định mục tiêu: Bạn cần dữ liệu gì? Nó nằm ở đâu?
  2. Phân tích website: Site có động không? Có cần đăng nhập không? Có biện pháp chống bot không?
  3. Thiết lập môi trường: Node.js, Puppeteer và các thư viện hỗ trợ nếu cần.
  4. Viết bản thử nghiệm: Bắt đầu với một trang, lấy selector cho đúng.
  5. Xử lý nội dung động: Dùng waitForSelector, mô phỏng bấm/cuộn khi cần.
  6. Thêm phân trang hoặc vòng lặp: Scrape toàn bộ trang, không chỉ một trang.
  7. Áp dụng kỹ thuật tránh bị chặn: Ngẫu nhiên hóa độ trễ, đặt User-Agent thật, dùng proxy nếu cần.
  8. Xuất và kiểm tra dữ liệu: Lưu ra JSON/CSV, kiểm tra độ đầy đủ.
  9. Tối ưu và xử lý lỗi: Thêm try/catch, ghi log tiến trình, xử lý dữ liệu thiếu một cách mềm dẻo.
  10. Giám sát và bảo trì: Website sẽ thay đổi — hãy sẵn sàng cập nhật script.

Mẹo xử lý sự cố:

  • Nếu selector trả về null, hãy kiểm tra lại HTML và dùng wait.
  • Nếu bị chặn, hãy giảm tốc độ, xoay IP hoặc dùng plugin stealth.
  • Nếu script bị crash, kiểm tra rò rỉ bộ nhớ hoặc exception chưa được bắt.

Kết luận và điểm chính cần nhớ

Thu thập dữ liệu web đã trở thành một kỹ năng bắt buộc với các đội làm việc dựa trên dữ liệu. Puppeteer cho bạn sức mạnh để trích xuất dữ liệu từ ngay cả những website động nhất, nhiều JavaScript nhất — nhưng nó đòi hỏi một mức kỹ năng code nhất định và việc bảo trì liên tục. Với người dùng doanh nghiệp muốn bỏ qua code và đi thẳng vào dữ liệu, Thunderbit mang đến một lựa chọn thay thế bằng AI, không cần code, nhanh, linh hoạt và đáng ngạc nhiên là rất mạnh.

Đây là điều tôi khuyên:

  • Nếu bạn có nền tảng kỹ thuật và cần tùy biến sâu, hãy bắt đầu với Puppeteer.
  • Nếu bạn muốn tốc độ, sự đơn giản và ít phải bảo trì, hãy thử Thunderbit (tiện ích Chrome Extension miễn phí là nơi bắt đầu rất tốt).
  • Với hầu hết các đội nhóm, kết hợp cả hai sẽ đáp ứng được 99% nhu cầu dữ liệu web.

Bạn muốn xem thêm những hướng dẫn như thế này? Hãy ghé Thunderbit Blog để xem các bài hướng dẫn, so sánh và những cập nhật mới nhất về web scraping bằng AI.

Thử Thunderbit AI Web Scraper Get Started Free

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

1. Puppeteer scraper là gì và vì sao nó được dùng để thu thập dữ liệu web?
Puppeteer là một thư viện Node.js cho phép bạn điều khiển trình duyệt Chrome không giao diện bằng JavaScript. Nó được dùng cho web scraping vì có thể tải nội dung động, mô phỏng thao tác người dùng và trích xuất dữ liệu từ những trang mà scraper truyền thống không xử lý được.

2. Puppeteer so với Selenium và Thunderbit như thế nào?
Selenium hoạt động với nhiều trình duyệt và ngôn ngữ, nhưng cồng kềnh hơn. Puppeteer được tối ưu cho Chrome/Node.js và nhanh hơn trong nhiều tác vụ scrape. Trong khi đó, Thunderbit là công cụ không cần code, có AI hỗ trợ, cho phép người dùng không kỹ thuật lấy dữ liệu chỉ với vài cú nhấp.

3. Lợi ích kinh doanh chính của việc thu thập dữ liệu web bằng Puppeteer là gì?
Tự động hóa việc thu thập dữ liệu giúp tiết kiệm thời gian, giảm lỗi và mang lại insight theo thời gian thực cho sales, marketing, vận hành và nhiều bộ phận khác. Các ứng dụng bao gồm từ tìm lead đến theo dõi giá và nghiên cứu thị trường.

4. Thách thức lớn nhất khi scrape bằng Puppeteer là gì?
Những thách thức chính là xử lý nội dung động, tránh bị chặn bởi cơ chế chống bot và bảo trì script khi website thay đổi. Bạn sẽ cần viết code để quản lý thời gian chờ, mô phỏng tương tác và xử lý lỗi.

5. Khi nào tôi nên dùng Thunderbit thay vì Puppeteer?
Hãy dùng Thunderbit nếu bạn muốn bỏ qua việc code, cần kết quả nhanh hoặc muốn trao quyền cho đồng đội không chuyên kỹ thuật. Đây là lựa chọn lý tưởng cho các tác vụ scrape tiêu chuẩn, dự án cần xoay vòng nhanh, hoặc khi bạn chỉ muốn xuất dữ liệu sang Excel hay Google Sheets với ít rắc rối nhất.

Bạn đã sẵn sàng thử một cách thông minh hơn để thu thập dữ liệu chưa? Tải Thunderbit hoặc đọc sâu hơn với các hướng dẫn khác trên Thunderbit Blog. Chúc bạn scrape vui vẻ!

Tìm hiểu thêm

Shuai Guan
Shuai Guan
CEO tại Thunderbit | Chuyên gia Tự động hóa Dữ liệu AI Shuai Guan là CEO của Thunderbit và là cựu sinh viên ngành Kỹ thuật của University of Michigan. Với gần một thập kỷ kinh nghiệm trong lĩnh vực công nghệ và kiến trúc SaaS, anh chuyên biến các mô hình AI phức tạp thành những công cụ trích xuất dữ liệu thực tiễn, không cần viết mã. Trên blog này, anh chia sẻ những góc nhìn thẳng thắn, đã được kiểm chứng qua thực chiến về web scraping và các chiến lược tự động hóa, giúp bạn xây dựng quy trình làm việc thông minh hơn, dựa trên dữ liệu. Khi không tối ưu hóa quy trình dữ liệu, anh áp dụng sự tỉ mỉ đó vào niềm đam mê nhiếp ảnh.
Topics
Puppeteer scraperPuppeteer web scraping
Mục lục

Cào một trang web chỉ bằng cách hỏi

Nói bạn cần gì bằng tiếng Anh đơn giản. Hoặc tốt hơn, không cần nói gì cả.

Dùng Thunderbit ngay 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
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week