最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Nodejsnestjs:从我的多个爬网程序获得13s的响应时间

运维笔记admin16浏览0评论

Nodejs / nestjs:从我的多个爬网程序获得13s的响应时间

Nodejs / nestjs:从我的多个爬网程序获得13s的响应时间

我正在构建类似于Flipboard简报移动应用程序的报纸应用程序!使用nodejs nestjs框架。

因此,我爬入多个网站以获取数据,最后我得到一个数组,其中有60多个仅用于从每个网站收集的第一页,响应时间在10s到15s范围内,仅3个网站不可接受!!!!

我进行了搜索,发现nestjs提供了一项缓存服务,通过缓存以20ms结尾的结果,效果很好,但是!

我没有使用任何类型的数据库,因为我没有在抓取数据!只是iframe的标题和网址

我的问题是:

  1. 如何分页显示每页60个项目,最后我的搜寻器再次请求下一页。
  2. 第一个用户将每6小时面对15秒钟的响应时间(我的缓存结束),因此如何使服务器自动缓存数据而不等待请求

Crawler代码:(我有3个类似这样的功能,只是CSS选择器正在改变)

async getArticlesFromTechWD(page: number) {
    const html = await get('/' + page);

    // Cheerio
    let $ = load(html);

    function formatingDate(date) {
        let months = ["يناير", "فبراير", "مارس", "إبريل", "مايو", "يونيو",
            "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"
        ];

        date = date.replace('،', '').split(' ');
        const year = date[2];
        const month = (months.indexOf(date[1]) + 1).toString().length == 1 ? '0' + (months.indexOf(date[1]) + 1) : (months.indexOf(date[1]) + 1)
        const day = date[0];

        return `${year}-${month}-${day}`;
    }

    const articles = $('#masonry-grid .post-element').map(function () {
        return {
            title: $('.thumb-title', this).text().trim(),
            date: formatingDate($('.date', this).text().trim()),
            url: $('.thumb-title a', this).attr('href'),
            image: $('.slide', this).css('background-image').replace('url(', '').replace(')', '').replace(/\"/gi, ""),
            src: 'www.tech-wd'
        }
    }).get();

    return articles;
}

将所有搜寻器数据合并到一个数组中:

async getAllArticles(page: number, size: number) {

    const skip = size * (page - 1);

    // First crawler ( has an optional page pram default is page 1 )
    const unlimitTech = await this.getArticlesFromUnlimitTech();

    // Second crawler ( has an optional page pram default is page 1 )
    const tectWd = await this.getArticlesFromTechWD();

    // Merge them and sorted by date ( DESC )
    const all = unlimitTech.concat(tectWd).sort(() => Math.random() - 0.5);

    return all;

}

回答如下:

诀窍是一次执行多项操作。启动所有请求,然后在每个请求上都按await。至少您的计时听起来像是在等待下一个请求之前等待每个请求完成。

发布评论

评论列表(0)

  1. 暂无评论