400-998-9776转2 服务时间:周一至周日 9:00-23:00 注意:本站不提供境外服务本站不提供境外服务

返回

nodejs爬虫怎么设置代理IP?

发布时间:2019-12-11 15:12:49 来源:IP精灵

  我们在进行网站爬虫的时候,会比较常碰上IP被封杀的情况,如果IP在同一时间经常访问,那么我们的IP挂掉的概率就非常高。所以我们需要设置动态代理IP来解除。

nodejs爬虫怎么设置代理IP

  nodejs爬虫如何设置动态ip?下面看看IP精灵带来的教程介绍:


  动态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": "nodemon src/app.js --exec babel-node --config package.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


  import request from 'superagent'


  import requestProxy from 'superagent-proxy'


  import redis from 'redis'


  // superagent添加使用代理ip的插件


  requestProxy(request)


  // redis promise化


  bluebird.promisifyAll(redis.RedisClient.prototype)


  bluebird.promisifyAll(redis.Multi.prototype)


  // 建立mongoose和redis连接


  const redisClient = connectRedis()


  /**


  * 初始化redis


  */


  function connectRedis() {


  let client = redis.createClient(config.REDIS_URL)


  client.on("ready", function(err) {


  console.log('redis连接 √')


  })


  client.on("error", function(err) {


  console.log(`redis错误,${err} ×`);


  })


  return client


  }


  /**


  * 请求免费代理,读取redis,如果代理信息已经过期,重新请求免费代理请求


  */


  async function getProxyIp() {


  // 先从redis读取缓存ip


  let localIpStr = await redisClient.getAsync('proxy_ips')


  let ips = null


  // 如果本地存在,则随机返回其中一个ip,否则重新请求


  if (localIpStr) {


  let localIps = localIpStr.split(',')


  return localIps[parseInt(Math.random() * localIps.length)]


  } else {


  let ipsJson = (await request.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


  let isRequestSuccess = 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)


  }


  return ips[parseInt(Math.random() * ips.length)]


  }


  }


  async function doRequest(){


  let userAgent = userAgents[parseInt(Math.random() * userAgents.length)]


  let ip = await getProxyIp()


  let useIp = 'http://' + ip


  request.get('http://www.xxx.com')


  .set({ 'User-Agent': userAgent })


  .timeout({ response: 5000, deadline: 60000 })


  .proxy(ip)


  .end(async(err, res) => {


  // 处理数据


  })


  }


  通过上面的步骤来操作,我们就可以完成动态代理IP的设置了,可以开始使用了。