返回博客

如何在 Node.js 中使用 Axios 配置代理

-
目录
-

核心要点:

  • Axios 在 Node.js 中原生支持 HTTP 和 HTTPS 代理,通过 CONNECT 方法将 HTTPS 流量隧道传输至目标服务器。
  • 轮换住宅代理可以降低 IP 被封的概率,但高级反机器人系统仍有可能检测到这类流量。
  • Axios 本身不支持 SOCKS5,因此需要借助外部代理库来处理此类连接。

在进行网络爬取或调用外部 API 时,经常会遇到速率限制和地区封锁。如果从同一个 IP 地址发送过多请求,安全系统会标记该流量并断开连接。为避免这种情况,需要通过代理将请求转发至不同的 IP,以保持较高的请求成功率。

Axios 代理会将您的 HTTP 请求通过中介服务器转发。虽然 Node.js 自带 HTTP 模块,但大多数开发者仍然更倾向于使用 Axios,因为它更灵活、更易用。

下面介绍如何为 HTTP、HTTPS 和 SOCKS5 连接配置 Axios 代理,以提升请求成功率。

什么是 Axios?

Axios 是一个基于 Promise 的 HTTP 客户端,可用于 Node.js 和浏览器环境。使用代理时,Axios 会将请求发送至中介服务器,再由代理服务器代表您访问目标网站、下载数据,并将结果返回给您的应用程序。

尽管 Node.js 现已原生内置 Fetch API,但开发者仍然更偏爱 Axios,因为它使用起来更方便:它会自动解析 JSON 响应、内置拦截器可用于修改请求,并且在网络超时配置上比原生 Fetch 更简单。

如何在 Axios 中设置代理

首先创建一个 Node.js 项目并执行 npm install axios。要通过代理转发流量,需在请求配置中直接传入一个代理配置对象,该对象通常包含 3 个属性:host、port 和 protocol(默认值为 HTTP)。如果使用付费代理,还需要添加 auth 属性。

可以根据所需的代理协议,直接在请求配置中定义代理设置。Axios 原生的代理对象可同时处理 HTTP 和 HTTPS 目标,因此无论端点使用哪种代理协议,同一套代理配置都可以使用。

const axios = require('axios');
 
async function checkIp() {
  try {
    const response = await axios.get('https://api.ipify.org?format=json', {
      proxy: {
        protocol: 'http',
        host: 'ultra.marsproxies.com',
        port: 44443,
      }
    });
    console.log(response.data);
  } catch (error) {
    console.error(error.message);
  }
}
 
checkIp();

运行该脚本后,目标服务器看到的将是代理 IP,而不是您本地设备的 IP。如果返回的 IP 与您的代理服务器一致,说明配置正确。

如何在 Axios 中使用需认证的代理

开放代理通常速度慢、不稳定、安全性差,与优质住宅代理相比往往不值得花时间使用。大多数开发者依赖付费代理供应商,而访问其网络需要进行代理认证。要在 Axios 中完成认证,需在代理配置中添加一个包含用户名和密码的 auth 对象。

与上一个示例一样,我们在代理配置中使用的是 HTTP 目标 URL,因为原生 Axios 在代理 HTTPS 端点时存在困难。

const axios = require('axios');
 
async function checkAuthenticatedIp() {
  try {
    const response = await axios.get('https://api.ipify.org?format=json', {
      proxy: {
        protocol: 'http',
        host: 'ultra.marsproxies.com',
        port: 44443,
        auth: {
          username: 'your_marsproxies_username',
          password: 'your_marsproxies_password'
        }
      }
    });
    console.log(response.data);
  } catch (error) {
    console.error(error.message);
  }
}
 
checkAuthenticatedIp();

如果在代理配置中错误设置或遗漏了这些凭据,代理服务器将返回 HTTP 407 Proxy Authentication Required 错误。

如何在 Axios 中轮换代理

从同一个 IP 地址发送过多请求,很快就会导致 爬虫被封。为了在网络爬取过程中不超出速率限制,需要借助代理池实现代理轮换,让每个请求看起来都来自不同的 IP。

如果您管理的是一个静态代理组成的代理池,可以编写一个代理轮换函数,在多个代理之间循环切换,以此分散流量。

需要注意的是,如果使用优质住宅代理,代理供应商通常会通过单一网关端点在其一侧自动完成轮换,因此无需自定义代理配置。

下面介绍如何在 Axios 中手动轮换多个代理。

const axios = require('axios');
 
const proxyList = [
  { host: 'ultra.marsproxies.com', port: 44443, auth: { username: 'user_session-aaaaaaaa', password: 'pass' } },
  { host: 'ultra.marsproxies.com', port: 44443, auth: { username: 'user_session-bbbbbbbb', password: 'pass' } },
  { host: 'ultra.marsproxies.com', port: 44443, auth: { username: 'user_session-cccccccc', password: 'pass' } }
];
 
let currentIndex = 0;
 
function getNextProxy() {
  const proxy = proxyList[currentIndex];
  currentIndex = (currentIndex + 1) % proxyList.length;
  return proxy;
}
 
async function scrapeWithRotation(urls) {
  for (const url of urls) {
    try {
      const response = await axios.get(url, { proxy: getNextProxy() });
      console.log(url, response.status);
    } catch (error) {
      console.error(url, error.message);
    }
  }
}

上面的函数按顺序循环,将请求均匀分配,并在需要排查失败批次时保持顺序可预测。另一种方式是随机选择,可通过随机化函数实现。

function getRandomProxy() {
  return proxyList[Math.floor(Math.random() * proxyList.length)];
}

用 Axios 轮换住宅 IP,2026 年爬取不再被封

获取住宅代理

如何在 Axios 中使用 SOCKS5 代理

与会读取并改写请求头的 HTTP 代理不同,SOCKS5 工作在更底层的网络层,转发流量时不会检查其内容。

由于 Axios 本身不支持 SOCKS5,需要借助外部包,例如 socks-proxy-agent。使用时,先用代理 URL 实例化该代理对象,再将其传入请求的 httpAgent 和 httpsAgent 属性中。

const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');
 
async function testSocks() {
  const agent = new SocksProxyAgent(
    'socks5h://your_marsproxies_username:your_marsproxies_password@ultra.marsproxies.com:44445'
  );
 
  try {
    const response = await axios.get('https://api.ipify.org?format=json', {
      httpAgent: agent,
      httpsAgent: agent
    });
    console.log(response.data);
  } catch (error) {
    console.error(error.message);
  }
}
 
testSocks();

当需要穿透严格的防火墙、或要确保代理完全不改动 HTTP 数据包的请求头时,SOCKS5 是不错的选择。

在 Axios 中使用 HTTP_PROXY 和 HTTPS_PROXY

许多开发者会将配置与代码分离,以便快速切换环境。只要在运行脚本前于终端中设置好标准的 HTTP_PROXY 和 HTTPS_PROXY 环境变量,Axios 就会自动读取它们。

export HTTP_PROXY=http://user:pass@ultra.marsproxies.com:44443
export HTTPS_PROXY=http://user:pass@ultra.marsproxies.com:44443
node scraper.js

通过导出这些环境变量,Axios 可以直接通过代理转发 HTTP 请求,而无需在 JavaScript 文件中单独编写代理配置对象。

请注意,Axios 只在 Node.js 中读取这些变量,并且如果在请求中设置 proxy: false,Axios 会忽略这些变量。您还可以定义一个 NO_PROXY 变量,列出应完全跳过代理服务器的域名。

Axios 代理常见错误

在调试 Axios 代理连接时,通常会遇到以下几种常见错误:

  • HTTP 407 Proxy Authentication Required。代理服务器拒绝了您的请求,原因通常是凭据错误或订阅已过期。
  • ECONNREFUSED。代理拒绝了您的连接,通常是因为指定了错误的端口,或本地防火墙阻止了访问。
  • ETIMEDOUT。代理服务器完全没有响应,这通常说明主机已离线或 IP 地址有误。
  • SSL 协议错误。如果代理服务器只接受 http,而您却将代理协议设为 https,Axios 的 TLS 握手就会失败并抛出协议错误。修改协议前,请先查阅代理供应商提供的协议说明文档。

使用 Axios 代理的最佳实践

切勿将代理密码硬编码在源代码中,而应使用环境变量(通常借助 dotenv 等工具包管理)来安全加载敏感凭据。

由于 数据抓取 过程中网络请求经常失败,应设置严格的超时时间,并借助 axios-retry 等外部包实现自动重试逻辑,以处理临时性网络错误。如果您正在运行大型数据抓取项目,请确保有效管理代理池,并调整代理配置,避免任何单一 IP 触发速率限制。

请记住,代理仅替换您的 IP 地址,并不会对请求内容进行加密。如果您处理的是敏感信息,需要将流量路由至 HTTPS 端点,这样 TLS 才能在数据经过代理服务器之前对其加密。

常见问题

2026 年还有人在使用 Axios 吗?

2026年3月31日,Axios 遭遇供应链攻击,被植入恶意代码的 1.14.1 和 0.30.4 版本一度发布至 npm,此后部分团队转而使用 Node.js 原生的 Fetch API,以减少对第三方包的依赖。

Axios 能使用 SOCKS5 代理吗?

Axios 仅原生支持 HTTP(S) 代理。若要通过 SOCKS5 代理转发流量,必须安装 socks-proxy-agent 等外部库,并更新代理配置。

如何确认 Axios 是否正在使用我的代理?

向一个纯 HTTP 的 IP 查询服务(例如 http://api.ipify.org)发送 GET 请求。如果返回的 IP 是您的代理服务器而非本地设备的 IP,说明配置生效。

Axios 可以配合住宅代理使用吗?

可以,但仅有 host 和 port 还不够。由于住宅代理是付费服务,还需要在代理配置的 auth 属性中填入用户名和密码;也可以选择使用 IP 白名单认证方式来完成授权。

了解更多
-

相关文章