【发布时间】:2015-03-10 05:22:40
【问题描述】:
我在node中使用cheerio和request来写一个简单的scraper,很像这个链接:
我的文件略有不同,以这种形式抓取的 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 也无济于事。
我做错了什么?当我登录到控制台时,它显示为漂亮的 JSON,但实际上并没有写入文件。
此外,year[j] 和 month[k] 未定义。如何让他们看到这两个变量的范围?
【问题讨论】:
-
给函数添加回调,可能会返回错误。在您开始向其写入数据之前,文件 localUrl 是否存在?
标签: javascript json node.js cheerio