Cấu hình proxy rotating và sticky trong Playwright (Node.js) để scraping hiệu quả
9 tháng 7, 2026
Playwright là một công cụ tự động hoá trình duyệt mạnh mẽ, được sử dụng rộng rãi trong scraping, kiểm thử tự động và giám sát website. Khi thực hiện các tác vụ gửi nhiều request tới cùng một miền, khả năng bị chặn IP là rất cao nếu không sử dụng proxy đúng cách. Bài viết này sẽ giải thích sự khác biệt giữa proxy rotating và sticky, khi nào nên dùng từng loại, và cung cấp các bước cụ thể để tích hợp chúng vào dự án Playwright viết bằng Node.js.
Proxy rotating vs sticky: khi nào dùng gì?
Proxy rotating
Proxy rotating thay đổi địa chỉ IP sau mỗi request (hoặc sau một khoảng thời gian ngắn). Điều này giúp:
- Giảm nguy cơ bị phát hiện là bot vì mỗi request xuất phát từ IP khác nhau.
- Thông thường thích hợp cho việc thu thập dữ liệu từ trang web có giới hạn tốc độ strict (rate limit) hoặc cơ chế chặn dựa trên IP.
- Tuy nhiên, việc thay đổi IP liên tục có thể gây ra vấn đề khi cần duy trì phiên làm việc (login, cookie) vì mỗi request sẽ xuất hiện như người dùng mới.
Proxy sticky (hoặc session persistent)
Proxy sticky giữ nguyên cùng một IP trong một khoảng thời gian xác định (ví dụ 10‑30 phút) hoặc cho tới khi kết nối bị ngắt. Lợi ích:
- Duy trì cookie, localStorage và các thông tin phiên, rất hữu ích khi cần đăng nhập và thực hiện các thao tác liên tiếp trên cùng một tài khoản.
- Giảm số lần thay đổi IP, vì vậy giảmภาระ cho máy chủ proxy và có thể tăng tốc độ phản hồi do ít thay đổi kết nối TCP.
- Nhược điểm: nếu IP được đánh dấu là suspicious, toàn bộ phiên sẽ bị chặn.
Khi nào chọn哪一种?
- Scraping danh sách công khai (giá sản phẩm, tin tức, dữ liệu công khai): dùng rotating để tối đa hoá số request mà không lo bị chặn.
- Tự động hoá đăng nhập và tương tác (quản lý tài khoản mạng xã hội, đăng bài, đặt hàng): dùng sticky để giữ phiên đăng nhập trong suốt quy trình.
- Kết hợp: trong một quy trình phức tạp, bạn có thể bắt đầu bằng sticky để đăng nhập, sau đó chuyển sang rotating để thu thập dữ liệu sau khi đã có cookie cần thiết.
Cấu hình Playwright để sử dụng proxy
Playwright cho phép thiết lập proxy trực tiếp khi khởi động trình duyệt qua đối tượng launchOptions. Dưới đây là cách cài đặt và ví dụ thực tế cho cả hai loại proxy.
Cài đặt dependencies
Trước tiên, cần cài đặt Playwright và éventuellement một thư viện để quản lý danh sách proxy (nếu bạn tự utrzym danh sách).
npm i playwright
# Tùy chọn: nếu muốn luân chuyển proxy tự động từ danh sách
npm i proxy-list
Ví dụ cấu hình rotating proxy
Giả sử bạn có một danh sách proxy HTTP/HTTPS từ RoProxy (hoặc bất kỳ nhà cung cấp nào). Mỗi proxy có định dạng host:port:username:password. Dưới đây là hàm tạo một proxy ngẫu nhiên từ danh sách và khởi tạo trình duyệt.
const { chromium } = require('playwright');
const proxyList = require('proxy-list'); // thư viện tùy chọn
// Danh sách proxy mẫu (thay bằng danh sách thực từ RoProxy)
const RAW_PROXIES = [
'185.199.108.153:3128:user1:pass1',
'185.199.109.153:3128:user2:pass2',
'185.199.110.153:3128:user3:pass3',
];
function getRandomProxy() {
const proxy = RAW_PROXIES[Math.floor(Math.random() * RAW_PROXIES.length)];
const [host, port, username, password] = proxy.split(':');
return { server: `http://${host}:${port}`, username, password };
}
(async () => {
const proxy = getRandomProxy();
const browser = await chromium.launch({
headless: false, // set true khi chạy production
proxy: proxy,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();
})();
Giải thích:
- Mỗi lần chạy script, chúng ta chọn ngẫu nhiên một proxy từ danh sách, do đó địa chỉ IP sẽ thay đổi giữa các lần chạy (rotating ở mức luồng).
- Nếu muốn thay đổi IP trong cùng một luồng sau mỗi request, bạn có thể đóng và mở lại context hoặc sử dụng
page.routeđể can thiệp vào mỗi request và thay đổi proxy trên-the-fly (phức tạp hơn, ít dùng).
Ví dụ cấu hình sticky proxy
Để duy trì cùng một IP trong suốt phiên, bạn chỉ cần sử dụng một proxy cố định khi khởi tạo browser và không thay đổi nó tới khi kết thúc.
const { chromium } = require('playwright');
const STICKY_PROXY = {
server: 'http://185.199.108.153:3128',
username: 'userSticky',
password: 'passSticky',
};
(async () => {
const browser = await chromium.launch({
headless: false,
proxy: STICKY_PROXY,
});
// Tạo một context để lưu trữ cookie, localStorage, etc.
const context = await browser.newContext();
// Bước 1: Đăng nhập
await context.addCookies([{ name: 'sessionid', value: 'abc123', domain: '.example.com', path: '/' }]);
const page = await context.newPage();
await page.goto('https://example.com/login');
await page.fill('#username', 'myuser');
await page.fill('#password', 'mypassword');
await page.click('button[type="submit"'];
await page.waitForNavigation();
// Bước 2: Thực hiện các thao tác sau đăng nhập mà không lo bị chặn IP
for (let i = 0; i < 5; i++) {
await page.goto(`https://example.com/product/${i}`);
await page.screenshot({ path: `product-${i}.png` });
await page.waitForTimeout(1000); // tránh gửi quá nhanh
}
await browser.close();
})();
Lưu ý:
- Cookie và dữ liệu phiên được lưu trong
context. Nếu bạn tạo nhiều context từ cùng một browser nhưng mỗi context sử dụng proxy khác, bạn sẽ có các phiên độc lập nhưng vẫn giữ IP固定 trong mỗi context. - Nếu cần luân chuyển sticky sau một khoảng thời gian (ví dụ sau 20 phút), bạn có thể đóng context hiện tại và tạo context mới với proxy khác.
Xử lý lỗi và tối hoá
Kiểm tra kết nối proxy
Trước khi thực hiện các thao tác quan trọng, hãy kiểm tra xem proxy có hoạt động không bằng cách truy cập một endpoint trả về IP công khai.
async function testProxy(page) {
await page.goto('https://api.ipify.org?format=json');
const ipInfo = await page.evaluate(() => JSON.parse(document.body.textContent));
console.log('IP hiện tại qua proxy:', ipInfo.ip);
return ipInfo.ip;
}
Nếu kết nối thất bại, bạn có thể tự động chuyển sang proxy khác trong danh sách (rotating) hoặc báo lỗi để quản trị intervenir.
Thay đổi User-Agent và headers
Một số trang web kiểm tra User-Agent để phát hiện bot. Kết hợp proxy với việc xoay User-Agent sẽ tăng độ tin cậy.
const USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15',
];
function getRandomUA() {
return USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)];
}
// Khi tạo context
const context = await browser.newContext({
userAgent: getRandomUA(),
});
Giới hạn số luồng và delay
Để tránh kích hoạt cơ chế chặn dựa trên tần suất request, hùm dùng khoảng thời gian ngẫu nhiên giữa các request và giới hạn số luồng song song.
async function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
for (const url of urlList) {
await page.goto(url);
// xử lý trang
await delay(Math.floor(Math.random() * 2000) + 500); // 0.5‑2.5 giây
}
Best practices khi dùng proxy với Playwright
- Luôn sử dụng proxy có authentication nếu có thể; điều này giảm nguy cơ bị l dụng bởi người khác.
- Theo dõi mức độ thành công của mỗi proxy (số request thành công / tổng request). Loại bỏ proxy có tỉ lệ thất bại cao khỏi danh sách rotating.
- Luôn đóng browser và context sau khi hoàn thành để giải phóng kết nối proxy và tránh rò rỉ.
- Kiểm tra pháp lý và倫理 của việc scraping mục tiêu; tôn trọng
robots.txtvà các điều khoản sử dụng. - Kết hợp với công cụ giải CAPTCHA nếu cần; một số nhà cung cấp proxy (như RoProxy) cung cấp dịch vụ proxy có tích hợp giải CAPTCHA để giảm tải.
Kết luận
Việc chọn đúng loại proxy (rotating hoặc sticky) và cấu hình chúng một cách chính xác trong Playwright sẽ giúp bạn xây dựng các trình thu thập dữ liệu mạnh mẽ, ổn định và ít bị chặn hơn. Hy vọng các ví dụ và najleps practices ở trên sẽ giúp bạn áp dụng ngay vào dự án Node.js của mình. Nếu bạn đang tìm một nhà cung cấp proxy chất lượng cao với danh sách IP đa dạng, tốc độ tốt và hỗ trợ kỹ thuật, hãy xem xét RoProxy như một lựa chọn đáng tin cậy.
Chúc bạn thành công trong các dự án scraping và tự động hoá!