我正在尝试将结果保存到 json 文件中,但是当我看到它减半时,我的代码中出现了错误,但我不明白您的部分,感谢您的帮助。
var request = require("request");
var cheerio = require("cheerio");
var fs = require('fs');
var urls = ["http://www.fordencuotas.com.ar"]
var req = function(url){
request({
uri: url,
}, function(error, response, body) {
var $ = cheerio.load(body);
$("a").each(function() {
var link = $(this);
var itri = {iti: new Array(link.attr("href"))}
var data = JSON.stringify(itri);
fs.writeFile("file.json", data, function(err){
if(err){console.log(err);} else {console.log("archivo guardado..");}
});
});
});
}
for (var i = 0; i < urls.length; i++){
req(urls[i]);
}
console.log("cargando...");
这个输出
[opmeitle@localhost crawler1]$ node crawmod.js
cargando...
archivo guardado..
archivo guardado..
archivo guardado..
archivo guardado..
archivo guardado..
...
archivo guardado..
[opmeitle@localhost crawler1]$ cat file.json
{"iti":["productos/autos/nuevo-focus.html"]}us.html"]}
[opmeitle@localhost crawler1]$
最佳答案
您的代码中存在一些问题。
首先,您尝试为每个 a
元素覆盖同一个文件 (file.json
)。我不确定这是否是您的意图,但这似乎毫无意义。
其次,fs.writeFile
是异步的。这意味着 Node 不会等到文件写入后才返回循环。换句话说,对于每个 a
元素,您打开同一个文件,而它可能已被循环的早期迭代打开。每次迭代都会写入同一个文件,因此您最终会得到意想不到的结果。
您可以使用fs.writeFileSync
同步写入文件,这将使 Node 等待数据写入文件后再继续,或者收集要保存到文件中的所有数据到变量中,以及 - 在 $("a ").each(...)
循环 — 将该变量写入文件一次。
最后一个解决方案可能如下所示:
var data = [];
$("a").each(function() {
var link = $(this);
var itri = {iti: new Array(link.attr("href"))}
data.push( itri );
});
fs.writeFile("file.json", JSON.stringify(data), function(err){
if(err){console.log(err);} else {console.log("archivo guardado..");}
});
关于node.js - 如何在json nodejs中保存带有请求的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628575/