/ / node.js Warum erhalte ich RangeError: Maximale Größe des Aufrufstacks überschritten - node.js, Webcrawler, nicht genügend Arbeitsspeicher, HTML-zu-Text

node.js warum bekomme ich RangeError: Maximale Aufruf-Stack-Größe überschritten - node.js, Web-Crawler, nicht genügend Arbeitsspeicher, HTML-to-Text

Das folgende Programm dient dazu, CNN zu crawlen und seinen gesamten Text in eine einzige Datei zu schreiben (unter Verwendung mehrerer Dritter)

Ich bekomme

RangeError: Maximum call stack size exceeded

Wie kann ich dies beheben und wie kann ich das umgehen? Gibt es eine Möglichkeit, wie ich Speicher "freigeben" kann? und wie?

//----------Configuration--------------

var startingUrl = "http://cnn.com"; //keep the httphttps or www prefix
var crawlingDepth = "50";
var outputFileName = "cnn.txt";

//-------------------------------------

var Crawler = require("js-crawler");
var sanitizeHtml = require("sanitize-html");
var htmlToText = require("html-to-text");
var fs = require("fs");

var index = 0;

new Crawler().configure({depth: crawlingDepth})
.crawl(startingUrl, function onSuccess(page) {

var text = htmlToText.fromString(page.body, {
wordwrap: false,
hideLinkHrefIfSameAsText: true,
ignoreHref: true,
ignoreImage: true
});

index++;
console.log(index + " pages were crawled");
fs.appendFile(outputFileName, text, function (err) {
if (err) {
console.log(err);
};
console.log("It"s saved! in same location.");
});
});

Antworten:

0 für die Antwort № 1

1) Dies ist ein Problem mit der Rekursionstiefe.

2) Es ist notwendig, es zu vermeiden:

  • Bei jeder Tiefenebene werden die Verknüpfungen in den Schleifenstromniveaus durchlaufen (auf der ersten Ebene ist eine primäre Referenz);

  • Zugriff über "Crawler.prototype._getAllUrls" -Links der aktuellen Seite. Wenn diese Links noch nicht verarbeitet wurden, werden diese durchlaufen.

3) Nur Konzept:

var Urls = [ ["http://cnn.com/"] ]; // What we crawling
var crawledUrls = {}; // Check if already crawled
var crawlingDepth = 3;
var depth = 0; // Current depth
var index = 0; // Current index
var Crawler = require("js-crawler");

function crawling() {
console.log(depth, index, Urls[depth][index]);

// Prepare next level
if (typeof Urls[depth+1] === "undefined") Urls.push([]);

// Already crawled flag
crawledUrls[ Urls[depth][index] ] = true;

new Crawler().configure({depth: 1}).crawl({
url: Urls[depth][index],
success: function(page) {
// Do some with crawled page

// Collect urls at crawled page
var urls = Crawler.prototype._getAllUrls( page.url, page.body );
for(var j=0; j<urls.length; j++) {
// Check same domain and now crawled yet
if ( typeof crawledUrls[urls[j]] === "undefined"
&& urls[j].indexOf(Urls[0][0])===0 ) {
Urls[depth+1].push(urls[j]);
}
}
},
failure: function(page) {
},
finished: function(crawled) {
index++;
if (index<Urls[depth].length) {
setTimeout(crawling,0);
} else {
depth++;
index = 0;
if (depth<crawlingDepth) {
setTimeout(crawling,0);
} else {
// Finished
}
}
}
});
}

crawling();