node批量下载图片

来源:互联网 发布:thinkphp cms教程 编辑:程序博客网 时间:2024/05/01 12:45

最近想做一个图片管理的webApp,当然就需要大量图片了,想着干脆用脚本批量下载吧,搜了一下node相关的资料,以下是参考网上的资料以所写的:

var fs = require('fs');var request = require('request');var cheerio = require('cheerio');var mkdirp = require('mkdirp');var url = 'http://image.baidu.com/';var dir = './image';mkdirp(dir, function(err) {    if (err){        console.log(err);    }});request(url, function(error, response, body) {    if (!error && response.statusCode == 200) {        var imgArr = [];        var num = 0;        var src = "";        var imgRegex = /http:\/\/[\w\.\/%=-_]+(jpg|png|gif|bmp)/gim;        //以下针对直接用img标签添加的图片        var $ = cheerio.load(body);     //用cheerio来解析dom        $('img').each(function(){       //$(xxx)内部的规则xxx可根据实际情况修改            src = $(this).attr("src");            //若src为相对路径 /xxx/xxx.jpg的形式,则加上域名(根目录)            if(!src.match(/^http/)){                src = /http:\/\/[\w\.]+/.exec(url)[0] + src;            }            imgArr.push(src);        });        //以下针对通过js动态添加的图片,如百度图片        while((src = imgRegex.exec(body)) !== null) {            imgArr.push(src[0]);        }        // 数组去重        imgArr.sort();        for(var j = 0;j < imgArr.length;j++){            if(imgArr[j+1] == imgArr[j]){                imgArr.splice(j+1,1);                j--;            }        }        //开始下载        for(var i = 0; i < imgArr.length; i++){            request({ url: imgArr[i], timeout: 1000 * 3600})            .on('error', function(err) {                console.log(err);            })            .pipe(fs.createWriteStream(dir +"/"+ (num++) + imgArr[i].substr(-4,4)));            console.log('已下载:', imgArr[i]);        }    }});

以上代码均已测试可用。。。但是具体情况可能有些许bug。。比如如果下载百度图片页面(通过js动态添加的),因为页面数据较多,如果网络环境不是很好的话,会出现timeout的error,导致部分图片无法正常下载(但是。。经测试,若网络环境较好,则不会出现上述bug…ORZ…)

0 0