跳转到内容
Guides 1 分钟阅读 1257 次浏览

Node.js 中的 Puppeteer 代理配置

掌握 Node.js 项目中的 Puppeteer 代理配置。本指南涵盖集成、配置以及稳健的网页自动化与抓取的最佳实践。

Browser
Node.js 中的 Puppeteer 代理配置

要在 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 认证头。

代理认证方式

  1. page.authenticate() 在 Puppeteer 中进行 HTTP Basic 认证的推荐做法。
  2. --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();

代理轮换策略

在大规模抓取中,单个代理容易触发限流。代理轮换是指在多个代理服务器之间切换,以分散请求并保持匿名。

实现代理轮换

  1. 维护代理列表: 把可用代理存放在数组中,必要时包含认证信息。
  2. 选择逻辑: 为每个新的浏览器实例或请求设计一套挑选代理的策略。常见策略:轮询(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.

已更新: 03.03.2026
返回分类

试用我们的代理

遍布 100+ 国家的 20,000+ 代理

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.