[功能介绍]nodejs爬虫怎么设置ip代理?

发布时间:2020-07-02 关注热度:°C

  我们在进行网站爬虫的时候,会比较常碰上IP被封杀的情况,如果IP在同一时间经常访问,那么我们的IP挂掉的概率就非常高。所以我们需要设置动态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代理的设置了,可以开始使用了。

 

版权声明:本文为IP海(iphai.cn)原创作品,未经许可,禁止转载!

Copyright © www.iphai.cn. All Rights Reserved. IP海 版权所有.
IP海仅提供中国内IP加速服务,无法跨境联网,用户应遵守《服务条款》内容,严禁用户使用IP海从事任何违法犯罪行为。
ICP备案鄂ICP备19030659号-3 公安备案鄂公网安备42100302000141号 计算机软件著作权证计算机软件著作权证 ICP/EDI许可证ICP/EDI许可证:鄂B2-20200106

微信扫一扫咨询