Node.js meitulu图片批量下载爬虫1.02版

简介:

以前版本需要先查看网页源码,然后肉眼找到图片数量和子目录,虽说不费事,但多少有点不方便。

于是修改了一下,用cheerio自己去找找到图片数量和子目录,只要修改页面地址就行了。至此社会又前进了一步。

复制代码
//======================================================
// https://www.meitulu.com图片批量下载Node.js爬虫1.02
// 2017年11月6日
//======================================================


// 内置https模块,提供了https服务器和客户端功能
var https=require("https");

// 内置http模块,提供了http服务器和客户端功能
var http=require("http");

var zlib = require('zlib'); 

// cheerio模块,提供了类似jQuery的功能
var cheerio = require("cheerio");

// 内置文件处理模块
var fs=require('fs');

// 请求参数JSON
var options;

// request请求
var req;

//--------------------------------------
// 程序入口 Accept-Encoding:gzip, deflate, br
//--------------------------------------
function start(){
    var pageUrl="https://www.meitulu.com/item/44.html";// 这版修改这个地址就成

    var hostName="";
    var Path="";
    var arr=pageUrl.split("/");
    hostName=arr[2];
    Path="/"+arr[3]+"/"+arr[4];

    // 初始化options  
    options={
        hostname:hostName,
            port:443,
            path:Path,// 子路径
          method:'GET',
           agent:false,
            gzip: true,
    };
    
    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);

            zlib.gunzip(buffer, function(err, decoded) {
                //console.log(decoded.toString());// gzip解压后的html文本
                var body=decoded.toString();
                var $ = cheerio.load(body);
                var endIndex=0;
                var folder="";

                // 查找所有class为c_l的节点下面的p节点
                $(".c_l p").each(function(index,element){
                    if(index==2){
                        var text=$(element).text();
                        //console.log(text); // 图片数量:112张

                        var arr=text.split(" ");
                        endIndex=arr[1];// 112
                    }
                })   

                // 查找所有class为c_l的节点下面的p节点
                $(".content center img").each(function(index,element){
                    if(index==0){
                        var text=$(element).attr("src");
                        //console.log(text); // http://mtl.ttsqgs.com/images/img/44/1.jpg" 

                        var arr=text.split("/");
                        folder=arr[arr.length-2];                        
                    }
                }) 
                
                console.log(endIndex);
                console.log(folder);    

                fs.mkdir('./'+folder,function(err){
                    if(err){
                        console.log("目录"+folder+"已经存在");
                    }
                });
                
                // 下载图片
                for(var i=1;i<=endIndex;i++){
                    downloadPic(folder,i);
                }

            })
        }).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();
}

//--------------------------------------
// 下载图片
// folder:图片所在url的目录
// pinctureIndex:图片序号
//--------------------------------------
function downloadPic(folder,pinctureIndex){
    console.log("开始下载"+pinctureIndex);

    // 初始化options
    options={
        hostname:'mtl.ttsqgs.com',// 这里别加http://,否则会出现ENOTFOUND错误
            port:80,
            path:'/images/img/'+folder+'/'+pinctureIndex+'.jpg',// 子路径
          method:'GET',
    };

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

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

        resp.on('end',function(){
            var fileName="./"+folder+"/"+pinctureIndex+".jpg";
            fs.writeFile(fileName, imgData, "binary", function(err){
                if(err){
                    console.log("文件"+fileName+"下载失败.");
                }
                console.log(fileName+"下载成功");
            });    
        });
    });

    // 超时处理
    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();
}

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

 












本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/xiandedanteng/p/7791797.html,如需转载请自行联系原作者



相关文章
|
11月前
|
数据采集 存储 机器学习/深度学习
Fuel 爬虫:Scala 中的图片数据采集与分析
Fuel 爬虫:Scala 中的图片数据采集与分析
|
9月前
|
数据采集 Web App开发 JavaScript
基于Selenium的Python爬虫抓取动态App图片
基于Selenium的Python爬虫抓取动态App图片
689 68
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
8月前
|
前端开发 JavaScript 容器
制作b超单生成器, 假怀孕b超单图片制作, p图医院证明【css+html+js装逼恶搞神器】
本资源提供一个适合用于熟人之间恶搞的工具,效果逼真,仅供学习参考与娱乐。包含前端技术学习要点:语义化布局、响应式设计、Flexbox、图片自适应
|
12月前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
910 3
|
移动开发 JavaScript 前端开发
【Html.js——图片折叠效果】折叠手风琴(蓝桥杯真题-1763)【合集】
本项目实现了一个图片折叠手风琴效果,使用jQuery完成。主要包括以下部分: - **介绍**:任务是通过点击图片实现折叠和展开的效果。 - **准备**:内置初始代码,包含 `css/style.css`、`images/` 文件夹、`js/` 文件夹及 `index.html` 等文件。启动 Web Server 服务可运行项目。 - **目标**:完善 `index.js` 文件,使页面达到预期的折叠效果。 - **规定**:严格按步骤操作,保持默认文件结构不变,并在完成后保持 Web 服务正常访问状态。 - **通关代码**:使用 jQuery 实现点击事件,为选中元素添加 `act
316 19
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
数据采集 Java Scala
淘宝图片爬虫:Scala与Curl的高效集成
淘宝图片爬虫:Scala与Curl的高效集成
|
数据采集 JavaScript 前端开发
初始爬虫13(js逆向)
初始爬虫13(js逆向)
|
JavaScript 前端开发
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例