Cấu hình proxy cho Puppeteer (Node.js) để tránh chặn IP và tăng độ tin cậy scraping
25 tháng 7, 2026
Tại sao cần proxy khi dùng Puppeteer?
Puppeteer là công cụ mạnh mẽ để điều khiển trình duyệt headless Chromium, thường được sử dụng trong tự động hóa kiểm tra, scraping và監控 website. Khi thực hiện nhiều request liên tục từ cùng một địa chỉ IP, trang web dễ dàng phát hiện hành vi bất thường và áp dụng các biện pháp chặn như CAPTCHA, giới hạn tốc độ hoặc nawet chặn hoàn toàn IP.
Việc sử dụng proxy giúp:
- Ẩn địa chỉ IP thực của bạn.
- Xoay IP để giảm nguy cơ bị đánh dấu là bot.
- Giữ session nhất quán (sticky session) khi cần đăng nhập hoặc duy trì cookie.
- Mô phỏng truy cập từ các vị trí địa lý khác nhau để kiểm tra nội dung địa phương.
Các loại proxy phù hợp với Puppeteer
Proxy xoay (rotating)
Mỗi request hoặc mỗi kết nối mới sẽ được分配 một IP khác từ một pool. Phù hợp khi bạn cần gửi lượng lớn request mà không muốn bị giới hạn tốc độ.
Proxy sticky (đính kèm)
Giữ cùng một IP trong một khoảng thời gian nhất định (ví dụ 10‑30 phút). Hữu ích khi cần duy trì trạng thái đăng nhập hoặc session khi làm việc với các trang web yêu cầu cookie.
Proxy datacenter vs residential
- Datacenter: tốc độ cao, giá rẻ nhưng dễ bị nhận diện là proxy.
- Residential: IP của nhà cung cấp internet thực tế, khó chặn hơn, giá cao hơn.
Cho Puppeteer, việc kết hợpresidential rotating cho scraping công cộng và datacenter sticky cho các tác vụ cần đăng nhập thường cho kết quả tốt nhất.
Cài đặt môi trường
Trước hết, đảm bảo bạn đã cài đặt Node.js (phiên bản 14 trở lên) và npm. Sau đó khởi tạo project và cài đặt puppeteer.
mkdir puppeteer-proxy-demo && cd puppeteer-proxy-demo
npm init -y
npm install puppeteer
Nếu bạn muốn quản lý danh sách proxy xoay một cách dễ dàng, có thể thêm thư viện proxy-chain hoặc sử dụng mảng đơn giản.
npm install proxy-chain
Cấu hình proxy cơ bản
Puppeteer cho phép truyền tham số --proxy-server khi khởi tạo trình duyệt. Dưới đây là ví dụ đơn giản sử dụng một proxy HTTP không cần xác thực.
const puppeteer = require('puppeteer');
(async () => {
const proxyUrl = 'http://123.45.67.89:3128'; // thay bằng proxy của bạn
const browser = await puppeteer.launch({
headless: false, // set true cho production
args: [`--proxy-server=${proxyUrl}`]
});
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();
})();
Xác thực proxy
Nếu proxy yêu cầu tên người dùng và mật khẩu, Puppeteer không hỗ trợ trực tiếp qua --proxy-server. Khi đó chúng ta sử dụng sự kiện request hoặc thư viện proxy-chain để tạo một proxy local không cần auth.
Sử dụng proxy-chain
const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');
(async () => {
const proxyUrl = 'http://user:[email protected]:3128';
const newProxyUrl = await proxyChain.anonymizeProxy(proxyUrl);
const browser = await puppeteer.launch({
args: [`--proxy-server=${newProxyUrl}`]
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
// Đóng proxy local sau khi xong
await proxyChain.closeAnonymizedProxy(newProxyUrl, true);
})();
Xoay proxy và sticky session
Xoay proxy mỗi request
Bạn có thể tạo một mảng proxy và chọn ngẫu nhiên mỗi khi khởi tạo một trang mới.
const proxies = [
'http://proxy1.example.com:3128',
'http://proxy2.example.com:3128',
'http://proxy3.example.com:3128'
];
function getRandomProxy() {
return proxies[Math.floor(Math.random() * proxies.length)];
}
(async () => {
for (let i = 0; i < 5; i++) {
const proxy = getRandomProxy();
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxy}`]
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(`Request ${i + 1} IP:`, await page.evaluate(() => document.body.innerText));
await browser.close();
}
})();
Sticky session
Nếu bạn cần giữ cùng một IP trong một phiên làm việc (ví dụ đăng nhập và thực hiện một số thao tác), chỉ cần khởi tạo một browser duy nhất và sử dụng cùng một proxy cho tất cả các tab trong phiên đó.
const stickyProxy = 'http://residential.proxy.example.com:3128';
(async () => {
const browser = await puppeteer.launch({
args: [`--proxy-server=${stickyProxy}`]
});
const page = await browser.newPage();
await page.goto('https://login.example.com');
await page.type('#username', 'myuser');
await page.type('#password', 'mypass');
await page.click('#submit');
await page.waitForNavigation();
// Sau khi đăng nhập, tiếp tục scraping với cùng IP
await page.goto('https://dashboard.example.com/data');
const data = await page.evaluate(() => document.querySelector('#data').innerText);
console.log(data);
await browser.close();
})();
Xử lý xác thực proxy mà không làm gián đoạn luồng
Nếu bạn không muốn dùng proxy-chain, có thể mở rộng Puppeteer bằng cách lắng nghe sự kiện request và cung cấp thông tin xác thực qua page.authenticate. Tuy nhiên, cách này chỉ hoạt động cho các kết nối HTTPS và cần phải được gọi trước khi trang tải.
await page.authenticate({ username: 'user', password: 'pass' });
Lưu ý: page.authenticate phải được gọi sau khi page.goto bắt đầu nhưng trước khi phản hồi trả về. Trong thực tế, việc kết hợp với proxy-chain thường đơn giản và ổn định hơn.
Tránh detection và CAPTCHA
Même khi dùng proxy, trang web vẫn có thể phát hiện bot qua các dấu hiệu như:
- User-agent headless mặc định.
- Kích thước viewport không thường見.
- absence của các plugin hoặc font.
Các biện pháp bổ sung
- Thay đổi User-agent
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36');
- Đặt viewport giống như trình duyệt thực
await page.setViewport({ width: 1366, height: 768 });
- Tắt chế độ headless hoặc dùng puppeteer-extra với plugin stealth
npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const stealth = require('puppeteer-extra-plugin-stealth');
puppeteer.use(stealth());
(async () => {
const browser = await puppeteer.launch({ headless: true, args: [`--proxy-server=${proxyUrl}`] });
// ...
})();
- Chờ ngẫu nhiên giữa các thao tác
await page.waitForTimeout(Math.random() * 2000 + 800); // 0.8‑2.8s
Kết hợp proxy xoay với các biện pháp trên sẽ giảm đáng kể nguy cơ gặp CAPTCHA hoặc bị chặn.
Gỡ lỗi phổ biến
Lỗi "NET::ERR_PROXY_CONNECTION_FAILED"
- Kiểm tra lại địa chỉ proxy và cổng.
- Đảm bảo proxy cho phép kết nối từ IP máy bạn (whitelist).
- Nếu cần xác thực, xác nhận tên người dùng/mật khẩu.
Lỗi "net::ERR_TUNNEL_CONNECTION_FAILED" khi sử dụng proxy-chain
- Đảm bảo bạn đã đóng proxy local sau mỗi lần sử dụng (
await proxyChain.closeAnonymizedProxy). - Kiểm tra phiên bản Node.js (>=10) và proxy-chain (>=1.0).
Trang tải rất chậm
- Thử đổi sang proxy có tốc độ tốt hơn (thường là datacenter nếu bạn cần tốc độ, residential nếu cần ẩn danh cao).
- Giảm số lượng request đồng thời; tăng thời gian chờ giữa các request.
IP vẫn bị chặn sau khi xoay
- Kiểm tra xem proxy bạn sử dụng có được đánh dấu là proxy công khai không (nhiều trang web có danh sách đen).
- Thay đổi sang proxy residential chất lượng cao hoặc sử dụng dịch vụ proxy có khả năng xoay IP theo thời gian thực (như RoProxy cung cấp).
Kết luận
Việc tích hợp proxy vào workflow Puppeteer không chỉ giúp bạn tránh bị chặn mà còn nâng cao độ tin cậy và khả năng mở rộng của các tác vụ scraping và tự động hoá. Bắt đầu từ cấu hình cơ bản, sau đó dần進階 tới xoay proxy, duy trì session và bổ sung các biện pháp chống detection. Hãy luôn thử nghiệm với một vài proxy trước khi mở rộng quy mô, và ghi nhật ký kết quả để điều chỉnh chiến lược phù hợp.
Nếu bạn đang tìm một nhà cung cấp proxy đáng tin cậy với pool IP đa dạng, hỗ trợ cả HTTP và SOCKS5, và cung cấp API để lấy danh sách IP xoay thực thời, hãy xem xét các dịch vụ như RoProxy – chúng cung cấp tài liệu tích hợp chi tiết và hỗ trợ kỹ thuật giúp bạn triển khai nhanh chóng mà không lo lắng về vấn đề proxy.
Chúc bạn thành công trong việc xây dựng các hệ thống scraping ổn định và hiệu quả!