如何在 2025 中使用带有 Node-Fetch 的代理
本指南介绍了如何使用以下设备设置代理 Node-Fetch管理 IP 轮换,并根据我的需求选择免费或高级服务。让我们深入了解一下!
先决条件
要继续学习,请确保您已
- Node.js (版本 12.20.0 或更高)
- 终端或命令提示符
- 安装 Node-Fetch 和 HTTPS-Proxy-Agent
步骤 1:安装 Node-Fetch 和 HTTPS-Proxy-Agent
在项目目录下,打开终端并运行以下命令:
npm i node-fetch
npm i https-proxy-agent
如果遇到找不到模块 "node-fetch "之类的错误,通常是由于模块解析问题造成的。请尝试运行 npm install 更新项目中的依赖关系。此外,请确保您的 package.json 文件设置了 "type"(类型)和 "module"(模块):"模块 "设置,因为 Node-Fetch v3.x 是仅限 ESM 的模块。
了解代理服务器以及网络抓取为何需要代理服务器
A 代理IP - 突破网站地域 & IP 限制 是应用程序和目标服务器之间的中介。使用代理时,您的请求似乎来自代理的 IP 地址,而不是您自己的 IP 地址,这有助于防止拦截。
代理主要有两种类型:
- HTTP 代理: 仅支持 HTTP 流量。
- HTTPS 代理服务器: 支持 HTTP 和 HTTPS 流量,使其用途更加广泛。
在 Node-Fetch 中使用代理需要在获取请求中传递一个自定义代理服务器。然而,Node-Fetch 本身并不支持代理,因此我们将为此使用 https-proxy-agent 软件包。
免费代理与付费代理:什么最适合您的应用程序?
网上有免费的代理列表,但这些列表都有一些折衷方案:
- 优点 免费并可广泛获取。
- 缺点 通常不稳定,速度较慢,更容易被网站屏蔽。
对于要求高可用性的应用程序(如网络搜索),付费代理服务器能提供更好的可靠性和速度。有些服务提供旋转代理和防拦截功能,我们将对此进行更详细的讨论。
使用 Node-Fetch 设置静态代理
从基本设置开始,让我们使用带有 Node-Fetch 的静态代理来发出 HTTP 请求。如果你只有一个代理服务器,那么这种设置是合适的。
Import the required modules:
import fetch from 'node-fetch';
import { HttpsProxyAgent } from https-proxy-agent;
定义 您的代理配置:
const proxyHost = '200.105.215.22';
const proxyPort = 33630;
const proxyUrl = `http://${proxyHost}:${proxyPort}`;
const proxyAgent = new HttpsProxyAgent(proxyUrl);
提出请求 通过代理:
(async () => {
const targetUrl = 'https://ident.me';
try {
const response = await fetch(targetUrl, { agent: proxyAgent });
const data = await response.text();
console.log(data); // Expected output: Proxy IP address
} catch error) {
console.error(error);
}
})();
在本例中,我们的目标是 https://ident.me、 返回请求者的 IP 地址。这种设置对于简单的任务来说没有问题,但对于高强度的网络扫描或速率受限的应用程序接口来说,往往就不够用了。
使用 Node-Fetch 旋转代理:处理动态 IP 禁止
旋转代理非常适合大批量刮擦,有助于将请求分散到多个 IP 地址,降低被拦截的可能性。
- Bright Data:高性能代理服务器,功能先进,是综合解决方案的理想选择。
- Smartproxy:经济、可靠的代理服务器,覆盖全球,是网络搜索的理想选择。
- Oxylabs:卓越的性能和支持,非常适合需要顶级代理服务器的企业。
- IPRoyal:灵活的轮换和定价,适合小型项目或作为辅助供应商。
- SOAX:高级代理,具有精确的目标定位和多种旋转设置,价格极具竞争力。
- NetNut:具有大规模搜索的广泛功能,但只有基本的文档和仪表板。
- Infatica:为企业提供价格合理、来源合法、性能稳定的代理服务器。
步骤 1:创建代理列表
定义应用程序可以轮换使用的代理列表。您可以使用静态列表,也可以从文件或应用程序接口动态加载代理。
const proxyList = [
{ host: '103.69.108.78', port: 8191 },
{ host: '61.29.96.146', port: 80 },
{ host: '154.204.58.155', port: 8090 }
];
步骤 2:在请求中轮流使用代理服务器
使用循环来轮换使用代理服务器,对每个请求使用不同的代理服务器。这种技术可将负载分散到多个 IP 上。
import fetch from 'node-fetch';
import { HttpsProxyAgent } from https-proxy-agent;
const proxyList = [
{ host: '103.69.108.78', port: 8191 },
{ host: '61.29.96.146', port: 80 },
{ host: '154.204.58.155', port: 8090 }
];
async function rotateProxies(proxyList、targetUrl) {
for (const 代理IP - 突破网站地域 & IP 限制 of proxyList) {
const proxyUrl = `http://${proxy.host}:${proxy.port}`;
const proxyAgent = new HttpsProxyAgent(proxyUrl);
try {
const response = await fetch(targetUrl, { agent: proxyAgent });
const html = await response.text();
console.log(html);
} catch error) {
console.error(`Error with proxy ${proxy.host}:${proxy.port}`, error);
}
}
}
const targetUrl = 'https://ident.me';
rotateProxies(proxyList,targetUrl);
这种方法对没有采用高级僵尸检测机制的网站效果很好。不过,对于反僵尸措施较强的网站,可以考虑使用高级旋转代理。
通过 Node-Fetch 使用高级代理服务:绕过高级反僵尸措施
免费的代理服务器往往不可靠,而且很容易被发现,因此我们来看看更强大的解决方案。 高级代理提供商 如 Bright Data、ZenRows 和 Oxylabs,它们提供旋转代理,并有复杂的机制来规避 IP 屏蔽和验证码。
第 1 步:注册并获取 API 密钥
在 Bright Data 注册后,您将收到一个 API 密钥,允许您通过其代理网络验证您的请求。Bright Data 还提供自定义配置和用户仪表板,用于管理请求和监控使用情况。
const apiKey = ';
const targetUrl = 'https://www.amazon.com';
const apiUrl = `https://brightdata.com/api/v1/?apikey=${apiKey}&url=${encodeURIComponent(targetUrl)}`;
第 2 步:定义其他应用程序接口参数
Bright Data 提供各种设置来增强匿名性和减少检测,例如启用 JavaScript 渲染(对处理动态内容有用)和调整每个请求的代理旋转设置。
const params = {
"js_render": "true", /// Renders JavaScript for dynamic pages
"proxy_type": "residential" // Use residential proxies for higher anonymity
};
第 3 步:通过 Bright Data API 提出申请
配置完成后,您就可以使用 Node-Fetch 通过 Bright Data 的网络发出请求。Bright Data 会处理 IP 轮换和反僵尸机制,以确保您的请求可靠通过。
import fetch from 'node-fetch';
(async () => {
const response = await fetch(apiUrl, {
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
params: params
});
const html = await response.text();
const statusCode = response.status;
console.log('Status Code:',statusCode);
console.log(html);
})();
高级技术:利用中间件和异步处理实现代理轮换自动化
为了提高效率,可以考虑构建中间件来自动管理代理。下面是一个使用异步处理多个请求的示例:
创建功能 随机选择代理:
function getRandomProxy(proxyList) {
return proxyList[Math.floor(Math.random() * proxyList.length)];
}
修改旋转逻辑 并发控制,以避免服务器超载:
import fetch from 'node-fetch';
import { HttpsProxyAgent } from https-proxy-agent;
const proxyList = [ /* proxy objects */ ];
async function rotateProxies(targetUrl, concurrency = 5) {
const tasks = Array.from({ length: concurrency }, async () => {
const proxy = getRandomProxy(proxyList);
const proxyUrl = `http://${proxy.host}:${proxy.port}`;
const proxyAgent = new HttpsProxyAgent(proxyUrl);
try {
const response = await fetch(targetUrl, { agent: proxyAgent });
const html = await response.text();
console.log(`Success with ${proxy.host}:${proxy.port}`);
} catch error) {
console.error(`Error with ${proxy.host}:${proxy.port}`, error);
}
});
await Promise.all(tasks);
}
const targetUrl = 'https://ident.me';
rotateProxies(targetUrl、 3); // Set concurrency as needed
结论
在 Node-Fetch 中使用代理已成为可靠的网络搜刮和数据自动化的必要条件。无论您选择免费代理、高级服务还是自定义轮换设置,这些技术都将帮助您保持访问并避免基于 IP 的限制。用您的目标网站测试每种方法;有些方法可能需要高级的高级解决方案才能获得一致的结果。
既然你已经拥有了旋转代理和躲避 IP 屏蔽的工具,那么即使是最难的网站,你也能从中搜刮到数据。搜索愉快