实践|用NodeJS爬了一个阿里表情包

今天要做一个添加表情的功能,找了半天没有找到插件、于是只好去别人网站上爬。。
实践|用NodeJS爬了一个阿里表情包_第1张图片

可是这个表情包有接近100个表情嗷、怎么可能一个个下载。于是想到写个爬虫、下载到文件夹里。问题是、我也没写过爬虫啊

一、找了个NodeJS爬虫框架

网上搜到个爬虫框架叫crawler: https://www.npmjs.com/package/crawler#options-reference

上面的示例代码我也试了一下、很方便。加上保存到本地的代码,就是这样:

var fs = require('fs');
var Crawler = require("crawler");
 
var c = new Crawler({
    maxConnections : 10,
    callback : function (error, res, done) {
        if(error){
            console.log(error);
        }else{
            var $ = res.$;
            console.log($("title").text());
        }
        done();
    }
});

c.queue([{
    uri: 'http://www.dianxiaomi.com/static/img/smile/11fixed.png',
    jQuery: false,
    callback: function (error, res, done) {
        if(error){
            console.log(error);
        }else{
            console.log('Grabbed', res.body.length, 'bytes');

            saveAs(res.body, './smile.png');
        }
        done();
    }
}]);

function saveAs(data, filename){
    fs.writeFile(filename, data, 'binary', function(err){
        if (err){
            console.log('download fail');
        } else {
            console.log('download success');
        }
    });
}

只可惜这么保存下来的图片无法打开。字节数也比原图少了好多个。我很怀疑是跟这个是二进制文件有关系。这个方法用来保存个网页文件应该没啥问题。但是没找到怎样配置的方法。

二、用NodeJS的API直接下载网络图片

网上又找到一段“下载网络图片”的代码,比上面的还要简单。修改后就是这样:

var http = require("http");
var fs = require("fs");

function download(url, filename){
    http.get(url, function(res){
        var imgData = "";

        res.setEncoding("binary"); //一定要设置response的编码为binary否则会下载下来的图片打不开
        res.on("data", function(chunk){
            imgData += chunk;
        });

        res.on("end", function(){
            fs.writeFile(filename, imgData, "binary", function(err){
                if(err){
                    console.log("down fail");
                }
                console.log("down success");
            });
        });
    });
}

var dir = './smile/';
var baseUrl = 'http://www.dianxiaomi.com/static/img/smile/';  //0fixed.png
for (var i = 0; i < 100; i++){
    var url = baseUrl + i + 'fixed.png';
    var fileName = dir + i + 'fixed.png';
    download(url, fileName);
}

注意其中有很关键的两句,也就是专门处理二进制文件的:

    res.setEncoding("binary");
    
    fs.writeFile(filename, imgData, "binary", function(err){...
    

这样下载下来的图片就能正常打开了。看,98张表情“唰”的一下就下来了:


实践|用NodeJS爬了一个阿里表情包_第2张图片

这是爬虫的第一步,值得纪念

三、关于NodeJS爬虫的进一步

https://github.com/alsotang/node-lessons/tree/master/lesson3 这个项目是架构组的同学推荐的、里面介绍了怎么把一个网站爬下来。有机会可以一试~

你可能感兴趣的:(实践|用NodeJS爬了一个阿里表情包)