美文网首页Node.jsOnlyJS
用node.js爬取网站图片并保存

用node.js爬取网站图片并保存

作者: 忽如寄 | 来源:发表于2016-10-27 11:09 被阅读2022次

    昨天是传说中的程序员节,虽然我对于这个并无感,但还是来搞点事吧,写一个最简单的爬虫,抓取图片并保存在本地,如下,我们抓取的是http://www.ivsky.com/这个网址的图片。
    用到的模块:cheerio(一个在服务端操作DOM的模块)、fs(文件模块)、http
    代码如下:

    var http = require("http");
    var fs = require("fs");
    var cheerio = require("cheerio");
    var url = "http://www.ivsky.com/";
     
    function download ( url,callback ) {
        http.get( url,function(res){
            var data = "";
            res.on("data",function(chunk){
                data += chunk;
            });
            res.on("end",function(){
                callback(data)
            })
        }).on("error",function(err){
            console.log(err)
        })
    }
     
    download( url,function( data ) {
        if(data){
            var $=cheerio.load(data);
            $("img").each(function(i,elem){
                var imgSrc=$(this).attr("src");
                http.get(imgSrc,function(res){
                    var imgData="";
                    res.setEncoding("binary");
                    res.on("data",function(chunk){
                        imgData += chunk;
                    });
                    console.log(imgData);
                    res.on("end",function(){
                        var imgPath="/"+i+"."+imgSrc.split(".").pop();
                        fs.writeFile(__dirname + "/imgs"+imgPath,imgData,"binary",function(err){
                            console.log(err);
                        })
                    })
                                 
                })
            })
        }
    })
    

    注意:所获取的数据的二进制数据,所以一定要设置编码格式为binary,因为writeFile的默认编码格式为utf-8,否则保存的图片无法打开。

    运行代码不到5秒钟,就抓取完了并命名好了,这相对于我们手动保存,速度不知道要高到哪里去,截图如下:

    就这样吧,所以你想抓取哪个网站的图片就抓取哪个网站的图片(当然除了那些做了防爬虫处理的)。

    相关文章

      网友评论

      • Welkin_qing:我想问的楼上已经问了:joy: 顺便祝你中秋快乐
      • 喵妈:你的nodejs实战书里这个demo不这样写的,而且你书里的这个demo是错的,callback 函数不可以用,你有空看一下,谢谢
        Welkin_qing:@忽如寄 为什么我在index文件里加了var fs = require("fs");还是没有爬下来图片?
        喵妈:@忽如寄 是的
        忽如寄:是的,书里的拆分了多个文件解耦,我这边运行的话是可以的,但是我看了一下书籍的问题是在于index.js的那里缺少了对fs的引用,不知道您说的callback问题是这个吗?
      • Angeliawindly:那如果是抓取HTTPS 的地址尼?
      • DannyWu:保存为什么文件使用
      • atfa:好赞

      本文标题:用node.js爬取网站图片并保存

      本文链接:https://www.haomeiwen.com/subject/pdgjuttx.html