# Axios-with-proxies **Repository Path**: bright-data/Axios-with-proxies ## Basic Information - **Project Name**: Axios-with-proxies - **Description**: 使用 Axios 为 HTTP、HTTPS 和 SOCKS 请求配置并使用代理,包括轮换代理和全局配置等进阶场景。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://www.bright.cn/blog/how-tos/axios-proxy - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-04 - **Last Updated**: 2025-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 在 Axios 中设置代理 [![描述性文字](image.png)](https://www.bright.cn/proxy-types/residential-proxies) 本指南涵盖以下内容: 1. [Axios 与代理](#axios-与代理) 2. [在 Axios 中使用代理](#在-axios-中使用代理) - [HTTP/HTTPS 代理](#httphttps-代理) - [SOCKS 代理](#socks-代理) 3. [Axios 代理:进阶用法](#axios-代理进阶用法) - [全局设置代理](#全局设置代理) - [在 Axios 中处理需要身份验证的代理](#在-axios-中处理需要身份验证的代理) - [通过环境变量设置代理](#通过环境变量设置代理) - [实现轮换代理](#实现轮换代理) 4. [结论](#结论) ## Axios 与代理 [Axios](https://axios-http.com/) 是 JavaScript 生态中最广泛使用的 HTTP 客户端之一。它基于 Promise,提供了易用、直观的 API,用于执行 HTTP 请求并处理自定义请求头、配置和 Cookie 等。 通过为 Axios 请求设置代理,您可以隐藏自己的 IP 地址,从而让目标服务器更难以识别并阻止您的请求。 ## 在 Axios 中使用代理 让我们来看看如何在 Axios 中设置 HTTP、HTTPS 或 SOCKS 代理。首先,安装 `axios`: ```bash npm install axios ``` 在 Node.js 环境中,Axios 原生支持通过 [`proxy`](https://github.com/axios/axios#request-config) 配置来使用 HTTP 和 HTTPS 代理。因此,如果您只需要在 Node.js 项目中使用 HTTP/HTTPS 代理,则无需额外操作。 但若您要使用非 HTTP/S 协议的代理,就需要借助 [Proxy Agents](https://github.com/TooTallNate/proxy-agents) 项目提供的 `http.Agent` 实现,它让 Axios 能够使用不同协议的代理: - HTTP 和 HTTPS 代理: [`https-proxy-agent`](https://github.com/TooTallNate/proxy-agents/blob/main/packages/https-proxy-agent) - SOCKS、SOCKS5 和 SOCKS4: [`socks-proxy-agent`](https://github.com/TooTallNate/proxy-agents/blob/main/packages/socks-proxy-agent) - PAC-\*: [`pac-proxy-agent`](https://github.com/TooTallNate/proxy-agents/blob/main/packages/pac-proxy-agent) ### HTTP/HTTPS 代理 您的 HTTP/HTTPS 代理的 URL 通常形式如下: ``` "://:" ``` - ``:对于 HTTP 代理是 "http",对于 HTTPS 代理是 "https"。 - ``:代理服务器的 IP 地址。 - ``:代理服务器监听的端口号。 例如,假设这是您的 HTTP 代理的地址: ``` "http://47.88.62.42:80" ``` 您可以在 Axios 中这样设置: ```js axios.get(targetURL, { proxy: { protocol: "http", host: "47.88.62.42", port: 80 } }) ``` 要验证这个配置方式是否可行,可以获取一个免费 HTTP 或 HTTPS 代理地址,比如: ``` Protocol: HTTP; IP Address: 52.117.157.155; Port: 8002 ``` 完整的代理地址就是 `http://52.117.157.155:8002`。为了验证代理是否生效,您可以通过 HTTPBin 项目的 [/ip](https://httpbin.io/ip) 接口测试请求。这个接口会返回请求的来源 IP,因此应该是代理服务器的 IP。 Node.js 中的测试代码片段示例如下: ```js import axios from "axios" async function testProxy() { // 使用 HTTP 代理进行请求 const response = await axios.get("https://httpbin.io/ip", { proxy: { protocol: "http", host: "52.117.157.155", port: 8002 } }); // 打印结果 console.log(response.data) } testProxy() ``` 运行脚本后,理想情况下会输出: ```js { "origin": "52.117.157.155" } ``` > **警告**: > 若您跟着示例代码直接运行,可能不会得到相同结果,因为免费代理服务通常不稳定、速度慢、容易出错,有的数据还可能被记录或解析,且通常时效很短。 ### SOCKS 代理 如果您尝试在 `proxy` 配置中将协议设置为 "socks",会出现如下错误: ```js AssertionError [ERR_ASSERTION]: protocol mismatch // ... { generatedMessage: false, code: 'ERR_ASSERTION', actual: 'dada:', expected: 'http:', operator: '==' } ``` 这是因为 Axios 并不原生支持 SOCKS 代理。为此,需要先安装 `socks-proxy-agent`: ```bash npm install socks-proxy-agent ``` 该包允许您在进行 HTTP 或 HTTPS 请求时接入 SOCKS 代理。然后,引入 `socks-proxy-agent` 提供的 SOCKS 代理实现: ```js const SocksProxyAgent = require("socks-proxy-agent") ``` 或若您使用 ESM: ```js import { SocksProxyAgent } from "socks-proxy-agent" ``` 假设您的 SOCKS 代理地址是: ``` "socks://183.88.74.73:4153" ``` > **注意**: > 代理协议可能是 “socks”、“socks5” 或者 “socks4”。 将它存到某个变量里,并传给 `SocksProxyAgent` 构造函数: ```js const proxyURL = "socks://183.88.74.73:4153" const proxyAgent = new SocksProxyAgent(proxyURL) ``` `SocksProxyAgent()` 会初始化一个 `http.Agent` 实例,让所有 HTTP/HTTPS 请求都走这个代理地址。 在 Axios 中使用 SOCKS 代理可以这样做: ```js axios.get(targetURL, { httpAgent: proxyAgent, httpsAgent: proxyAgent }) ``` `httpAgent` 和 `httpsAgent` 指定了在进行 HTTP/HTTPS 请求时应使用的自定义代理类。也就是说,Axios 发出的 HTTP 或 HTTPS 请求都会走这里指定的 SOCKS 代理。同理,您也可以使用 [`https-proxy-agent`](https://www.npmjs.com/package/https-proxy-agent) 来为 Axios 设置 HTTP/HTTPS 代理。 示例如下: ```js import axios from "axios" import { SocksProxyAgent } from "socks-proxy-agent" async function testProxy() { // 将代理 URL 替换成您自己的 SOCKS 代理地址 const proxyURL = "socks://183.88.74.73:4153" // 定义 HTTP/HTTPS 代理 agent const proxyAgent = new SocksProxyAgent(proxyURL) // 通过 SOCKS 代理发送请求 const response = await axios.get("https://httpbin.io/ip", { httpAgent: proxyAgent, httpsAgent: proxyAgent }) // 打印结果 console.log(response.data) // { "origin": "183.88.74.73" } } testProxy() ``` 如需更多关于在 Axios 中配置 SOCKS 代理的示例,可查看此链接: [如何在 Axios 中使用 SOCKS 代理](https://writech.run/blog/how-to-use-a-socks-proxy-in-axios-6c0355a2e013/) ## Axios 代理:进阶用法 [![Promo](image1.png)](https://www.bright.cn/proxy-types/residential-proxies) ### 全局设置代理 如果您想在所有请求中都使用同一个代理,可以直接在 Axios 实例中进行全局设置: ```js const axiosInstance = axios.create({ proxy: { protocol: "", host: "", port: "" }, // 其他配置… }) ``` 或者,如果您使用了 Proxy Agents: ```js // 定义代理 agent ... const axiosInstance = axios.create({ httpAgent: proxyAgent, httpsAgent: proxyAgent }) ``` 以下示例演示了如何全局使用 SOCKS 代理: ```js import { SocksProxyAgent } from "socks-proxy-agent"; const proxyURL = "socks://183.88.74.73:4153"; // 创建一个 SOCKS 代理 agent const proxyAgent = new SocksProxyAgent(proxyURL); // 创建一个 Axios 实例,全局应用该 SOCKS 代理 const axiosInstance = axios.create({ httpAgent: proxyAgent, // 用于 HTTP 请求 httpsAgent: proxyAgent, // 用于 HTTPS 请求 // 其他配置... }); ``` 现在使用 `axiosInstance` 发出的所有请求都会自动走该代理。 ### 在 Axios 中处理需要身份验证的代理 为了只允许付费用户使用高质量的代理,一些代理服务商会要求进行身份验证(用户名 + 密码)。若您不带用户名 / 密码地尝试连接到此类代理服务器,就会收到 [407 Proxy Authentication Required](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/407) 错误。 一般情况下,需要身份验证的代理地址格式如下: ``` [://]:@[:] ``` 例如,一个示例地址可能是: ``` http://admin:lK4w90MEe45YIkOpk@156.127.0.192:8391 ``` 对应的要素分解如下: - ``: `http` - ``: `156.127.0.192` - ``: `8391` - ``: `admin` - ``: `lK4w90MEe45YIkOpk` 如果您使用 Axios 原生的 `proxy`,可以在 `auth` 字段中声明用户名和密码: ```js axios.get(targetURL, { proxy: { protocol: "http", host: "156.127.0.192", port: "8381", auth: { username: "admin", password: "lK4w90MEe45YIkOpk" } } }) ``` 若您是使用 Proxy Agents,可以通过以下两种方式处理代理验证: 1. 直接在代理 URL 中加入认证信息: ```js var proxyAgent = new SocksProxyAgent("http://admin:[email protected]:8391") ``` 2. 通过 [URL](https://nodejs.org/api/url.html) 对象设置 `username` 和 `password`: ```js const proxyOpts = new URL("http://156.127.0.192:8391") proxyOpts.username = "admin" proxyOpts.password = "lK4w90MEe45YIkOpk" const proxyAgent = new SocksProxyAgent(proxyOpts) ``` 对于 `HttpsProxyAgent` 也同理。 ### 通过环境变量设置代理 另一个在 Axios 中全局配置代理的方式是通过环境变量: - `HTTP_PROXY`: 用于 HTTP 请求的代理服务器地址。 - `HTTPS_PROXY`: 用于 HTTPS 请求的代理服务器地址。 在 Linux 或 macOS 上,您可以这样设置: ```bash export HTTP_PROXY="[://]:@[:]" export HTTPS_PROXY="[://]:@[:]" ``` 当 Axios 检测到这些环境变量后,会读取相应的代理配置,包括身份验证所需的凭据。若您想忽略这些环境变量,可将 `proxy` 字段设置为 `false`。也可以定义一个名为 `NO_PROXY` 的环境变量,以逗号分隔列出不需要走代理的域名。 同样的机制也可用于 [通过 cURL 使用代理](https://www.bright.cn/blog/proxy-101/curl-with-proxies)。 ### 实现轮换代理 为了防止目标站点因多次请求同一 IP 而对您的代理进行封锁,您可以让每次请求都使用不同的代理地址: 1. 定义一个包含多个代理信息的列表。 2. 在每次请求前随机(或按一定规则)从列表中选择一个代理。 3. 将选定的代理配置信息传给 Axios。 这种方式需要您拥有一个可用的代理池,诸如 Bright Data 提供的 [轮换代理](https://www.bright.cn/solutions/rotating-proxies) 就可以满足此需求。 ## 结论 Bright Data 拥有全球领先的代理网络,为世界 500 强企业及超过 20,000 名客户提供服务。其全球代理网络覆盖多种类型: * [数据中心代理](https://www.bright.cn/proxy-types/datacenter-proxies) – 超过 770,000 个数据中心 IP。 * [住宅代理](https://www.bright.cn/proxy-types/residential-proxies) – 覆盖 195+ 个国家/地区、共 72M+ 个住宅 IP。 * [ISP 代理](https://www.bright.cn/proxy-types/isp-proxies) – 超过 700,000 个 ISP IP。 * [移动代理](https://www.bright.cn/proxy-types/mobile-proxies) – 超过 7M 个移动 IP。 [立即免费注册 Bright Data 账户](https://www.bright.cn/#popup-127701) 试用我们的代理服务器吧。