zoukankan      html  css  js  c++  java
  • Node.js 使用爬虫批量下载网络图片到本地

    图片网站往往广告众多,用Node.js写个爬虫下载图片,代码不长,省事不少,比手动一张张保存简直是天与地的区别。以前用Java也做过远程图片下载,但Node.js的下载速度更让人咂舌,这也是非阻塞式变成的好处。

    下面代码是一个从mtl.ttsqgs.com下载图片的程序,图片地址是看网站源码看出来的,总共有多少张也可以在网页或源码里找到,然后就是顺藤摸瓜。爬虫无外乎找规律再写代码实现的套路。

    // 内置http模块,提供了http服务器和客户端功能
    var http=require("http");
    
    // cheerio模块,提供了类似jQuery的功能
    var cheerio = require("cheerio");
    
    // 内置文件处理模块
    var fs=require('fs');
    
    // 请求参数JSON
    var options;
    
    // 请求并获得数据
    var req;
    
    var index=1; // 起始页码
    var endIndex=43; // 终止页码
    
    function downloadImg(pageNumber){
        console.log("开始读取第"+pageNumber+"页");
    
        // eg:http://mtl.ttsqgs.com/images/img/4527/3.jpg
        options={
            hostname:'mtl.ttsqgs.com',// 这里别加http://,否则会出现ENOTFOUND错误
                port:80,
                path:'/images/img/798/'+pageNumber+'.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="./xyyx/"+pageNumber+".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();
    
        // 43页调完
        if(index<endIndex){        
            index++;
            console.log('继续第'+index+'页');
            start(index);
        }
    }
    
    // 包一层函数
    function start(i){
        downloadImg(i);
    }
    
    // 开始
    start(index);

    2017年9月30日10:43:27

  • 相关阅读:
    AM8 自定义表情包的实现方法
    Create STKNetDiskC Instance Error
    怎样实现文件发文功能
    企业云盘的数据备份
    一种可行的文档协同编辑方法实现
    【OI】二分图最大匹配
    【OI】位运算操作
    【OI】关于快速幂的简单理解
    【OI】线性筛
    【OI】指针线段树&指针
  • 原文地址:https://www.cnblogs.com/heyang78/p/7614051.html
Copyright © 2011-2022 走看看