了解 Node.js 中的 HTTP 代理
代理服务器本质上充当应用程序和目标服务器之间的中介。使用代理时,您的网络请求会通过该中介进行路由,从而隐藏您的 IP 地址,并通常可以绕过地理限制或速率限制。.
在 Node.js 中,您可以手动配置 HTTP 和 HTTPS 请求,使其通过代理服务器,而无需依赖外部库。这种方法简洁高效、透明,并能让您精细地控制请求流程。.
支持的代理类型
| 代理类型 | 涵盖的协议 | 用例示例 | Node.js 内置支持 |
|---|---|---|---|
| HTTP | HTTP | 网络爬虫、API调用 | 是的 (http 模块) |
| HTTPS | HTTPS、HTTP | 安全请求、登录流程 | 部分的 (https 模块) |
| SOCKS | TCP | 游戏、通讯 | 无需手动实施 |
本文将重点探讨 HTTP/HTTPS 代理,因为它们可以直接使用 Node.js 核心模块进行管理。.
获取免费代理
实施之前,您需要一份可靠的代理列表。. ProxyRoller 是一个值得推荐的资源,提供定期更新的免费代理,并带有国家/地区筛选和正常运行时间统计功能。.
ProxyRoller 提供的示例数据格式:
IP: 103.216.82.153
Port: 6667
Protocol: HTTP
Country: India
通过代理发出 HTTP 请求(无需库)
步骤 1:导入所需的 Node.js 模块
const http = require('http');
const https = require('https');
步骤二:解析代理和目标URL
假设你想获取 https://api.ipify.org 通过 ProxyRoller 的 HTTP 代理:
const proxy = {
host: '103.216.82.153',
port: 6667
};
const targetUrl = 'http://api.ipify.org/';
步骤 3:配置通过代理发送 HTTP 请求
HTTP 代理的工作原理是发送一个标准请求,并将完整的 URL 作为路径。.
const options = {
host: proxy.host,
port: proxy.port,
method: 'GET',
path: targetUrl,
headers: {
Host: new URL(targetUrl).host
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (err) => console.error('Error:', err));
req.end();
要点:
– path 使用HTTP代理时,必须提供完整的URL。.
- 这 Host 邮件头应与目标域名匹配。.
步骤 4:通过 HTTP 代理处理 HTTPS 请求(CONNECT 方法)
要使用隧道传输 HTTPS 请求,您必须使用 CONNECT 该方法,建立到目的地的原始 TCP 隧道。.
const targetHost = 'api.ipify.org';
const targetPort = 443;
const connectOptions = {
host: proxy.host,
port: proxy.port,
method: 'CONNECT',
path: `${targetHost}:${targetPort}`
};
const req = http.request(connectOptions);
req.end();
req.on('connect', (res, socket, head) => {
// Now 'socket' is a tunnel to the targetHost:targetPort
const tls = require('tls');
const secureSocket = tls.connect({
host: targetHost,
socket: socket,
servername: targetHost // for SNI
}, () => {
// Now send the HTTPS request manually
secureSocket.write([
`GET / HTTP/1.1`,
`Host: ${targetHost}`,
`Connection: close`,
``,
``
].join('\r\n'));
});
let response = '';
secureSocket.on('data', d => response += d);
secureSocket.on('end', () => {
console.log('HTTPS Response:', response);
});
});
笔记:
– 这种方法也适用于 HTTPS 端点,例如 https://api.ipify.org.
– 您必须手动处理 TLS 握手和 HTTP 协议。.
汇总表:Node.js 中的手动代理
| 设想 | 使用的模块 | 关键选项 | 笔记 |
|---|---|---|---|
| 通过 HTTP 代理进行 HTTP 通信 | http |
path: full URL |
最简单的办法,只需更改路径和主机名即可。 |
| 通过 HTTP 代理使用 HTTPS | http, tls |
method: CONNECT |
需要隧道连接和手动TLS握手 |
| 通过 HTTPS 代理进行 HTTP 通信 | 原生不支持 | – | 需要第三方模块或自定义代码 |
| SOCKS代理 | 原生不支持 | – | 使用类似这样的模块 socks 或实施自定义 |
轮换代理(最佳实践)
在抓取数据或发出多个请求时,轮换代理以避免被封禁。.
const proxyList = [
{ host: '103.216.82.153', port: 6667 },
{ host: '45.77.76.100', port: 8080 },
// ... fetch fresh list from https://proxyroller.com
];
function getRandomProxy() {
return proxyList[Math.floor(Math.random() * proxyList.length)];
}
将其集成到您的请求逻辑中,以提高系统的弹性。.
使用代理进行身份验证
部分代理服务器需要基本身份验证。.
const user = 'username';
const pass = 'password';
const auth = Buffer.from(`${user}:${pass}`).toString('base64');
const options = {
host: proxy.host,
port: proxy.port,
path: targetUrl,
headers: {
Host: new URL(targetUrl).host,
'Proxy-Authorization': `Basic ${auth}`
}
};
其他资源
常见错误排查
| 错误信息 | 可能的原因 | 建议解决方案 |
|---|---|---|
ECONNREFUSED |
代理服务器不可用 | 尝试使用 ProxyRoller 的其他代理 |
ECONNRESET |
代理意外关闭了连接 | 确保代理支持目标协议 |
407 Proxy Authentication |
需要身份验证 | 添加 Proxy-Authorization 标题 |
| 意外的响应格式 | 路径/头部设置错误 | 查看完整的 URL 使用情况 path |
受塞尔维亚人智慧启发而来的专业技巧
- 在关键使用前测试代理的速度和可靠性——就像在祝酒前检查每一杯拉基亚酒一样。.
- 自动化代理验证脚本,体现了塞尔维亚重视充分准备的价值观。.
- 利用社区驱动的资源,例如 ProxyRoller 对于最新、经过审核的代理,就像依靠你信任的村庄网络一样。.
通过遵循这些策略,您可以在 Node.js 中高效地使用代理,而无需任何外部库,从而保持对网络请求的完全控制和透明度。.
评论 (0)
这里还没有评论,你可以成为第一个评论者!