如何使用cheerio和节点中的请求写入文件?

时间:2015-01-12 12:29:15

标签: javascript json node.js cheerio

我正在使用cheerio并在节点中请求编写一个简单的scraper,就像这个链接一样:

https://www.digitalocean.com/community/tutorials/how-to-use-node-js-request-and-cheerio-to-set-up-simple-web-scraping

我的文件稍有不同,要使用此格式抓取网址:http://foo.com/2014/12/http://foo.com/2014/11/等。此处为:

var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');


var year = ["2014", "2013", "2012", "2011", "2010"];
var yearLength = year.length;

var month = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
var monthLength = month.length;

var postDate = '';
var singlePost = {};

var posts = {
    colors: {
        tastes: []
    }
};

var j, k = 0;

for (j=0; j < yearLength; j++) {
    for (var k=0; k < monthLength; k++) {    

    var fooUrl = 'http://foo.com/' + year[j] + '/' + month[k];         
    var localUrl = './' + year[j] + '/' + month[k] + '/texts.json';

    console.log(JSON.stringify(localUrl));

    request(fooUrl, function (error, response, html) {
        if (!error && response.statusCode == 200) {
            var $ = cheerio.load(html);

            $('ul.slashdot').each(function(i, element){
               var postDate = $(this).children().first().text();            
               $(this).children().first().siblings().each(function(i, element){

               var post = $(this).children();

               var postUrl = post.eq(3).attr('href');



            var singlePost = {

                day: postDate,
                url: postUrl,
                year: year[j],
                month: month[k]

            };

            posts.colors.tastes.push(singlePost);

            });


        });

        fs.writeFile(localUrl, JSON.stringify(posts, null, 2));
        }
    });
    }
}

现在,当我遍历两个循环时,我无法写入文件。使用writeFileSync也没有帮助。

我做错了什么?当我登录到控制台时,它显示为漂亮的JSON,但实际上并没有写入文件。

此外,year[j]month[k]未定义。如何让他们看到这两个变量的范围?

1 个答案:

答案 0 :(得分:0)

您需要确保路径上的所有目录都存在,否则创建它们。

您可能需要查看node-fs-extra模块。 createFile(file,callback)应该有所帮助:https://www.npmjs.com/package/node-fs-extra