跳转到内容
Guides 2 分钟阅读 1367 次浏览

在 Node.js 中使用代理

了解如何在 Axios、Puppeteer 和 Playwright 中使用 Node.js 代理,借助安全的 GProxy 集成提升数据抓取与自动化效率。

在 Node.js 中使用代理

HTTP 代理是位于您的 Node.js 应用与目标服务器之间的中间服务器,负责转发请求和响应。在 Node.js 中通过 axios、Puppeteer 和 Playwright 等库使用代理,可以隐藏您的 IP 地址、绕过地域限制、对请求做负载均衡,并更高效地抓取网站数据。本文提供了配置这些库使用代理的实用示例。

使用 Axios 配置代理

Axios 是 Node.js 中常用的基于 promise 的 HTTP 客户端。通过 proxy 配置项,在 Axios 中设置代理非常简单。

基本代理配置

proxy 选项接收一个对象,包含 hostportusernamepassword 等属性。

const axios = require('axios');

async function fetchData() {
  try {
    const response = await axios.get('https://api.example.com/data', {
      proxy: {
        host: 'your_proxy_host',
        port: 8080,
        username: 'your_username', // 可选
        password: 'your_password'  // 可选
      }
    });
    console.log(response.data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

请把 your_proxy_host8080 替换为您实际的代理主机和端口。如果代理需要身份验证,请填写 usernamepassword

使用环境变量

出于安全性和可维护性考虑,最好把代理凭据保存在环境变量中。

const axios = require('axios');

async function fetchData() {
  try {
    const proxyHost = process.env.PROXY_HOST;
    const proxyPort = process.env.PROXY_PORT;
    const proxyUsername = process.env.PROXY_USERNAME;
    const proxyPassword = process.env.PROXY_PASSWORD;

    const response = await axios.get('https://api.example.com/data', {
      proxy: {
        host: proxyHost,
        port: parseInt(proxyPort), // 确保端口为整数
        username: proxyUsername,
        password: proxyPassword
      }
    });
    console.log(response.data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

运行脚本前请务必设置好环境变量。例如,在终端中执行:

export PROXY_HOST=your_proxy_host
export PROXY_PORT=8080
export PROXY_USERNAME=your_username
export PROXY_PASSWORD=your_password
node your_script.js

处理 HTTPS 代理

使用 HTTPS 代理时,请确认代理支持 CONNECT 方法。Axios 使用相同的配置即可无缝处理 HTTPS 代理。

使用 Puppeteer 配置代理

Puppeteer 是一个 Node.js 库,提供控制无头 Chrome 或 Chromium 的高级 API。在需要避免 IP 封禁或访问地域受限内容的 web scraping 与自动化任务中,为 Puppeteer 配置代理十分关键。

带代理启动 Puppeteer

启动 Puppeteer 时,可以通过 --proxy-server 启动参数配置代理。

const puppeteer = require('puppeteer');

async function scrapeWebsite() {
  const browser = await puppeteer.launch({
    args: [
      `--proxy-server=http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`
    ]
  });

  const page = await browser.newPage();
  await page.goto('https://www.example.com');
  console.log(await page.title());

  await browser.close();
}

scrapeWebsite();

请把 process.env.PROXY_HOSTprocess.env.PROXY_PORT 替换为您的代理主机和端口。注意本示例假设使用 HTTP 代理;若为 HTTPS 代理,请在 --proxy-server 参数中使用 https://

Puppeteer 中的带认证代理

Puppeteer 不支持通过启动参数直接传递用户名和密码进行认证,需要在页面上下文中处理认证。

const puppeteer = require('puppeteer');

async function scrapeWebsite() {
  const browser = await puppeteer.launch({
    args: [
      `--proxy-server=http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`
    ]
  });

  const page = await browser.newPage();

  // 使用 page.authenticate 完成代理认证
  await page.authenticate({
    username: process.env.PROXY_USERNAME,
    password: process.env.PROXY_PASSWORD,
  });

  await page.goto('https://www.example.com');
  console.log(await page.title());

  await browser.close();
}

scrapeWebsite();

page.authenticate() 方法会把所需凭据提供给代理服务器。该方法必须在跳转到目标页面之前调用。

关于按请求设置代理的说明

Puppeteer 会把代理设置全局应用于整个浏览器实例。如果不同请求需要使用不同代理,就必须启动多个浏览器实例,每个实例配置不同的代理。或者,可以考虑使用能拦截请求并按请求应用代理设置的库(较少见,也更复杂)。

使用 Playwright 配置代理

Playwright 是另一个功能强大的 Node.js 浏览器自动化与端到端测试库。与 Puppeteer 一样,它也支持为浏览器实例配置代理。

带代理启动 Playwright

相比 Puppeteer,Playwright 提供了更直接的代理配置方式:在 launch 选项中使用 proxy 属性。

const { chromium } = require('playwright');

async function scrapeWebsite() {
  const browser = await chromium.launch({
    proxy: {
      server: `http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`,
      username: process.env.PROXY_USERNAME,
      password: process.env.PROXY_PASSWORD,
    }
  });

  const page = await browser.newPage();
  await page.goto('https://www.example.com');
  console.log(await page.title());

  await browser.close();
}

scrapeWebsite();

这种方式更简洁、更明确,因为它在代理配置内部直接支持用户名和密码认证。

按上下文设置代理

Playwright 支持浏览器上下文(context),可在单个浏览器实例内实现相互隔离的浏览会话。每个上下文都可以有自己的代理配置。这非常适合并行运行多个任务,且每个任务使用不同的代理。

const { chromium } = require('playwright');

async function scrapeWebsite() {
  const browser = await chromium.launch();

  const context = await browser.newContext({
      proxy: {
        server: `http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`,
        username: process.env.PROXY_USERNAME,
        password: process.env.PROXY_PASSWORD,
      }
  });

  const page = await context.newPage();
  await page.goto('https://www.example.com');
  console.log(await page.title());

  await browser.close();
}

scrapeWebsite();

对比表:代理配置

特性 Axios Puppeteer Playwright
配置方式 请求配置中的 proxy 选项 --proxy-server 启动参数、page.authenticate() launchnewContext 中的 proxy 选项
认证方式 proxy 中的 usernamepassword page.authenticate() proxy 中的 usernamepassword
HTTPS 支持 支持,配置与 HTTP 相同 支持,在 --proxy-server 中使用 https:// 支持,配置与 HTTP 相同
按请求设置代理 不支持,对 Axios 实例全局生效 不支持,对浏览器实例全局生效 支持,通过浏览器上下文实现

最佳实践

  • 使用环境变量: 把代理凭据存放在环境变量中,避免硬编码在代码里。
  • 处理错误: 实现错误处理,妥善应对代理连接问题。
  • 轮换代理: 做 web scraping 时要频繁轮换代理以避免 IP 封禁,可考虑使用代理池。
  • 测试配置: 通过代理查询自己的 IP 地址,确认代理正常工作。可使用 whatismyipaddress.com 等网站。
  • 使用安全代理: 使用安全代理(HTTPS 或 SOCKS5)来加密流量。
  • 法律注意事项: 确保您的抓取行为符合目标网站的服务条款和所有适用法律。

结论

在 Node.js 中用 axios、Puppeteer 和 Playwright 配置代理,对于 web scraping、绕过地域限制和增强隐私等多种任务都必不可少。各个库的代理配置方式不同,其中 Playwright 最灵活、最直接,尤其适合带认证的代理和按上下文配置的场景。遵循本文列出的最佳实践,您就能在 Node.js 应用中高效使用代理。

已更新: 26.01.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.