0
0
Lập trình
Admin Team
Admin Teamtechmely

Sử Dụng Proxy Với Puppeteer: Giải Pháp Không Bị Chặn

Đăng vào 5 tháng trước

• 2 phút đọc

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

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 Copy
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 Copy
npm install puppeteer puppeteer-page-proxy

Ví dụ:

javascript Copy
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 Copy
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 Copy
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 Copy
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ọi page.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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào