溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

nodejs爬蟲中如何設(shè)置動態(tài)ip

發(fā)布時間:2021-06-30 13:49:05 來源:億速云 閱讀:458 作者:小新 欄目:編程語言

這篇文章主要介紹了nodejs爬蟲中如何設(shè)置動態(tài)ip,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

說明

1、建立動態(tài)IP需要使用superagent-proxy插件,superagent-proxy。

2、為了避免每次爬取時都要獲得一次動態(tài)IP列表,在redis中保存爬取到的動態(tài)IP列表,并設(shè)置10分鐘的過期時間。重新發(fā)送獲取動態(tài)IP的請求后,請在數(shù)據(jù)過期。

實例

  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,如果代理信息已經(jīng)過期,重新請求免費代理請求
 
  */
 
  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']
 
  }
 
  // 將爬取結(jié)果存入本地,緩存時間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) => {
 
  // 處理數(shù)據(jù)
 
  })
 
  }

感謝你能夠認真閱讀完這篇文章,希望小編分享的“nodejs爬蟲中如何設(shè)置動態(tài)ip”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI