我正在使用cheerio并在节点中请求编写一个简单的scraper,就像这个链接一样:
我的文件稍有不同,要使用此格式抓取网址: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]
未定义。如何让他们看到这两个变量的范围?
答案 0 :(得分:0)
您需要确保路径上的所有目录都存在,否则创建它们。
您可能需要查看node-fs-extra模块。 createFile(file,callback)应该有所帮助:https://www.npmjs.com/package/node-fs-extra