<pre id="jbbnp"><rp id="jbbnp"></rp></pre>

    [功能介紹]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 © 2020-2022 www.meshmotors.com. All Rights Reserved. IP海 版權所有.
    IP海僅提供中國內IP加速服務,無法跨境聯網,用戶使用IP海從事的任何行為均不代本公司的意志和觀點,產生的相關責任用戶自負。
    ICP備案鄂ICP備19030659號-3 公安備案鄂公網安備42100302000141號 計算機軟件著作權證計算機軟件著作權證 ICP/EDI許可證ICP/EDI許可證:鄂B2-20200106

    微信掃一掃咨詢
    八戒八戒在线www日本