在 Axios 中设置代理
在 Axios 中设置代理
Axios 与代理
Axios 是 JavaScript 生态中最广泛使用的 HTTP 客户端之一。它基于 Promise,提供了易用、直观的 API,用于执行 HTTP 请求并处理自定义请求头、配置和 Cookie 等。
通过为 Axios 请求设置代理,您可以隐藏自己的 IP 地址,从而让目标服务器更难以识别并阻止您的请求。
在 Axios 中使用代理
让我们来看看如何在 Axios 中设置 HTTP、HTTPS 或 SOCKS 代理。首先,安装 axios
:
npm install axios
在 Node.js 环境中,Axios 原生支持通过 proxy 配置来使用 HTTP 和 HTTPS 代理。因此,如果您只需要在 Node.js 项目中使用 HTTP/HTTPS 代理,则无需额外操作。
但若您要使用非 HTTP/S 协议的代理,就需要借助 Proxy Agents 项目提供的 http.Agent
实现,它让 Axios 能够使用不同协议的代理:
- HTTP 和 HTTPS 代理: https-proxy-agent
- SOCKS、SOCKS5 和 SOCKS4: socks-proxy-agent
- PAC-*: pac-proxy-agent
HTTP/HTTPS 代理
您的 HTTP/HTTPS 代理的 URL 通常形式如下:
"<PROXY_PROTOCOL>://<PROXY_HOST>:<PROXY_PORT>"
<PROXY_PROTOCOL>
:对于 HTTP 代理是 "http",对于 HTTPS 代理是 "https"。<PROXY_HOST>
:代理服务器的 IP 地址。<PROXY_PORT>
:代理服务器监听的端口号。
例如,假设这是您的 HTTP 代理的地址:
"http://47.88.62.42:80"
您可以在 Axios 中这样设置:
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 接口测试请求。这个接口会返回请求的来源 IP,因此应该是代理服务器的 IP。
Node.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()
运行脚本后,理想情况下会输出:
{ "origin": "52.117.157.155" }
警告:
若您跟着示例代码直接运行,可能不会得到相同结果,因为免费代理服务通常不稳定、速度慢、容易出错,有的数据还可能被记录或解析,且通常时效很短。
SOCKS 代理
如果您尝试在 proxy
配置中将协议设置为 "socks",会出现如下错误:
AssertionError [ERR_ASSERTION]: protocol mismatch
// ...
{
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 'dada:',
expected: 'http:',
operator: '=='
}
这是因为 Axios 并不原生支持 SOCKS 代理。为此,需要先安装 socks-proxy-agent
:
npm install socks-proxy-agent
该包允许您在进行 HTTP 或 HTTPS 请求时接入 SOCKS 代理。然后,引入 socks-proxy-agent
提供的 SOCKS 代理实现:
const SocksProxyAgent = require("socks-proxy-agent")
或若您使用 ESM:
import { SocksProxyAgent } from "socks-proxy-agent"
假设您的 SOCKS 代理地址是:
"socks://183.88.74.73:4153"
注意:
代理协议可能是 “socks”、“socks5” 或者 “socks4”。
将它存到某个变量里,并传给 SocksProxyAgent
构造函数:
const proxyURL = "socks://183.88.74.73:4153"
const proxyAgent = new SocksProxyAgent(proxyURL)
SocksProxyAgent()
会初始化一个 http.Agent
实例,让所有 HTTP/HTTPS 请求都走这个代理地址。
在 Axios 中使用 SOCKS 代理可以这样做:
axios.get(targetURL, {
httpAgent: proxyAgent,
httpsAgent: proxyAgent
})
httpAgent
和 httpsAgent
指定了在进行 HTTP/HTTPS 请求时应使用的自定义代理类。也就是说,Axios 发出的 HTTP 或 HTTPS 请求都会走这里指定的 SOCKS 代理。同理,您也可以使用 https-proxy-agent 来为 Axios 设置 HTTP/HTTPS 代理。
示例如下:
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 代理
Axios 代理:进阶用法
全局设置代理
如果您想在所有请求中都使用同一个代理,可以直接在 Axios 实例中进行全局设置:
const axiosInstance = axios.create({
proxy: {
protocol: "<PROXY_PROTOCOL>",
host: "<PROXY_HOST>",
port: "<PROXY_PORT>"
},
// 其他配置…
})
或者,如果您使用了 Proxy Agents:
// 定义代理 agent ...
const axiosInstance = axios.create({
httpAgent: proxyAgent,
httpsAgent: proxyAgent
})
以下示例演示了如何全局使用 SOCKS 代理:
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 错误。
一般情况下,需要身份验证的代理地址格式如下:
[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]
例如,一个示例地址可能是:
http://admin:lK4w90MEe45YIkOpk@156.127.0.192:8391
对应的要素分解如下:
<PROTOCOL>
:http
<HOST>
:156.127.0.192
<PORT>
:8391
<USERNAME>
:admin
<PASSWORD>
:lK4w90MEe45YIkOpk
如果您使用 Axios 原生的 proxy
,可以在 auth
字段中声明用户名和密码:
axios.get(targetURL, {
proxy: {
protocol: "http",
host: "156.127.0.192",
port: "8381",
auth: {
username: "admin",
password: "lK4w90MEe45YIkOpk"
}
}
})
若您是使用 Proxy Agents,可以通过以下两种方式处理代理验证:
- 直接在代理 URL 中加入认证信息:
var proxyAgent = new SocksProxyAgent("http://admin:[email protected]:8391")
- 通过 URL 对象设置
username
和password
: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 上,您可以这样设置:
export HTTP_PROXY="[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]"
export HTTPS_PROXY="[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]"
当 Axios 检测到这些环境变量后,会读取相应的代理配置,包括身份验证所需的凭据。若您想忽略这些环境变量,可将 proxy
字段设置为 false
。也可以定义一个名为 NO_PROXY
的环境变量,以逗号分隔列出不需要走代理的域名。
同样的机制也可用于 通过 cURL 使用代理。
实现轮换代理
为了防止目标站点因多次请求同一 IP 而对您的代理进行封锁,您可以让每次请求都使用不同的代理地址:
- 定义一个包含多个代理信息的列表。
- 在每次请求前随机(或按一定规则)从列表中选择一个代理。
- 将选定的代理配置信息传给 Axios。
这种方式需要您拥有一个可用的代理池,诸如 Bright Data 提供的 轮换代理 就可以满足此需求。
结论
Bright Data 拥有全球领先的代理网络,为世界 500 强企业及超过 20,000 名客户提供服务。其全球代理网络覆盖多种类型:
- 数据中心代理 – 超过 770,000 个数据中心 IP。
- 住宅代理 – 覆盖 195+ 个国家/地区、共 72M+ 个住宅 IP。
- ISP 代理 – 超过 700,000 个 ISP IP。
- 移动代理 – 超过 7M 个移动 IP。
立即免费注册 Bright Data 账户 试用我们的代理服务器吧。