迭代node.js请求函数
iterate node.js request function
这个问题是关于node.js中的爬网程序的。在start_url
中,他抓取URL,并将它们"推送"到json-文件(output.json
)。目前,他只使用start_url
运行请求函数,并将收集到的URL保存在output.json
中。我希望他使用保存的URL,将start_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]);
}
所以您可以做的是递归调用函数。下面的例子应该有效:
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]);
这样做的问题是,每次都要完全重写文件。如果这种情况持续一段时间,你的内存就会耗尽。另一个选项是创建一个写流
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var start_url = ["http://stackoverflow.com/"]
var wstream = fs.createWriteStream("output.json");
var req = function(url){
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
wstream.write('"'+ exurls + '",');
});
start_url.shift();
if(start_url.length > 0) {
return req(start_url[0]);
}
wstream.end();
});
}
req(start_url[0]);
编辑:切换到一个基本队列,以解决的内存问题
相关文章:
- 暂停函数执行流程,直到ajax请求完成
- google在类内映射javascript directionsService.route请求:将类实例传递给回调函数
- 如何发送作为节点请求响应函数中的代码块的响应
- 为什么不't CasperJS'sendAJAX函数为PUT请求发送任何内容
- 如何在类函数中发送ajax请求
- JavaScriptajax请求servlet调用错误回调函数
- 如何仅在完成对gap.client.youtube的请求.execute后执行函数
- 使用 PHP 生成的按钮生成 POST 请求,这些按钮调用带有参数的 javascript 函数
- 节点 js 将变量传递到请求回调函数中
- 在导出函数 MEANJS 中编写 Http 请求
- 将对象函数传递给请求动画帧时丢失对象引用
- 将请求作为参数传递给函数
- 带有Ajax请求的Javascript JSON.parse函数n〃;新行转义字符
- 迭代node.js请求函数
- AJAX请求导致更改函数解除绑定
- AngularJS http.jsonp请求.then和.success函数不起作用
- 使用jQuery.ajax请求向PHP函数发送一个对象数组
- AJAX请求返回Javascript获胜't返回特定函数,但将返回其他函数
- var someSome=(函数(){..}());一个奇怪的javascript请求
- Alexa API通过lambda函数请求