close

Puppeteer là gì? Cách dùng Puppeteer với n8n từ A-Z

Tác giả: Đông Tùng Ngày đăng: 04/12/2025 Chuyên mục: n8n
Disclosure
Website Tino blog được cung cấp bởi Tino Group. Truy cập và sử dụng website đồng nghĩa với việc bạn đồng ý với các điều khoản và điều kiện trong chính sách bảo mật - điều khoản sử dụng nội dung. Tino Group có thể thay đổi điều khoản sử dụng bất cứ lúc nào. Việc bạn tiếp tục sử dụng Tino blog sau khi thay đổi có nghĩa là bạn chấp nhận những thay đổi đó.
Why Trust Us
Các bài viết với hàm lượng tri thức cao tại Tino blog được tạo ra bởi các chuyên viên Marketing vững chuyên môn và được kiểm duyệt nghiêm túc theo chính sách biên tập bởi đội ngũ biên tập viên dày dặn kinh nghiệm. Mọi nỗ lực của chúng tôi đều hướng đến mong muốn mang đến cho cộng đồng nguồn thông tin chất lượng, chính xác, khách quan, đồng thời tuân thủ các tiêu chuẩn cao nhất trong báo cáo và xuất bản.

Puppeteer là thư viện Node.js do Google phát triển, điều khiển trình duyệt Chrome hoặc Chromium qua giao thức DevTools, thường chạy ở chế độ không giao diện (headless). Trong n8n, bạn dùng node cộng đồng n8n-nodes-puppeteer khi cần mở trang web có JavaScript, chụp màn hình hoặc xuất PDF, những việc node HTTP Request không làm được.

Hướng dẫn dưới đây cài node trên n8n tự host chạy Docker, dựng workflow chụp màn hình và sửa lỗi thiếu Chromium bằng image tuỳ biến. Puppeteer là một trong các cách lấy dữ liệu web mà node AI Agent trong n8n có thể dùng; cách làm cơ bản có ở bài crawl dữ liệu website với n8n.

Puppeteer là gì?

Puppeteer là thư viện Node.js cung cấp API cấp cao để điều khiển Chrome hoặc Chromium thông qua giao thức DevTools. Công cụ này chủ yếu chạy ở chế độ headless (không hiện cửa sổ), nên tự động hoá được thao tác web trên máy chủ không có màn hình.

Nhờ điều khiển được trình duyệt thật, Puppeteer thường được dùng để chụp ảnh màn hình, tạo file PDF từ trang web, kiểm thử giao diện và lấy nội dung của trang chỉ hiện ra sau khi JavaScript chạy xong.

Khi nào nên kết hợp n8n và Puppeteer?

n8n và Puppeteer hợp nhau khi một bước trong workflow cần trình duyệt thật: trang dựng bằng React, Vue, Angular, cần bấm nút, cuộn trang hoặc cần ảnh chụp, PDF. Các bước còn lại (lọc, lưu, gửi thông báo) để n8n lo.

  • Trang web động: node HTTP Request chỉ tải HTML ban đầu, còn trang Single Page Application (SPA) chỉ có nội dung sau khi JavaScript chạy. Puppeteer render xong trang rồi mới trả HTML.
  • Thao tác người dùng: điền biểu mẫu trên hệ thống nội bộ của bạn, cuộn trang để tải thêm nội dung, bấm nút. Puppeteer điều khiển được từng thao tác chuột và bàn phím.
  • Ảnh chụp và PDF: lưu ảnh trang báo cáo, xuất hoá đơn web ra PDF để gửi email hoặc lưu Google Drive.
  • Phần còn lại cho n8n: lập lịch, xử lý lỗi, lưu Google Sheets, gửi Telegram mà không phải viết thêm mã.

Nếu trang có API chính thức hoặc HTML tĩnh, hãy dùng HTTP Request: nhẹ hơn nhiều so với mở một trình duyệt.

Cách cài node Puppeteer cho n8n?

Node Puppeteer là node cộng đồng n8n-nodes-puppeteer (kho mã trên GitHub, bản 1.5.0 trên npm ngày 23/10/2026). Node này chưa được n8n xác minh nên chỉ cài được trên n8n tự host, không cài được trên n8n Cloud (docs n8n).

Bước 1: Tại giao diện n8n, mở menu tài khoản ở góc dưới bên trái → Settings.

Giao diện n8n, menu tài khoản ở góc dưới bên trái mở ra hai mục Settings và Sign out
Mở Settings

Bước 2: Chọn mục Community Nodes rồi nhấn nút Install.

Trang Community nodes trong Settings của n8n với danh sách node đã cài và nút Install
Trang Community nodes. Ảnh chụp ở n8n 1.119 (12/2025).

Bước 3: Nhập tên gói: n8n-nodes-puppeteer, đánh dấu đồng ý với cảnh báo rủi ro khi cài mã chưa xác minh và nhấn Install.

Hộp thoại Install community nodes: npm Package Name n8n-nodes-puppeteer, ô đồng ý rủi ro đã đánh dấu, nút Install
Nhập tên gói và bấm Install

Node cộng đồng chạy với quyền của n8n, nên chỉ cài gói bạn tin cậy và ghim phiên bản khi cài (ví dụ n8n-nodes-puppeteer@1.5.0). Sau khi cài xong, node Puppeteer xuất hiện trong danh sách node.

Cách tạo workflow chụp màn hình trang web bằng Puppeteer?

Workflow mẫu chỉ có hai node: Manual Trigger và Puppeteer với thao tác Get Screenshot. Ví dụ dưới đây chụp trang chủ Google; bạn thay bằng URL trang của mình.

Bước 1: Tạo Trigger

Kéo node Manual Trigger (When clicking ‘Execute workflow’) vào khung làm việc. Node này là nút khởi động thủ công để kiểm tra quy trình.

Bước 2: Cấu hình node Puppeteer

Tìm và kéo node Puppeteer nối vào sau Trigger, chọn thao tác Get Screenshot. Node có bốn thao tác: Get Page Content, Get PDF, Get Screenshot và Run Custom Script.

Bảng Node details của Puppeteer trong n8n với bốn Actions: Get Page Content, Get PDF, Get Screenshot, Run Custom Script
Ảnh chụp ở n8n 1.x (12/2025); trên n8n 2.x công tắc Inactive được thay bằng nút Publish.

Trong bảng cấu hình, thiết lập như sau:

  • Operation: Giữ nguyên Get Screenshot.
  • URL: Nhập https://www.google.com.
  • Property Name: data (tên trường binary chứa ảnh).
  • Type: PNG (hoặc JPEG, WebP).
  • Full Page: bật để cuộn và chụp toàn bộ chiều dài trang; tắt để chỉ chụp phần màn hình đầu tiên.
Cấu hình node Puppeteer: URL https://www.google.com, Operation Get Screenshot, Property Name data, Type PNG, Full Page tắt
Cấu hình Get Screenshot

Bước 3: Thực thi và kiểm tra

Nhấn nút Execute step và xem kết quả ở khung Output bên phải.

  • Tab JSON gần như trống vì ảnh là dữ liệu binary.
  • Bấm tab Binary (cạnh tab JSON ở góc trên khung Output) sẽ thấy tệp ảnh.
  • Bấm View để xem ảnh Puppeteer vừa chụp.
Khung Output của node Puppeteer ở tab Binary, trường data là tệp png 41 kB với nút View
Ảnh nằm ở tab Binary
Ảnh chụp trang chủ Google do Puppeteer trả về, hiển thị trong khung Output của n8n
Kết quả chụp màn hình

Vì sao node Puppeteer báo lỗi Could not find Chrome trên Docker?

Node Puppeteer báo lỗi Could not find Chrome vì image Docker chính thức của n8n dựa trên Alpine Linux rút gọn, không có Chromium và thư viện đồ hoạ đi kèm. Hay gặp ba thông báo:

  • Could not find Chrome: không tìm thấy trình duyệt.
  • Error loading shared library (libnss3.so, libatk…): thiếu thư viện hệ thống để khởi chạy trình duyệt.
  • Operation not permitted: sandbox của Chrome xung đột với quyền trong container.
Node Puppeteer trong n8n báo lỗi Failed to launch/connect to browser: Could not find Chrome
Lỗi Could not find Chrome khi chạy lần đầu trên Docker

Bản cũ của bài này cài Chromium bằng docker exec … apk add. Cách đó không còn dùng được: theo tài liệu n8n (đọc 23/10/2026), image chính thức đã gỡ trình quản lý gói apk; và kể cả khi cài được, gói sẽ mất mỗi lần container được tạo lại (cập nhật n8n, đổi cấu hình). Cách bền là build image n8n riêng có sẵn Chromium.

Sơ đồ ba cách chạy trình duyệt cho Puppeteer trong n8n: docker exec cộng apk add không dùng nữa vì image mới đã gỡ apk và mất khi tạo lại container; image n8n tuỳ biến từ Dockerfile ghim phiên bản có Chromium và font, chạy docker compose up -d --build, khuyên dùng; trình duyệt từ xa là container Chrome riêng nối qua Browser WebSocket Endpoint

Bước 1: Tạo Dockerfile có Chromium

Trong thư mục chứa docker-compose.yml của n8n, tạo file Dockerfile. Ba dòng COPY --from=alpine:3.22 khôi phục apk theo đúng cách tài liệu n8n hướng dẫn; dòng FROM ghim phiên bản n8n bạn đang chạy thay vì latest.

FROM docker.n8n.io/n8nio/n8n:2.44.6
USER root

# Khôi phục apk (image n8n đã gỡ apk)
COPY --from=alpine:3.22 /sbin/apk /sbin/apk
COPY --from=alpine:3.22 /lib/apk /lib/apk
COPY --from=alpine:3.22 /usr/lib/libapk* /usr/lib/

# Chromium, thư viện và font (có font Noto để hiển thị tiếng Việt)
RUN apk add --no-cache chromium nss freetype harfbuzz ca-certificates ttf-freefont font-noto

ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
    PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
USER node

Cách dựng image tuỳ biến tương tự, dùng để cài FFmpeg, có ở bài FFmpeg là gì và cách tích hợp vào n8n.

Bước 2: Sửa docker-compose.yml để build image

Ở service n8n, thay dòng image: docker.n8n.io/n8nio/n8n bằng khối build, giữ nguyên volume và biến môi trường đang có:

services:
  n8n:
    build: .
    image: n8n-puppeteer:2.44.6
    # giữ nguyên ports, environment, volumes hiện có

Build và khởi động lại:

docker compose up -d --build

Node cộng đồng đã cài nằm trong thư mục dữ liệu /home/node/.n8n (volume), nên không mất khi đổi image. Mỗi lần cập nhật n8n, sửa số phiên bản ở dòng FROM rồi build lại; cách cập nhật có ở bài cập nhật n8n.

Bước 3: Khai báo Executable Path trong node

Image trên đã đặt biến PUPPETEER_EXECUTABLE_PATH, node sẽ tự dùng. Nếu muốn chỉ định riêng cho một node:

  • Mở node Puppeteer, kéo xuống Options → Add Option.
  • Chọn Executable Path.
  • Nhập đường dẫn tuyệt đối: /usr/bin/chromium-browser.
Phần Options của node Puppeteer với ô Executable path điền /usr/bin/chromium-browser
Executable Path trỏ tới Chromium trong container

Bước 4: Tham số sandbox (Launch Arguments)

Trong container, Chrome thường không tạo được sandbox. Node n8n-nodes-puppeteer tự thêm các tham số cho container khi phát hiện đang chạy trong Docker (tuỳ chọn Add Container Arguments). Nếu vẫn lỗi Operation not permitted, thêm thủ công ở Options → Launch Arguments:

--no-sandbox
--disable-setuid-sandbox
--disable-dev-shm-usage
Launch Arguments của node Puppeteer: --no-sandbox, --disable-setuid-sandbox, --disable-dev-shm-usage cùng Executable path
Ba Launch Arguments thường dùng trong container

Lưu ý bảo mật: --no-sandbox tắt lớp cách ly của Chrome. Chỉ dùng trong container, chỉ mở trang bạn tin cậy, không chạy n8n bằng quyền root. Muốn tách hẳn rủi ro, chạy trình duyệt ở container riêng và nối qua tuỳ chọn Browser WebSocket Endpoint của node.

Dùng Puppeteer với n8n thế nào cho đúng quy định?

Puppeteer chỉ nên tự động hoá website bạn có quyền: trang của chính bạn, hệ thống nội bộ, hoặc trang cho phép truy cập tự động trong điều khoản. Đây là nguyên tắc tham khảo, không phải tư vấn pháp lý.

  • Tôn trọng robots.txt và điều khoản: trang cấm thu thập tự động, yêu cầu đăng nhập hoặc hiện CAPTCHA là tín hiệu không nên chạy bot. Không dùng plugin giả lập người dùng để lách cơ chế chống bot.
  • Giới hạn tốc độ: thêm node Wait giữa các lần mở trang, không mở hàng loạt tab cùng lúc trên một site.
  • Không tạo tài khoản hay gửi biểu mẫu hàng loạt trên dịch vụ của người khác: dễ vi phạm điều khoản và bị coi là spam.
  • Dữ liệu cá nhân: không thu thập họ tên, email, số điện thoại của người khác để làm danh sách liên hệ (Nghị định 13/2023/NĐ-CP, Luật Bảo vệ dữ liệu cá nhân số 91/2025/QH15).

Node cộng đồng và Chromium cần n8n tự host. Nếu chưa có máy chủ, xem VPS n8n là gì và khi nào cần.

Muốn chạy n8n 24/7 mà không tự cài? VPS n8n của Tino cài sẵn n8n trên VPS NVMe đặt tại Việt Nam; bạn vẫn có quyền root để cấu hình. Xem cấu hình và giá trên trang sản phẩm.

Những câu hỏi thường gặp

Khi nào nên dùng Puppeteer thay vì node HTTP Request thông thường?

Dùng Puppeteer khi nội dung chỉ hiện sau khi JavaScript chạy (trang React, Vue, Angular), hoặc khi cần cuộn trang, bấm nút, chụp màn hình, xuất PDF. Trang tĩnh hoặc có API thì dùng HTTP Request vì nhanh và nhẹ hơn nhiều.

Làm thế nào để lấy chính xác một đoạn văn bản hoặc giá trị cụ thể trên trang web?

Lấy HTML bằng thao tác Get Page Content rồi tách bằng node HTML (Extract HTML Content) với CSS Selector. Selector lấy bằng cách bấm chuột phải vào phần tử trong Chrome, chọn Inspect, rồi Copy selector.

Puppeteer có thể tự động điền form hoặc nhập dữ liệu vào ô tìm kiếm không?

Có, qua thao tác Run Custom Script với các lệnh như $page.type() và $page.click(). Hãy dùng cho biểu mẫu trên hệ thống của bạn, ví dụ nhập số liệu vào trang quản trị nội bộ không có API.

Làm sao để xử lý các trang web tải nội dung theo dạng "Cuộn vô tận" (Infinite Scroll)?

Dùng Run Custom Script: cuộn xuống cuối trang bằng $page.evaluate(), chờ nội dung mới tải, lặp lại số lần giới hạn rồi mới lấy HTML. Đặt giới hạn số lần cuộn để workflow không chạy mãi.

Chạy Puppeteer trong n8n có tốn nhiều tài nguyên không?

Có. Mỗi lần mở Chromium dùng thêm hàng trăm MB RAM, nên máy chủ nhỏ dễ hết bộ nhớ khi nhiều workflow chạy cùng lúc. Giới hạn số lần chạy đồng thời, đóng trình duyệt sau mỗi lần dùng, hoặc tách trình duyệt ra container riêng.

Đông Tùng

Senior Technology Writer

Là cử nhân Quản trị kinh doanh của Trường Đại học Tài chính - Marketing, Tùng bắt đầu làm việc tại Tino Group từ năm 2021 ở vị trí Content Marketing để thỏa mãn niềm đam mê viết lách của bản thân. Sở hữu khả năng sáng tạo đặc biệt, anh cùng đội ngũ của mình đã tạo nên những chiến dịch quảng cáo độc đáo cùng vô số bài viết hữu ích về nhiều chủ đề khác nhau. Sự tỉ mỉ, kiên trì và tinh thần sáng tạo của Tùng đã góp phần lớn vào thành công của Tino Group trong lĩnh vực marketing trực tuyến.

Xem thêm bài viết

Bài viết liên quan