[功能介紹]nodejs爬蟲怎么設置ip代理?
我們在進行網站爬蟲的時候,會比較常碰上IP被封殺的情況,如果IP在同一時間經常訪問,那么我們的IP掛掉的概率就非常高。所以我們需要設置動態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.skldkt.com. All Rights Reserved. IP海 版權所有.
IP海僅提供中國內IP加速服務,無法跨境聯網,用戶應遵守《服務條款》內容,嚴禁用戶使用IP海從事任何違法犯罪行為。
鄂ICP備19030659號-3
鄂公網安備42100302000141號
計算機軟件著作權證
ICP/EDI許可證:鄂B2-20200106