迭代node.js请求函数

这个问题是关于node.js中的一个爬虫。 给他一个start_url ,他抓取的URL,并“推”到一个。 json文件( output.json )。 目前,他仅使用start_url运行请求函数,并将收集的URL保存在output.json 。 我希望他通过用第一个收集的URLreplacestart_url并重新收集链接来使用保存的URL …等等…

 var fs = require('fs'); var request = require('request'); var cheerio = require('cheerio'); var start_url = ["http://stackoverflow.com/"] var req = function(url){ request(url, function(error, response, html){ var $ = cheerio.load(html); var data = []; $("a").each(function() { var link = $(this); var exurls = {exurl: new Array(link.attr("href"))} data.push(exurls); // Queue "exurls" for "start_url" and call the same function with the new URL (endless loop) // save to "output.json" from time to time, so you can stop it anytime }); fs.writeFile("output.json", JSON.stringify(data, null, 4), function(err){ if(err){ console.log(err); } else { console.log("File successfully written!"); } }); }); } for (var i = 0; i < start_url.length; i++){ req(start_url[i]); } 

所以你可以做的是recursion地进行函数调用。 下面的例子应该工作:

 var fs = require('fs'); var request = require('request'); var cheerio = require('cheerio'); var start_url = ["http://stackoverflow.com/"] var req = function(url){ var count = 0; request(url, function(error, response, html){ var $ = cheerio.load(html); $("a").each(function() { var link = $(this); var exurls = {exurl: new Array(link.attr("href"))} start_url.push(exurls); // Queue "exurls" for "start_url" and call the same function with the new URL (endless loop) // save to "output.json" from time to time, so you can stop it anytime }); try { fs.writeFileSync("output.json"); console.log("File successfully written!"); }catch(err){ console.log(err); } ++count; if(start_url.length > count) { req(start_url[count]); } }); } return req(start_url[0]);