之前一个做了爬虫的客户上周末来找我,希望给爬虫加上代理IP。
并不是所有网站都会监控流量来源,一些运行良好的网站需要考虑数据安全性和核心竞争力,才会对流量进行监控,防止爬虫的高频率抓取导致核心数据外泄。
这部分网站一般是通过IP来识别爬虫,当同个IP在一段时间内请求明显高于人访问网页的速度时,会判定为爬虫请求从而对该请求的IP进行短期或长期封杀。
那这时候就需要使用代理来绕过对IP的监控或封杀。在网上能找到一些提供免费代理IP的平台,不过亲测极其不稳定,通常100个里只有个别能用。
所以真正的想用代理IP来做爬虫,还是找付费的比较好。通常爬虫用途可以买动态IP:平台提供一个API,每次刷新请求会得到一个或一堆有效期比较短的IP,然后从这些IP里挑选来代理请求,失效时重新生成可用的IP即可。
我写的爬虫是node里跑的,这里不得不提的是,在js里非常流行的axios请求库亲测并不能实现代理请求(也许是我姿势不对),参考网上教程需要使用request这个请求库(然而并不好用,API并不是流行的Promise方式)
所以我在逻辑代码里是这样实现的,首先封装一个请求函数,以下是核心示例代码:
const request = require('request')
const _ = require('lodash')
const _request = (ipList,url) => {
return new Promise(async (resolve, reject) => {
let useIp = _.sample(ipList);
//从ip列表里随机返回一个
const options = {
method: 'GET',
url: url,
gzip: true,
encoding: null,
proxy: useIp, //动态设置代理ip
timeout: 2000
//超时时间,太短代理不稳定,太长请求过久
};
request(options, (error, response, body) => {
if (error) >= 0) {
console.log(`${useIp} 代理有问题`);
resolve(undefined)
return;
}
console.log(`使用代理 ${useIp}`)
try {
let data = JSON.parse(body)
resolve(data)
} catch (e) {
resolve(undefined)
}
})
})
}
module.exports = async (url) => {
try {
let result = await _request(url)
if (result) return result
return axios.get(url).then(res => res.data)
} catch (e) {
return axios.get(url).then(res => res.data)
}
}
上面封装过后的请求函数就暴露了一个统一的request方法,使用时候只需要request(url)即可。
从代码里也可以看到:当代理有效时会用代理,当代理无效、超时或其他任何错误时会返回正常的请求,这也是降级保障了爬虫代码的健壮性。
在使用代理IP时,超时时间是个需要不断调整的设置。超时太短了会导致代理不可用的概率提高,而超时太长则会影响整个爬虫的速度。
比如我给客户跑的这个爬虫,不使用代理时跑完需要4个小时,而如果使用代理,每次请求的时间就加长了,在设置2000毫秒的超时下,整个任务跑下来需要翻2倍的时间。
据说互联网上50%以上的流量都是爬虫创造的,也许你看到很多热门数据都是爬虫所创造的,所以可以说无爬虫就无互联网的繁荣。之前写了一篇文章只因写了一段爬虫,公司200多人被抓,讲述程
在现如今网络发达的时代,服务器租用已经成为一种业务模式。它的优点在于用户不用去自己订购服务器也可以使用发哦服务器,能大大地降低服务器资金的投入,这一点对于一些中小型企业和
很多用户在进行服务器租用或者服务器托管过程中会因为业务、客户等问题导致更换IP或者重新增加IP,虽然是一个简单的IP,但是更换IP有很多的细节需要注意,否则稍不留心,苦心经营的网站
代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网