Giới thiệu
Sử dụng proxy trong Puppeteer là một chủ đề quan trọng mà nhiều lập trình viên quan tâm. Trong bài viết này, tôi sẽ hướng dẫn bạn cách sử dụng proxy trong Puppeteer hiệu quả với các ví dụ mã nhỏ cho những tình huống phổ biến nhất - proxy tĩnh, định tuyến theo trang, xác thực và xoay vòng proxy.
Mục Lục
- Giới thiệu
- Proxy Tĩnh với
--proxy-server - Proxy Cấp Trang / Can Thiệp Yêu Cầu
- Xử Lý Xác Thực Proxy
- Xoay Vòng Proxy
- Khắc Phục Sự Cố
- Ghi Chú Dành Cho Lập Trình Viên
Proxy Tĩnh với --proxy-server
Để sử dụng một proxy cho tất cả các trang, bạn có thể sử dụng cú pháp rất đơn giản và dễ hiểu dưới đây:
javascript
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
args: ['--proxy-server=http://HOST:PORT']
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
Mã trên sẽ hiển thị địa chỉ IP của proxy thay vì địa chỉ IP cục bộ của bạn.
Proxy Cấp Trang / Can Thiệp Yêu Cầu
Puppeteer không hỗ trợ proxy theo trang một cách tự nhiên. Bạn có thể sử dụng thư viện puppeteer-page-proxy để định tuyến các yêu cầu một cách riêng biệt cho từng trang.
bash
npm install puppeteer puppeteer-page-proxy
Ví dụ:
javascript
import puppeteer from 'puppeteer';
import useProxy from 'puppeteer-page-proxy';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', req => useProxy(req, 'http://user:password@host:port'));
await page.goto('https://httpbin.org/ip');
await browser.close();
Mỗi yêu cầu sẽ đi qua proxy mà bạn chỉ định.
Xử Lý Xác Thực Proxy
Phương pháp xác thực này sẽ không hoạt động:
javascript
const browser = await puppeteer.launch({
args: ['--proxy-server=http://host:port']
});
Thay vào đó, hãy sử dụng ví dụ trước với puppeteer-page-proxy, hoặc nếu proxy HTTP/HTTPS yêu cầu đăng nhập, hãy sử dụng page.authenticate().
javascript
const browser = await puppeteer.launch({
args: ['--proxy-server=http://host:port']
});
const page = await browser.newPage();
await page.authenticate({ username: 'USER', password: 'PASS' });
await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
Luôn thực hiện xác thực trước khi điều hướng đến trang.
Xoay Vòng Proxy
Để tránh bị chặn, bạn nên xoay vòng các proxy. Kết hợp với các user-agent ngẫu nhiên sẽ mang lại kết quả tốt hơn.
javascript
const pool = [
'http://user:password@host1:port',
'http://user:password@host2:port',
'http://user:password@host3:port'
];
let i = 0;
function getNextProxy() {
return pool[i++ % pool.length];
}
const proxy = getNextProxy();
const browser = await puppeteer.launch({ args: [`--proxy-server=${proxy}`] });
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
Bạn có thể mở rộng điều này với việc xoay vòng các header hoặc logic thử lại cho các proxy bị chặn. Dưới đây là liên kết đến danh sách các User Agents mới nhất.
Khắc Phục Sự Cố
Những lỗi thường gặp:
407 Proxy Authentication Required: Kiểm tra tên đăng nhập/mật khẩu và gọipage.authenticate(). Điều này cũng có thể xảy ra nếu bạn đã sử dụng sai phương pháp xác thực.ERR_PROXY_CONNECTION_FAILED: Kiểm tra máy chủ và cổng, hãy thử kết nối bằng curl trước.403/CAPTCHA: Xoay vòng proxy, headers hoặc user-agent.
Ghi Chú Dành Cho Lập Trình Viên
- Hướng Dẫn Chi Tiết Về Cách Thiết Lập Proxy Trong Puppeteer
- Nhiều ví dụ hơn trên Github
- Tham gia Discord của chúng tôi
Nếu bạn cần bất kỳ ví dụ nào mà tôi có thể đã bỏ lỡ, hãy để lại bình luận và tôi sẽ thêm chúng.