您的位置:首页
>文章内容
网络爬虫封ip该怎么办?用万变ip搭建一个个人IP代理池
接下去应说到Node的深坑,多线程,因为多线程构架,必须采用Promise来操纵,例如在这一代理ip池中,会出現reqeust涵数还没爬完的那时候就刚开始实行认证涵数,非常容易错误,因此人们必须分成2组,一组为多线程抓取网址抓取,另一组为多线程认证代理ip,因此人们来更新改造一下上边的编码:
//生成网址 var ipUrl = function(resolve){ var url = 'http://www.xicidaili.com/nn/' var options = { url:'http://www.xicidaili.com/nn/', headers, } var arr = [] for (let i = 1; i <= 5; i++) { options.url = url + i arr.push(requestProxy(options)) } //Promise.all接收一个数组,直到数组里所有的函数执行完毕才执行后面then里的内容 //实际上放这里有点多余,后期会改过来,先将就 Promise.all(arr).then(function(){ resolve() }) } //链接网络 var requestProxy = function(options){ return new Promise((resolve, reject) => { request(options, function(err, response, body){ if(err === null && response.statusCode === 200){ loadHtml(body) resolve() } else { console.log('链接失败') resolve() } }) }) }
接下来分析一下网页内容,这里我们只需要ip,端口,和类型即可:
//分析网页内容 var loadHtml = function(data){ var l = [] var e = cheerio.load(data) e('tr').each(function(i, elem){ l[i] = e(this).text() }) for (let i = 1; i < l.length; i ++){ //在提取到想要的内容后发现太乱,需要额外的函数进行处理优化 clearN(l[i].split(' ')) } } //提取优化文件数据, var clearN = function(l){ var index = 0 for (let i = 0; i < l.length; i++) { if(l[i] === '' || l[i] === ' '){ }else{ var ips = l[i].replace(' ','') if (index === 0){ var ip = ips console.log('爬取ip:' + ip) } else if(index === 1){ var port = ips } else if(index === 4){ var type = ips } index += 1 } } //存入数据库 insertDb(ip, port, type) }
接着来实现数据库的存储删除功能:
//打开数据库 var db = new sqlite3.Database('Proxy.db', (err) => { if(!err){ console.log('打开成功') } else { console.log(err) } }) db.run('CREATE TABLE proxy(ip char(15), port char(15), type char(15))',(err) => {}) //添加数据文件 var insertDb = function(ip, port, type){ db.run(\"INSERT INTO proxy VALUES(?, ?, ?)\",[ip,port,type]) } //删除数据库文件 var removeIp = function(ip){ db.run(`DELETE FROM proxy WHERE ip = '${ ip }'`, function(err){ if(err){ console.log(err) }else { console.log('成功删除:'+ip) } }) } //从数据库提取所有ip var allIp = function(callback){ return db.all('select * from proxy', callback) }
接着将数据库里的ip提取出来,进行测速筛选:
//从数据库提取出来的ip会通过这个类创建一个对象 var Proxys = function(ip,port,type){ this.ip = ip this.port = port this.type = type } //提取所有ip,通过check函数检查 var runIp = function(resolve){ var arr = [] allIp((err,response) => { for (let i = 0; i < response.length; i++) { var ip = response[i] var proxy = new Proxys(ip.ip, ip.port, ip.type) arr.push(check(proxy, headers)) } Promise.all(arr).then(function(){ allIp((err, response)=>{ console.log(' 可用ip为:') console.log(response) }) }) }) } //检测ip var check = function(proxy, headers){ return new Promise((resolve, reject) => { request({ //检测网址为百度的某个js文件,速度快,文件小,非常适合作为检测方式 url:'http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js', proxy: `${proxy.type.toLowerCase()}://${proxy.ip}:${proxy.port}`, method:'GET', //这里延迟使用了2000,如果希望通过检测的ip多一些,可以适当延长 timeout: 2000, headers,} ,function(err, response,body){ if(!err && response.statusCode == 200){ console.log(proxy.ip+' 链接成功:') resolve() } else { console.log(proxy.ip+' 链接失败') removeIp(proxy.ip) resolve() } } ) }) }
最后,来写几个运行函数:
var run = function(){ new Promise(ipUrl).then(runIp) } var rcheck= function(){ runIp() } var ips = function(callback){ allIp(callback) }
大功告成:
推荐阅读
热门文章
因为专业! 所以简单! 产品至上,价格实惠 是我们服务追求的宗旨
免费试用