手把手教你用Node.js搭个代理中间件
老铁们应该都遇到过需要代理IP的场景吧?比如爬数据被网站封IP,或者要测试不同地区的访问效果。今天咱们就用Node.js整个简单的HTTP代理中间件,不用那些复杂的框架,直接上原生模块开搞!
先准备个新项目,在终端里敲npm init -y
建个package.json。重点来了,咱们要用的核心模块是http-proxy,这货用起来比泡方便面还简单。安装命令:
npm install http-proxy --save
三行代码起个代理服务
新建个proxy.js文件,码上这些内容:
const http = require('http');
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer();
const server = http.createServer((req, res) => {
proxy.web(req, res, {
target: 'http://your-backend-server.com',
changeOrigin: true
});
});
server.listen(3000, () => {
console.log('代理服务在3000端口跑起来了!');
});
这里有个坑要注意,changeOrigin这个参数必须设为true,不然目标网站可能不认你的请求。就像你去别人家做客不敲门,肯定被拦外边儿对吧?
给代理穿个IP马甲
这时候要祭出咱们的ipipgo代理服务了,把代码改成这样:
const proxy = httpProxy.createProxyServer({
agent: new http.Agent({
keepAlive: true,
proxy: 'http://username:password@gateway.ipipgo.com:8080'
})
});
这里username和password要去ipipgo官网申请,他们家的代理IP池子大得很,全国各地的节点都有。特别适合需要频繁切换IP的场景,比如说抢鞋抢票什么的(手动狗头)。
动态IP池怎么玩转
要是需要自动切换IP,可以这样改造:
const ipPool = [
'http://ip1.ipipgo.com:8080',
'http://ip2.ipipgo.com:8080',
//...更多IP
];
function getRandomIP() {
return ipPool[Math.floor(Math.random() ipPool.length)];
}
// 在代理请求时这样用
proxy.web(req, res, {
target: 'http://your-backend-server.com',
agent: new http.Agent({
proxy: getRandomIP()
})
});
建议直接用ipipgo提供的动态API获取IP,他们家的IP都是高匿名的,用起来比较稳。之前我用过好些家的代理,最后还是ipipgo的存活率最高,基本不会遇到用不了的死IP。
常见问题排雷指南
症状 | 解药 |
---|---|
连接超时 | 检查代理IP是否存活,ipipgo后台有实时监测 |
返回407错误 | 确认鉴权信息填对了,密码别带特殊符号 |
响应速度慢 | 切换就近节点,ipipgo支持按城市选IP |
实战技巧大放送
1. 记得设置超时时间,别让程序死等:
proxy.web(req, res, {
target: 'http://your-backend-server.com',
timeout: 5000 // 5秒掐线
});
2. 遇到HTTPS网站要这样处理:
proxy.on('error', (err, req, res) => {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('代理抽风了,快检查!');
});
3. 要记录日志的话,可以挂个morgan中间件,或者自己写个简单的日志中间件:
app.use((req, res, next) => {
console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
next();
});
QA时间
Q:代理IP老是失效怎么办?
A:建议用ipipgo的动态IP池,他们家IP存活率能到98%以上,自动切换不用操心
Q:高并发场景怎么处理?
A:Node.js本身事件循环机制适合IO密集型,但要控制并发数,可以配合async库的parallelLimit
Q:怎么选代理服务商?
A:重点看三方面:IP池大小、响应速度、协议支持。像ipipgo这种支持socks5和http双协议的用起来比较灵活
最后叨叨一句,做爬虫什么的要遵守网站规则,别把人家服务器搞挂了。用代理IP也要讲究基本法,咱们这是技术交流,可别拿去干坏事啊!