当爬虫遇到反爬:Node.js如何用代理IP优雅破局
各位搞数据采集的老铁应该都懂,现在网站反爬机制越来越狠。上周我拿axios写了个脚本,刚跑半小时就收到403大礼包。这时候就需要祭出代理IP这个神器了——特别是像天启代理这种靠谱的服务商,能让你在合规范围内把采集效率拉满。
选对请求库才是王道
Node.js生态里处理HTTP请求的库多到眼花,咱们重点说三个实战常用的:
库名称 | 适用场景 | 代理支持 |
---|---|---|
axios | 常规网页抓取 | 需要手动配置 |
node-fetch | 轻量级请求 | 新版支持代理 |
puppeteer | 动态渲染页面 | 浏览器级代理 |
举个🌰,用axios配置天启代理的姿势:
const axios = require('axios'); const tunnel = require('tunnel'); const agent = tunnel.httpsOverHttp({ proxy: { host: 'tianqi.proxy.com', //天启代理服务器地址 port: 9021, proxyAuth: '你的账号:密码' } }); axios.get('目标网址', { httpsAgent: agent, timeout: 5000 })
异步处理要玩出花
别再用callback地狱了!建议用Promise.allSettled配合并发控制。假设咱们用天启代理的200+城市节点,可以这样玩:
const { Pool } = require('generic-pool'); const proxyPool = new Pool({ max: 10, //根据天启代理的QPS限制调整 create: () => 获取代理IP函数(), destroy: (proxy) => 释放代理函数() }); async function batchRequest(urls) { const results = []; for (const url of urls) { const proxy = await proxyPool.acquire(); try { const res = await fetch(url, { agent: 生成代理配置(proxy) }); results.push(处理数据(res)); } finally { proxyPool.release(proxy); } } return results; }
异常处理必须够硬核
代理IP用着用着突然失效是常有的事,这时候就得:
- 设置超时自动切换(天启接口响应<1秒,建议设2秒超时)
- 遇到4xx/5xx状态码立即熔断
- 错误重试时更换代理IP
function createRetryAgent() { let retryCount = 0; return async (req, res, next) => { try { await 业务逻辑(); } catch (e) { if(retryCount < 3 && e.code === 'ECONNABORTED') { retryCount++; await 更换天启代理IP(); return createRetryAgent()(req, res, next); } throw e; } }; }
QA急救包
Q:代理IP突然全挂了咋整?
A:优先检查账号状态,然后看天启代理的控制台。他们家IP可用率≥99%,大概率是本地网络问题。
Q:HTTPS站点代理总报证书错误?
A:试试天启的SOCKS5协议,或者配置rejectUnauthorized:false(仅测试环境用)
Q:怎么管理上千个代理IP?
A:用天启代理的API动态获取IP池,配合redis做IP健康度检测,失效IP自动淘汰。
写在最后
选代理服务商千万别图便宜,像天启代理这种有运营商正规授权、自建机房的才是正道。特别是他们的10毫秒低延迟特性,做实时数据采集时优势明显。最近发现他们支持隧道代理模式,不用再手动切换IP,简直不要太香!
最后提醒新手:代理IP不是银弹,要配合请求频率控制、UserAgent轮换这些基本操作,才能让采集脚本长期稳定运行。遇到具体问题可以到天启代理的文档库找解决方案,他们家的技术手册写得比很多开源项目都详细。