要在 Node.js 中为 Puppeteer 配置代理,请在浏览器启动参数中设置 --proxy-server=<proxy_address>:<port>,将全部浏览器流量经由指定代理转发。这样即可在自动化网页操作中隐藏 IP 地址、进行地域定向,或绕过速率限制和 IP 封禁。
基础代理配置
Puppeteer 控制一个 Chromium 实例,并通过命令行参数直接传入代理设置。主要参数是 --proxy-server。
指定代理服务器
--proxy-server 参数接收代理的地址和端口。协议(HTTP、HTTPS、SOCKS4、SOCKS5)可以显式声明;若省略,通常默认按 HTTP 处理。
const puppeteer = require('puppeteer');
async function launchBrowserWithProxy(proxyAddress) {
const browser = await puppeteer.launch({
args: [
`--proxy-server=${proxyAddress}`,
// 可选:若需极致匿名,可考虑禁用 WebRTC
// '--disable-features=WebRTC'
],
headless: true, // 若需有界面模式则设为 false
});
const page = await browser.newPage();
return { browser, page };
}
async function runBasicProxyExample() {
const proxy = 'http://your-proxy-ip:port'; // 示例:'http://192.168.1.1:8080' 或 'socks5://192.168.1.1:1080'
let browser;
try {
const { browser: launchedBrowser, page } = await launchBrowserWithProxy(proxy);
browser = launchedBrowser; // 赋值给外层作用域变量,供 finally 块使用
await page.goto('https://httpbin.org/ip'); // 用于显示外部 IP 的服务
const ipInfo = await page.evaluate(() => document.body.textContent);
console.log('External IP through proxy:', ipInfo);
} catch (error) {
console.error('Error launching browser with proxy:', error);
} finally {
if (browser) {
await browser.close();
}
}
}
runBasicProxyExample();
请把 your-proxy-ip:port 替换为您代理服务器的真实 IP 地址和端口。并确保协议前缀(如 http://、socks5://)与您的代理类型一致。
需要认证的代理
许多代理服务需要认证。Puppeteer 在浏览器和页面初始化之后通过 page.authenticate() 处理认证,向代理发送 HTTP Basic 认证头。
代理认证方式
page.authenticate(): 在 Puppeteer 中进行 HTTP Basic 认证的推荐做法。- 在
--proxy-server中使用username:password@ip:port: 虽然部分工具直接支持该格式,但 Puppeteer 的标准认证做法仍是page.authenticate()。
const puppeteer = require('puppeteer');
async function launchBrowserWithAuthenticatedProxy(proxyAddress, username, password) {
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyAddress}`],
headless: true,
});
const page = await browser.newPage();
// 在代理上完成认证
await page.authenticate({ username, password });
return { browser, page };
}
async function runAuthenticatedProxyExample() {
const proxy = 'http://your-authenticated-proxy-ip:port';
const proxyUsername = 'your_username';
const proxyPassword = 'your_password';
let browser;
try {
const { browser: launchedBrowser, page } = await launchBrowserWithAuthenticatedProxy(proxy, proxyUsername, proxyPassword);
browser = launchedBrowser;
await page.goto('https://httpbin.org/ip');
const ipInfo = await page.evaluate(() => document.body.textContent);
console.log('External IP through authenticated proxy:', ipInfo);
} catch (error) {
console.error('Error with authenticated proxy:', error);
} finally {
if (browser) {
await browser.close();
}
}
}
runAuthenticatedProxyExample();
代理轮换策略
在大规模抓取中,单个代理容易触发限流。代理轮换是指在多个代理服务器之间切换,以分散请求并保持匿名。
实现代理轮换
- 维护代理列表: 把可用代理存放在数组中,必要时包含认证信息。
- 选择逻辑: 为每个新的浏览器实例或请求设计一套挑选代理的策略。常见策略:轮询(Round-Robin)、随机选择、加权轮换。
```javascript
const puppeteer = require('puppeteer');
// 代理列表示例,其中部分带有认证信息
const proxyConfigurations = [
{ address: 'http://proxy1.example.com:8080' },
{ address: 'http://auth-proxy1.example.com:8080', username: 'userA', password: 'passA' },
{ address: 'socks5://proxy3.
