Ich frage mich, wie würde ich gehen, um diese Funktion (scrapData
) nur einmal ausführen, so dass es nicht jedes Element erhöht und gleichzeitig lädt. Hier ist ein Bild von dem, was in meinem CMD passiert. Ich bin mit JS nicht sehr vertraut, also bin ich mir nicht wirklich sicher, was ich falsch mache. NodeJS - laufende Funktion zum Laden von Variablen
Und hier ist ein Code-Snippet für diesen einen Befehl:
//latest articles command
if (message.content.startsWith(prefix + 'latest')) {
//website url variables
const website_domain = "https://hypebeast.com/";
let website_path = args[0];
let website_url = website_domain + website_path;
//extra arguments variable
let extra_arg = args.slice(1).join(" ");
//if user inputs too many arguments
if (extra_arg.length > 0) {
message.reply('too many arguments! Please refer to `h.help` for correct usage.');
} else {
//opening url and loading in websites html
function scrapData(website_url) {
return rp(website_url)
.then(body => {
var items = [],
$ = cheerio.load(body);
//web scrapping here
$('.post-box').each(function() {
var title = $(this).find($('.title h2 span')).first().text(),
caption = $(this).find($('.post-box-excerpt p')).first().text(),
article_url = $(this).find($('.col-hb-post-image a')).first().attr('href'),
thumbnail_long = $(this).find($('.thumbnail img')).first().attr('src');
//adding title, caption, etc to list
items.push({title, caption, article_url, thumbnail_long});
//check items in console
console.log(items);
})
return items;
})
}
//run webscrapping function
scrapData(website_url)
.then(items => {
//produce embed messages
for (i = 0; i < items.length; i++) {
message.channel.send({
embed: {
color: config.embed_colour,
title: (i + 1 + ". " + items[i].title),
url: items[i].article_url,
description: items[i].caption,
}
})
}
message.channel.send("`SOURCE: " + website_url + "`");
console.log('DONE!');
})
}
}
Es geht wahrscheinlich etwas besser als Sie denken. Jedes Mal, wenn Sie ein Element zum Array "Elemente" hinzufügen, drucken Sie dieses Array (console.log (Elemente)). Versuchen Sie, das Array einmal auszudrucken (zum Beispiel kurz vor dem '// product embed messages' Kommentar) –
Fordert es die Website jedes Mal auf, wenn ein Element hinzugefügt wird? oder wenn es loops? @ate_f – hsel
Nur wenn es loops. Sie tun '$ ('. Post-box'). Jeder (function() {' der erste Teil ('$ ('. Postbox')') ruft ein Array von Elementen ab und dann '.each' Loops darüber. Sie machen 'console.log (items)' für jede Iteration. –