主页 > 前端 > javascript >
来源:自学PHP网 时间:2017-05-22 15:16 作者: 阅读:次
[导读] 本文给大家分享的是作者使用nodejs制作爬虫来爬去图片并批量下载的全过程,非常的细致,有需要的小伙伴可以参考下...
今天想获取一大批猫的图片,然后就在360流浪器搜索框中输入 1. 爬取图片链接 因为之前也写过nodejs爬虫功能(参见:),所以觉得应该很简单,就用cheerio来处理dom啦,结果打印一下啥也没有,后来查看源代码: 发现 分析完毕,刷刷写代码: var request = require('request'); var cheerio = require('cheerio'); var url = 'http://image.so.com/i?q=%E7%8C%AB&src=tab_www'; request(url,function(err,res,body){ if(!err && res.statusCode === 200){ var $ = cheerio.load(body); var imgList = [] JSON.parse($('script[id="initData"]').html()).list.forEach(function(item){ imgList.push(item.img) }); console.log(imgList); } }); 2. 下载图片到本地 2.1 粗糙的方案 最初的思路很简单,简单的 var downloadPic = function(src, dest){ request(src).pipe(fs.createWriteStream(dest)).on('close',function(){ console.log('pic saved!') }) } 使用方式: downloadPic(imgList[0],'./catpics/1.jpg'); 成功捕获一只猫!然后写了一个循环准备捕获所有猫。然而这种方式是串行的,速度很慢!下载一大批图片要花大量时间。 2.2 使用async异步批量下载 关于async的map操作,详见: async_demo/map.js ,对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与forEach的区别是,forEach只关心操作不管最后的值,而map关心的最后产生的值。 提供了两种方式: 并行执行。 顺序执行。 在此处: async.mapSeries(imgList,function(item, callback){ setTimeout(function(){ downloadPic(item, './catpics/'+ (new Date()).getTime() +'.jpg'); callback(null, item); },400); }, function(err, results){});
成功捕获一批猫猫! 2.3 使用bagpipe批量 bagpipe 是朴灵大大做的一个在nodejs中控制并发执行的模块。其安装和使用也比较简单: npm install bagpipe --save 使用: var Bagpipe = require('bagpipe'); var bagpipe = new Bagpipe(10); var files = ['这里有很多很多文件']; for(vari =0; i < files.length; i++){ bagpipe.push(fs.readFile, files[i], 'utf-8',function(err, data){ ... }); } 在此处: var bagpipe = new Bagpipe(10,{timeout: 100}); for(var i = 0; i < imgList.length; i++) { console.log('i:'+i) bagpipe.push(downloadPic, imgList[i], './catpics/'+ i +'.jpg', function(err, data){ // }); } 3.总结 作为一个程序员,能用程序解决就不手动解决。每一次尝都会有新的收获。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com