您好,登錄后才能下訂單哦!
這篇文章主要介紹了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í)!
免責(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)容。