猿记录

一个记录、分享的博客

您的位置:主页 > 技术专栏 > node >

nodejs 图片小爬虫

2017-12-08 11:33:16 作者:yxl 次阅读 node

var request = require('request');
var cheerio = require('cheerio');
var path = require('path');
var fs = require('fs');
var async = require('async');
 
var options = [];  //用于存储网址链接的数组
var number = 0;
 
 
//图片地址链接的数组
for (var i = 2; i < 77; i++) {
    var obj = {
        url: 'http://www.woyaogexing.com/tupian/dongman/index_' + i +'.html',
        headers:{
           "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
        }
    }
    options.push(obj);
}
 
 
//用来处理这个调用逻辑的总函数
function all(err, res, body) {
    var $ = cheerio.load(body);
    number = number + $(".list-main img").length;
    console.log('共有' + number);
    $(".list-main  img").each(function (i, ele) {
        var imgsrc = $(this).attr('src');
        console.log( '图片地址:'+imgsrc );
        var fileName = FileName(imgsrc.toString());
        console.log( fileName );
        //下载文件操作
        downloadImg(imgsrc, fileName, function () {
            console.log(fileName + ' 下载完成');
        });
    })
}
//格式化图片名称
function FileName(url) {
    var fileName = path.basename(url);
    return fileName;
}
//利用fs模块download图片
function downloadImg(url, filename, callback) {
    var stream = fs.createWriteStream('images/' + filename);
    request(url).on('error',function(){
        console.log('请求异常');
    }).pipe(stream).on('close', callback);
}
 
 
 
//利用async的mapLimit方法实现限定并发数为3的调用
async.mapLimit(options,3, function (option, callback) {
    request(option, all);
    callback(null);
}, function (err, result) {
    if (err) {
        console.log(err);
    } else {
        console.log('全部检索完毕');
    }
})

凡本站注明“本站”或“投稿”的所有文章,版权均属于本站或投稿人,未经本站授权不得转载、摘编或利用其它方式使用上述作品。

编辑:yxl 关键词:
0

网友评论