[nodejs实战:校花网学妹图片采集+站点发布]二、数据的保存:fs.writeFile

上一篇nodejs实战:校花网美女图片采集+站点发布 [http.request采集内容]中,我们已经通过http.request获取到校花网http://www.xiaohuar.com/news-1-1722.html页面的内容,那怎么把获取到的内容保存下来呢?这就需要Node.js的文件系统了。

nodejs的文件系统需要引入fs模块:var fs = require("fs"),然后就可以用fs中的各种方法来实现保存文件、打开文件、判断文件是否存在,删除文件等功能,具体的理论知识请自行了解。本教程采用fs.writeFile(filename, data[, options], callback)来保存抓取的数据。

var http = require('http');
var iconv = require('iconv-lite');
var BufferHelper = require('bufferhelper');
var url = 'http://www.xiaohuar.com/news-1-1722.html';

http.get(url,
function(res) {
    var bufferHelper = new BufferHelper();
    res.on('data',
    function(chunk) {
        bufferHelper.concat(chunk);
    }).on('end',
    function() {
        var val = iconv.decode(bufferHelper.toBuffer(), 'gb2312');
        fs.writeFile('xiaohua.html', val,
        function() {
            console.log('保存成功');
        });
    });

}).on('error',
function(e) {
    console.log('Got error:' + e.message);
});

运行以上代码则可以看到目录下多了一个xiaohua.html的文件,用编辑器打开发现就是我们抓取的内容,但是有个问题,就是双击运行的时候又出现了乱码。问题还是编码的原因。我们从校花网抓取的编码是gb2312的,而fs.writeFile默认保存的是utf-8,所以我们在保存的时候需要手动设置编码:

var http = require('http');
var iconv = require('iconv-lite');
var BufferHelper = require('bufferhelper');
var url = 'http://www.xiaohuar.com/news-1-1722.html';

http.get(url,
function(res) {
    var bufferHelper = new BufferHelper();
    res.on('data',
    function(chunk) {
        bufferHelper.concat(chunk);
    }).on('end',
    function() {
        var val = iconv.decode(bufferHelper.toBuffer(), 'gb2312');//将获取到的数据由gb2312编码转成utf8编码
        val = iconv.encode(val, 'gb2312');//将数据转成gb2312编码
        fs.writeFile('xiaohua.html', val,
        function() {
            console.log('保存成功');
        });
    });

}).on('error',
function(e) {
    console.log('Got error:' + e.message);
});

再运行就正常显示了。不过上面的iconv.decode和iconv.encode两个方法大家肯定会有疑问,在此解释一下:

iconv.decode的作用是将其他编码的字符串转换成unicode编码,iconv.encode的作用是将unicode编码转换成其他编码的字符串。咱使用var val = iconv.decode(bufferHelper.toBuffer(), 'gb2312');这一行代码的目的是为了将获取到的数据由gb2312编码转变成utf8编码,便于console.log(val)的时候不输出乱码;而val = iconv.encode(val, 'gb2312')这一步则是将上一步转换成的utf8编码的内容再转换成gb2312编码便于将内容保存之后再打开的时候不出乱码。于是在此处就形成冗余了,如果我们不需要console而直接保存的时候,那我们就不需要转码了,直接将获取的gb2312编码的内容直接保存就好了:

var http = require('http');
var iconv = require('iconv-lite');
var BufferHelper = require('bufferhelper');
var url = 'http://www.xiaohuar.com/news-1-1722.html';

http.get(url,
function(res) {
    var bufferHelper = new BufferHelper();
    res.on('data',
    function(chunk) {
        bufferHelper.concat(chunk);
    }).on('end',
    function() {
        fs.writeFile('xiaohua.html', bufferHelper.toBuffer(),
        function() {
            console.log('保存成功');
        });
    });

}).on('error',
function(e) {
    console.log('Got error:' + e.message);
});

运行之后发现效果是一样的。

针对本案例,fs.writeFile就够用了,但是nodejs的文件系统却远不仅如此,他能实现的功能有很多,比如判断文件是否存在、判断文件是文件还是文件夹、文件的移动、复制、删除,遍历文件夹下的所有文件等等。这些内容在后续教程会慢慢提到。

本章节到此结束,下一章将说说怎么从获取到的内容中获取到我们想要的内容,超级简单哦~

未经允许不得转载:前端撸码笔记 » [nodejs实战:校花网学妹图片采集+站点发布]二、数据的保存:fs.writeFile

上一篇:

下一篇: