Node.js aitaotu图片批量下载Node.js爬虫1.00版[通俗易懂]

Node.js aitaotu图片批量下载Node.js爬虫1.00版[通俗易懂]即使是https网页,解析的方式也不是一致的,需要多试试。代码://======================================================//aitaotu图片批量下载Node.js爬虫1.00//2017年11月14日//======================================…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

即使是https网页,解析的方式也不是一致的,需要多试试。

代码:

复制代码
//======================================================
// aitaotu图片批量下载Node.js爬虫1.00
// 2017年11月14日
//======================================================

// 内置http模块
var https=require("https");

// 内置文件处理模块,用于创建目录和图片文件
var fs=require('fs');

// cheerio模块,提供了类似jQuery的功能,用于从HTML code中查找图片地址和下一页
var cheerio = require("cheerio");

// 请求参数JSON。http和https都有使用
var options;

// request请求
var req;

// 图片数组,找到的图片地址会放到这里
var pictures=[];

//--------------------------------------
// 爬取网页,找图片地址,再爬
// pageUrl sample:https://www.aitaotu.com/rihan/30598.html
// pageUrl sample:https://www.aitaotu.com/rihan/33405.html
//--------------------------------------
function crawl(pageUrl){
    console.log("Current page="+pageUrl);

    // 得到hostname和path
    var currUrl=pageUrl.replace("https://","");
    var pos=currUrl.indexOf("/");
    var hostname=currUrl.slice(0,pos);        
    var path=currUrl.slice(pos);    
    //console.log("hostname="+hostname);
    //console.log("path="+path);
    
    // 初始化options  
    options={
        hostname:hostname,
            port:443,
            path:path,// 子路径
          method:'GET',              
    };

    req=https.request(options,function(resp){
        var html = [];

        resp.on("data", function(data) {
            html.push(data);
        })
        resp.on("end", function() {
            var buffer = Buffer.concat(html);
            var body=buffer.toString();
            //console.log(body);

            var $ = cheerio.load(body);        
            var picCount=0;

            // 找图片放入数组
            $("#big-pic p a img").each(function(index,element){
                var picUrl=$(element).attr("src");
                //console.log(picUrl);

                if(picUrl.indexOf('.jpg')!=-1){
                    pictures.push(picUrl); 
                    picCount++;
                } 
            })   
            console.log("找到图片"+picCount+"张.");
                
            var nextPageUrl=null;
            // 找下一页
            $(".pages ul li a").each(function(index,element){
                var text=$(element).text();

                if(text.indexOf('下一页')!=-1){
                    nextPageUrl=$(element).attr("href");
                    nextPageUrl="https://www.aitaotu.com/"+nextPageUrl;// 把省略部分加上
                    console.log("找到下一页.");
                }        
            })

            if(nextPageUrl==null){
                console.log(pageUrl+"已经是最后一页了.");
                download(pictures);
            }else{
                //console.log("下一页是"+nextPageUrl);
                crawl(nextPageUrl);
            }
            
        }).on("error", function() {
            console.log("获取失败")
        })
    });

    // 超时处理
    req.setTimeout(5000,function(){
        req.abort();
    });

    // 出错处理
    req.on('error',function(err){
        if(err.code=="ECONNRESET"){
            console.log('socket端口连接超时。');
        }else{
            console.log('请求发生错误,err.code:'+err.code);
        }
    });

    // 请求结束
    req.end();
}

var total=0;
var succeed=0;
var failed=0;

//--------------------------------------
// 下载图片
//--------------------------------------
function download(pictures){
    var folder='pictures('+getNowFormatDate()+")";
    // 创建目录
    fs.mkdir('./'+folder,function(err){
        if(err){
            console.log("目录"+folder+"已经存在");
        }
    });

    total=pictures.length;
    console.log("总计有"+total+"张图片将被下载.");
    appendToLogfile(folder,"总计有"+total+"张图片将被下载.\n");
    for(var i=0;i<pictures.length;i++){
        var picUrl=pictures[i];
        downloadPic(picUrl,folder);
    }
}

//--------------------------------------
// 写log文件
//--------------------------------------
function appendToLogfile(folder,text){
    fs.appendFile('./'+folder+'/log.txt', text, function (err) {
        if(err){
            console.log("不能书写log文件");
            console.log(err);
        }
    });
}

//--------------------------------------
// 取得当前时间
//--------------------------------------
function getNowFormatDate() {
    var date = new Date();
    var seperator1 = "-";
    var seperator2 = "_";
    var month = date.getMonth() + 1;
    var strDate = date.getDate();
    if (month >= 1 && month <= 9) {
        month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
        strDate = "0" + strDate;
    }
    var currentdate =date.getFullYear() + seperator1 + month + seperator1 + strDate
            + " " + date.getHours() + seperator2 + date.getMinutes()
            + seperator2 + date.getSeconds();
    return currentdate;
}

//--------------------------------------
// 下载单张图片
// picUrl sample:https://img.aitaotu.cc:8089/Pics/2017/0410/03/01.jpg
//--------------------------------------
function downloadPic(picUrl,folder){
    console.log("图片:"+picUrl+"下载开始");

    // 得到hostname,path和port
    var currUrl=picUrl.replace("https://","");
    var pos=currUrl.indexOf("/");
    var hostname=currUrl.slice(0,pos);        
    var path=currUrl.slice(pos);    
    var arr=hostname.split(":");
    hostname=arr[0];
    var port=arr[1];

    //console.log("hostname="+hostname);
    //console.log("path="+path);
    //console.log("port="+port);

    var picName=currUrl.slice(currUrl.lastIndexOf("/"));
    
    // 初始化options  
    options={
        hostname:hostname,
            port:port,
            path:path,// 子路径
          method:'GET',
    };

    req=https.request(options,function(resp){
        var imgData = "";
        resp.setEncoding("binary"); 

        resp.on('data',function(chunk){
            imgData+=chunk;            
        });

        resp.on('end',function(){        

            // 创建文件
            var fileName="./"+folder+picName;
            fs.writeFile(fileName, imgData, "binary", function(err){
                if(err){
                    console.log("[downloadPic]文件"+fileName+"下载失败.");
                    console.log(err);
                    appendToLogfile(folder,"文件  "+picUrl+"  下载失败.\n");
                    failed++;
                }else{
                    appendToLogfile(folder,"文件  "+picUrl+"  下载成功.\n");
                    console.log("文件"+fileName+"下载成功");
                    succeed++;
                }
            });    
        });
    });

    // 超时处理
    req.setTimeout(7500,function(){
        req.abort();
    });

    // 出错处理
    req.on('error',function(err){
        if(err){
            console.log('[downloadPic]文件'+picUrl+"下载失败,"+'因为'+err);
            appendToLogfile(folder,"文件"+picUrl+"下载失败.\n");
        }

        failed++;
    });

    // 请求结束
    req.end();
}

//--------------------------------------
// 程序入口 
//--------------------------------------
function getInput(){
        
    process.stdout.write("\033[35m 请输入第一页URL:\033[039m");    //紫色
    process.stdin.resume();
    process.stdin.setEncoding('utf8');    

    process.stdin.on('data',function(text){
        process.stdin.end();// 退出输入状态        
        crawl(text.trim());// trim()是必须的!        
    });    
}

// 调用getInput函数,程序开始
getInput();
复制代码














版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193898.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • AutoScaling 目标追踪伸缩规则概述「建议收藏」

    AutoScaling 目标追踪伸缩规则概述「建议收藏」AutoScaling 目标追踪伸缩规则概述

  • EVE-NG模拟器教程(一)——安装包下载「建议收藏」

    EVE-NG模拟器教程(一)——安装包下载「建议收藏」一、EVE-NG基本简介EVE-NG(EmulatedVirtualEnvironment-NextGeneration)是一款由第三方制作的、功能强大的免费模拟器,是Unetlab(UnifiedNetworkingLab,统一网络实验室)模拟器的最新版本(Unetlab2.0),融合了dynamips,IOL,KVM,可以支持丰富的模拟镜像格式,不仅可以模拟交换机、路由器、防火墙等网络设备,还可以运行任何格式为qcow2的虚拟机。相比传统的模拟器(如GNS3),其最大特色就…

  • [硬件驱动] CAN接口

    [硬件驱动] CAN接口CAN接口的介绍:CAN总线可分为:高速CAN,低速CAN,单线CAN。1.在速度方面高速CAN的传输速率在125K~~1Mbps。低速CAN的速率在125Kbps以下,低速CAN具更好的容错性。2.这三种总线之间的最主要区别是物理层。以传输介质和线的数量说,单线CAN只需1条导线,低速容错CAN和高速CAN通过双绞线传输。还有电平的逻辑的区别,定义逻辑为1称作隐性,逻辑为0称作…

  • python挖矿脚本代码_一个挖矿脚本

    python挖矿脚本代码_一个挖矿脚本遇到一台机器偶尔cpu使用率达到80%,触发告警。登录查看后一个sshd2程序导致cpu负载高仔细查看就知道和sshd是两个完全不同的进程,取名sshd2应该只是为了迷惑用户ps-ef查看到父进程是一个/tmp/javax/config.sh,这个文件在当前系统已经删除了,所以只能按照pid号通过lsof-pPID查看打开的文件句柄在/proc/PID/fd里面顺利找到执行脚本#!/bin…

  • Darknet-53_darknet_track

    Darknet-53_darknet_track今天想下载这个文件,百度一搜,好多博主要收费才能下载,我就奇怪了,这玩意又不是他自己脑力活动创造的代码,收啥费啊,现在免费分享这个链接:链接:https://pan.baidu.com/s/17yywRWP-IaGXT6es1u5_-A提取码:fggd各位看官,拿走的时候顺便点个赞吧。20204.24…

    2022年10月30日
  • java实用工具类——使用java代码实现ftp上传下载工具类

    java实用工具类——使用java代码实现ftp上传下载工具类一、引言小编最近忙着学习项目构架上的一些技术,把实用的工具类整理下,单独放在一个项目。其他项目需要用直接使用maven依赖一下就可以使用了。项目中需要实现上传多张图片,由于多张图片,又担心并发量大。所以小编做了一个负载均衡,把上传后的图片保存到linux上的ftp中去,不了解linux上的ftp小编后期编写个教程。二、实现以下ftp的工具类,前提需要保证你的ftp服务器能够使用ftp客…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号