
为什么网站抓取需要代理IP?
当你用Node.js写爬虫频繁访问同一个网站时,很容易被服务器识别出来并封禁你的IP。想象一下,你正忙着收集数据,突然所有请求都失败了——这就是IP被限制了。代理IP的作用就是帮你换不同的IP地址去访问,让服务器以为每次请求都来自不同的用户,从而避免被封。
比如,你要抓取商品价格,如果一直用同一个IP,几分钟内发起几十次请求,网站很可能把你拉黑。而通过代理IP池轮换,每次请求都切换IP,就能模拟正常用户的访问行为,大大降低被封锁的风险。
准备工作:安装必要的Node.js库
在开始写代码前,先确保你的电脑安装了Node.js环境。然后新建一个项目文件夹,通过终端执行以下命令安装两个核心依赖:
npm install axios cheerio
axios 是用来发送HTTP请求的库,比Node.js自带的http模块更易用;cheerio 则是服务器端的jQuery,能方便地解析HTML提取数据。我们还会用到Node.js内置的fs模块来保存结果。
获取代理IP:以ipipgo为例
市面上有很多代理IP服务,这里推荐ipipgo的动态住宅代理。为什么选这种?因为它的IP来自真实家庭网络,隐蔽性更好,不像机房IP那样容易被识别。ipipgo提供9000多万个IP,覆盖220多个国家和地区,特别适合需要大量轮换IP的场景。
注册ipipgo账号后,你会获得一个API接口,通过这个接口就能获取到可用的代理IP列表。比如他们的动态住宅代理支持按流量计费,可以设置IP的存活时间,非常灵活。
完整代码实现
下面是一个实际的网站抓取示例,目标是从某个电商网站抓取商品名称和价格。代码包含了代理IP的使用、错误处理和结果保存:
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
// ipipgo代理配置
const proxyConfig = {
host: 'proxy.ipipgo.com', // 代理服务器地址
port: 8000, // 代理端口
auth: {
username: '你的ipipgo账号',
password: '你的ipipgo密码'
}
};
async function fetchWithProxy(url) {
try {
const response = await axios.get(url, {
proxy: {
protocol: 'http',
host: proxyConfig.host,
port: proxyConfig.port,
auth: proxyConfig.auth
},
timeout: 10000 // 10秒超时
});
return response.data;
} catch (error) {
console.log(`请求失败: ${error.message}`);
return null;
}
}
async function parseProductData(html) {
const $ = cheerio.load(html);
const products = [];
$('.product-item').each((index, element) => {
const name = $(element).find('.product-name').text().trim();
const price = $(element).find('.price').text().trim();
if (name && price) {
products.push({ name, price });
}
});
return products;
}
async function main() {
const baseURL = 'https://example-store.com/products?page=';
const allProducts = [];
for (let page = 1; page
setTimeout(resolve, 2000 + Math.random() 3000));
}
// 保存结果到JSON文件
fs.writeFileSync('products.json',
JSON.stringify(allProducts, null, 2));
console.log(`抓取完成,共获取${allProducts.length}个商品`);
}
main();
关键要点详解
1. 代理设置:代码中的proxyConfig对象包含了连接ipipgo代理所需的全部信息。axios库支持在请求中直接配置代理参数,这样所有请求都会通过代理服务器转发。
2. 错误处理:网络请求可能会因为各种原因失败,比如代理IP失效、目标网站临时不可用等。我们用try-catch包裹请求代码,即使某个请求失败也不会影响整个程序运行。
3. 请求频率控制:在循环中加入了随机延迟,这是很重要的礼貌爬虫原则。即使使用了代理IP,过快的请求频率仍然可能触发网站的防护机制。
4. 数据解析:使用cheerio的jQuery风格选择器可以快速定位到需要的HTML元素。实际使用时,你需要根据目标网站的结构调整选择器。
Frequently Asked Questions QA
Q: 代理IP连接失败怎么办?
A: 首先检查代理配置信息是否正确,包括服务器地址、端口和认证信息。其次确认账号余额是否充足,ipipgo的代理服务是按流量计费的,余额不足会导致连接被拒绝。
Q: 抓取过程中突然全部失败是什么原因?
A: 可能是目标网站更新了HTML结构,导致选择器失效。也可能是当前使用的代理IP段被网站批量封禁。建议先检查网页结构是否变化,然后尝试更换代理IP类型,比如从动态住宅切换到静态住宅代理。
Q: 如何提高抓取效率?
A: 可以使用Promise.all并发发送多个请求,但要注意控制并发数量,一般建议同时不超过5个请求。ipipgo的静态住宅代理适合这种场景,因为IP稳定性更高,不容易因并发请求被封。
Q: 遇到验证码怎么处理?
A: 这是网站反爬的常见手段。可以尝试降低请求频率,或者使用ipipgo的更高匿名性代理。如果验证码出现频率很高,可能需要引入专业的验证码识别服务。
项目优化建议
这个基础版本可以进一步优化:添加日志记录系统,方便排查问题;实现断点续爬功能,避免中途失败要重头开始;使用数据库而不是文件存储结果,便于后续数据分析。
选择代理服务时,ipipgo的静态住宅代理适合需要稳定IP的长时任务,而动态住宅代理更适合需要大量IP轮换的场景。根据你的具体需求选择合适的套餐,可以有效控制成本的同时保证抓取效果。

