nodejs爬虫如何使用代理IP?

作者:IPIDEA

2022-09-27 15:10:46

当我们进行网站爬虫时,我们会经常遇到IP无法访问公开数据的情况。如果IP经常同时访问,那么挂掉的概率就很高。因此,我们需要设置动态ip代理来解除。

nodejs爬虫如何使用代理IP?.png

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代理设置,可以开始使用。

*ipidea提供的服务必须在境外网络环境下使用

热门资讯