NodeJS - 调用函数和结构

时间:2017-06-29 05:00:34

标签: javascript node.js web-scraping discord

我对Javascript和NodeJs很陌生,我只是想知道如何构建它以便它会在以下结构中生成一条消息:title和caption。所以我要做的是初始化变量,然后编写一个函数来废弃网站上的数据(scrapData),然后运行该函数然后将信息放入数组中({{1} }),然后循环将生成带有titles, captions, images_long的消息。我只是对结构和调用函数感到困惑。以下是命令的代码:

title and caption

2 个答案:

答案 0 :(得分:2)

您对scrapData的调用必须等待请求(即异步)才能处理数据。您必须将所有代码放入原始请求的回调中,或考虑使用promises(Promises将支持NodeJS 7 +中的漂亮异步/等待)

将您的需求(“请求”)更改为require(“request-promise-native”),并执行以下操作:

function scrapData(website_url) {
    return request(website_url)
        .then(body => {
            let items = [],
                $ = cheerio.load(body);

            $('.post-box').each((index, element) => {
                let title = $(element).find('.title h2 span').first().text(),
                    caption = $(element).find('.post-box-excerpt p').first().text(),
                    thumbnail = $(element).find('.thumbnail img').first().attr('src');

                items.push({ title, caption, thumbnail })
            })
            return items;
        })
}

scrapData(website_url)
    .then(items => {
        //produce embed messages
        for (let i = 0; i < items.length; i++)
        {

            const embed = new Discord.RichEmbed()
                .setColor('#8E44AD')
                .addField(((i + 1) + ". " + items[i].title), items[i].caption, true);
            //set images here

            message.channel.send({ embed });
        }
    })

我不喜欢你删除标题,标题和缩略图的方式,因为索引可能没有被删除。假设您缺少第二个索引的一个标题,那么您将拥有['title 1','title 2','title 3']的标题和标题:['caption 1','caption 3']。确保你刮掉父块的标题和标题。不确定你是如何使用cheerio但我试图在这个例子中尽力而为。

注意,重要的是,$('').each(function() { $(this) })$('').each(() => { $(this) })不同,因为它位于不同的范围内。 Google范围和箭头功能。您可以将我的箭头函数更改为普通函数,或者使用$('').each( (index, element) => { $(element) })

之类的参数来解决此问题

答案 1 :(得分:0)

我建议您使用Crawler Package Nodejs

对我来说非常好。

使用Async处理异步JavaScript