node.js爬取美女图片(一)

node.js爬取美女图片

一、准备工作

首先找一个美女图片网站,这里我选用的是唯美女生,看起来像一个个人维护的网站。

分析页面结构:

1、主页主体部分就是图集列表;

2、URL的形式为 BaseUrl + "/page/" + PageIndex

3、每个图集点击进入就可获取全部图片,不用翻页,相对简单

分析页面元素:

1、图集==>body>div.update_area>div.update_area_content>ul.update_area_lists>li.i_list list_n2>a>img.waitpic

2、图片==>body>div.main>div.main_inner>div.main_left>div.content>div.content_left>p>a>img

二、代码

const superagent = require('superagent');
const charset = require('superagent-charset');
const async = require('async');
const fs = require('fs');
const request = require('request');
const cheerio = require('cheerio');
charset(superagent);

const baseUrl = 'https://www.vmgirls.com/'
let type =  'page';
let page =  '12';
var route = `${type}/${page}`

mkdirs('./image/'+page,function(){
  getPageUrl(baseUrl+route,page)
})

function getPageUrl(url,page){
    superagent.get(url)
    .charset('UTF-8')
    .end(function(err, sres) {
        var items = [];
        var images = [];
        if (err) {
            console.log('ERR: ' + err);
            return;
        }else{
            var $ = cheerio.load(sres.text);
            $('div.update_area ul.update_area_lists li.i_list a').each(function(idx, element) {
                var $element = $(element);
                var url = $element.attr('href');
                var title = $element.attr('title');
                var name = page+"-"+idx+title;
                items.push({
                    title: title,
                    name: name,
                    url: url
                });
            });
            getImgUrl(items,0,page)
        }        
    });
}

function getImgUrl(its,ind,page){ 
  if(ind>=its.length){
    console.log("page:"+page+"-"+ind)
  }else{
    it = its[ind];
    superagent.get(its[ind].url)
    .charset('UTF-8')
    .end(function(err, sres) {
        var items = [];
        if (err) {
            console.log('ERR: ' + err);
        }else{
            var $ = cheerio.load(sres.text);
            $('div.main div.main_left div.content div.content_left p img').each(function(idx, element) {
                var $element = $(element);
                var src = $element.attr('src');
                var name = it.name+"-"+idx+".jpg";
                items.push({
                    name: name,
                    src: src
                });
            });
            async.mapSeries(items,function(item, callback){                   
                setTimeout(function(){
                savedImg(item.src, item.name,page,function(){
                    callback(null, item);
                });                    
                },100);                                       
            }, function(err, results){                
                getImgUrl(its,ind+1,page)
            });
        }       
    });
  }
  
}


function savedImg(img_src,name,page,callback) {       
    try{
        request.head(img_src);
        var writeStream = fs.createWriteStream('./image/'+page+'/'+name);
        var readStream = request({url: img_src, timeout: 15000})
        readStream.pipe(writeStream);
        readStream.on('end', function(response) {
            writeStream.end();
        });
        writeStream.on("finish", function() {
            callback();
        });
    }
    catch(ex){
        console.log(ex);
        callback();
    }
}


function mkdirs(dirpath,_callback) {
    var dirArray = dirpath.split('/');
    fs.exists( dirpath ,function(exists){
            if(!exists){
                mkdir(0, dirArray,function(){
                    console.log('文件夹创建完毕!准备写入文件!');
                    _callback();
                });
            }else{
                console.log('文件夹已经存在!准备写入文件!');
                _callback();
            }
    });
}

function  mkdir(pos, dirArray,_callback){
    var len = dirArray.length;
    console.log(len);
    if( pos >= len || pos > 10){
        _callback();
        return;
    }
    var currentDir = '';
    for(var i= 0; i <=pos; i++){
        if(i!=0)currentDir+='/';
        currentDir += dirArray[i];
    }
    fs.exists(currentDir,function(exists){
        if(!exists){
            fs.mkdir(currentDir,function(err){
                if(err){
                    console.log('创建文件夹出错!');
                }else{
                    console.log(currentDir+'文件夹-创建成功!');
                    mkdir(pos+1,dirArray,_callback);
                }
            });
        }else{
            console.log(currentDir+'文件夹-已存在!');
            mkdir(pos+1,dirArray,_callback);
        }
    });
}

这里我用的是vscode,运行后先创建文件夹,随后根据URL获取图集的链接,然后遍历链接获取图集中图片并保存到本地。

更多内容看github:https://github.com/bloodymandoo/vmgirls

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此源码为了缩减内容不带任何图片数据,请搭建后自己采集或者录入,采集不会的话可以百度找一下采集教程,,也可以直接去淘宝上找做采集的,价格也不是很贵! 本帖资源标签:WordPress自适应图片主题,主题模板,带会员积分下载系统 分类和标签添加筛选功能; 列表增加用户自定义排序功能,支持点赞和浏览数量排序; 优化二级菜单和三级菜单的css样式; 支持会员功能和用户中心模板; 支持第三方快速登陆(QQ和新浪); 新增单图模式,全新的图片浏览模式; 新增登陆、注册、找回密码三合一页面模板; 新增文章点赞排行榜页面; 新增AJAX列表加载功能; 新增广告投放面板; 支持点卡充值和点卡生成功能; 支持积分签到功能; 支持评论和投稿奖励积分功能; 支持积分开通会员功能(目前内置3个级别的会员); 支持积分下载资源和免费资源下载; 支持vip免费资源添加; 新增下载资源管理员和作者查看下载次数和校验资源功能; 支持文章前台投稿功能; 支持前台开启相对地址和绝对地址切换功能; 新增图片自动分页功能; 新增图片分页浏览模板; 新增后台列表显示缩略图和封面图片功能; 全新的SEO功能; 新增文章收藏功能; 新增文章顶踩功能(踩的按钮目前只在单图模式显示); 新增图片预加载功能; 幻灯片支持外链和自定义大图; 源码测试环境推荐php5.2/5.3/5.4Mysql 安装说明: 上传文件拿到网站根目录,直接安装即可,附带wordpress。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值