Node.js实战:用代理IP解决数据请求难题
最近遇到个挺有意思的案例,有个做电商的朋友需要抓取竞品价格,结果刚跑两天脚本就被封IP了。这种情况用代理IP就能轻松解决,今天就手把手教大家怎么在Node.js里用fetch搭配代理IP实现稳定数据请求。
为什么需要代理IP?
举个真实场景:某平台限制单个IP每小时只能访问500次。假设你需要:
1. 每天采集10万条数据
2. 模拟不同地区用户行为
3. 避免触发反爬机制
这时候单个IP肯定不够用,使用代理IP池就能完美解决这些问题。
三行代码接入代理服务
const fetch = require('node-fetch');
const proxyUrl = 'http://username:password@gateway.ipipgo.com:8080';
async function fetchWithProxy() {
const res = await fetch('https://target-site.com/api', {
agent: new (require('https-proxy-agent'))(proxyUrl)
});
return res.json();
}
这里用的是ipipgo的代理服务,注意替换自己的账号密码。他们的代理服务器gateway.ipipgo.com支持HTTP/HTTPS/SOCKS5三种协议,实测连接速度在200ms左右。
重点参数设置指南
想让代理IP用得顺手,这几个参数要特别注意:
参数 | 推荐值 | 作用 |
---|---|---|
timeout | 10000 | 超时自动切换IP |
keepAlive | true | 保持长连接省资源 |
maxSockets | 50 | 控制并发量防被封 |
错误处理小技巧
上周有个用户反馈说代理IP有时不稳定,后来发现是没做错误重试。建议加上这个逻辑:
async function safeFetch(url, retries=3) {
try {
return await fetchWithProxy(url);
} catch (err) {
if(retries > 0) {
console.log(`正在重试,剩余次数:${retries}`);
return safeFetch(url, retries-1);
}
throw new Error('请求失败');
}
}
常见问题QA
Q:代理IP经常被封怎么办?
A:建议使用ipipgo的动态住宅代理,他们的IP存活周期短且复用率低,适合高频请求场景。
Q:如何检测代理是否生效?
A:可以先请求http://ip.ipipgo.com/checkip,返回的IP地址如果变化说明代理成功。
Q:企业级应用要注意什么?
A:推荐使用ipipgo的企业版服务,支持API动态获取代理列表,自带请求统计和流量预警功能。
避坑经验分享
去年有个项目用了免费代理,结果导致数据泄露。后来换成ipipgo的独享代理,不仅速度提升3倍,安全性也有保障。他们的技术客服还帮忙优化了IP轮换策略,现在日均处理50万请求都没问题。
最后提醒下:做数据采集要遵守网站的robots.txt规则,合理设置请求间隔。用对工具+遵守规则,才能长久稳定地获取数据。