2

結果を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]$ 
4

1 に答える 1

4

コードにはいくつかの問題があります。

まず、各要素に対して同じファイル ( ) を上書きしようとしています。それがあなたの意図かどうかはわかりませんが、かなり無意味に思えます。file.jsona

第二に、fs.writeFile非同期です。つまり、ノードはファイルが書き込まれるまで待たずにループに戻ります。つまり、要素ごとaに同じファイルを開きますが、ループの以前の繰り返しで既に開いている可能性があります。また、反復ごとに同じファイルに書き込みを行うため、予期しない結果が生じることになります。

を使用fs.writeFileSyncしてファイルを同期的に書き込むことができます。これにより、ノードはデータがファイルに書き込まれるまで待機してから続行するか、ファイルに保存するすべてのデータを変数に収集して、$("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..");}
});
于 2013-05-18T20:37:20.220 に答える