作者:IPIDEA
2022-09-27 15:10:46
当我们进行网站爬虫时,我们会经常遇到IP无法访问公开数据的情况。如果IP经常同时访问,那么挂掉的概率就很高。因此,我们需要设置动态ip代理来解除。
IPIDEA教程介绍:
动态IP:
设置动态IP需要一个superagent插件—superagent-proxy,此外,为了避免每次爬行都获得动态IP将爬行动态列表IP列表存放在redis在中间,并设置10分钟的过期时间。数据过期后,次发送获取动态IP的请求。
package.json
{
"name":"xxx",
"version":"1.0.0",
"description":"xxx",
"main":"arf.js",
"scripts":{
"arf":"nodemonsrc/app.js--execbabel-node--configpackage.json"
},
"keywords":[
"爬虫"
],
"author":"lidikang",
"license":"MIT",
"dependencies":{
"bluebird":"^3.5.1",
"cheerio":"^1.0.0-rc.2",
"eventproxy":"^1.0.0",
"mongoose":"^4.13.6",
"mongoose-findorcreate":"^2.0.0",
"progress":"^2.0.0",
"redis":"^2.8.0",
"superagent":"^3.8.1",
"superagent-proxy":"^1.0.2"
},
"devDependencies":{
"babel-cli":"^6.26.0",
"babel-preset-es2015":"^6.24.1",
"babel-preset-stage-2":"^6.24.1",
"nodemon":"^1.12.4"
},
"nodemonConfig":{
"ignore":[
"ips.json",
"docs/*"
],
"delay":"2500"
}
}
app.js
importrequestfromsuperagent
importrequestProxyfromsuperagent-proxy
importredisfromredis
//superagent添加使用ip代理的插件
requestProxy(request)
//redispromise化
bluebird.promisifyAll(redis.RedisClient.prototype)
bluebird.promisifyAll(redis.Multi.prototype)
//建立mongoose和redis连接
constredisClient=connectRedis()
/**
*初始化redis
*/
functionconnectRedis(){
letclient=redis.createClient(config.REDIS_URL)
client.on("ready",function(err){
console.log(redis连接√)
})
client.on("error",function(err){
console.log(`redis错误,${err}×`);
})
returnclient
}
/**
*请求免费代理,阅读redis,如果代理信息过期,请再次要求免费代理
*/
asyncfunctiongetProxyIp(){
//先从redis读取缓存ip
letlocalIpStr=awaitredisClient.getAsync(proxy_ips)
letips=null
//如果本地存在,随机返回其中一个ip,否则,再次请求
if(localIpStr){
letlocalIps=localIpStr.split(,)
returnlocalIps[parseInt(Math.random()*localIps.length)]
}else{
letipsJson=(awaitrequest.get(http://api.pcdaili.com/?orderid=888888888&num=100&protocol=1&method=1&an_ha=1&sp1=1&sp2=1&format=json&sep=1)).body
letisRequestSuccess=false
if(ipsJson&&ipsJson.data.proxy_list){
ips=ipsJson.data.proxy_list
isRequestSuccess=true
}else{
ips=[http://127.0.0.1]
}
///将爬行结果存入本地,缓存10分钟
if(isRequestSuccess){
redisClient.set("proxy_ips",ips.join(,),EX,10*60)
}
returnips[parseInt(Math.random()*ips.length)]
}
}
asyncfunctiondoRequest(){
letuserAgent=userAgents[parseInt(Math.random()*userAgents.length)]
letip=awaitgetProxyIp()
letuseIp=http://+ip
request.get(http://www.xxx.com)
.set({User-Agent:userAgent})
.timeout({response:5000,deadline:60000})
.proxy(ip)
.end(async(err,res)=>{
///处理数据
})
}
通过上述步骤,我们可以完成动态ip代理设置,可以开始使用。