HTTP 代理是位于您的 Node.js 应用与目标服务器之间的中间服务器,负责转发请求和响应。在 Node.js 中通过 axios、Puppeteer 和 Playwright 等库使用代理,可以隐藏您的 IP 地址、绕过地域限制、对请求做负载均衡,并更高效地抓取网站数据。本文提供了配置这些库使用代理的实用示例。
使用 Axios 配置代理
Axios 是 Node.js 中常用的基于 promise 的 HTTP 客户端。通过 proxy 配置项,在 Axios 中设置代理非常简单。
基本代理配置
proxy 选项接收一个对象,包含 host、port、username 和 password 等属性。
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_host 和 8080 替换为您实际的代理主机和端口。如果代理需要身份验证,请填写 username 和 password。
使用环境变量
出于安全性和可维护性考虑,最好把代理凭据保存在环境变量中。
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_HOST 和 process.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() |
launch 或 newContext 中的 proxy 选项 |
| 认证方式 | proxy 中的 username 和 password |
page.authenticate() |
proxy 中的 username 和 password |
| 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 应用中高效使用代理。
