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

我使用cheerio和节点中的请求来写一个简单的刮板,就像这个链接:

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

我的文件略有不同,URL的格式如下: 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也没有帮助。

我究竟做错了什么? 当我login到控制台时,它显示为美丽的JSON,但实际上并没有写入文件。

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

您需要确保path上的所有目录都存在,如果不存在,则创build它们。

你可能想看看node-fs-extra模块。 createFile(文件,callback)应该帮助: https : //www.npmjs.com/package/node-fs-extra