Nodejs / nestjs:从我的多个爬网程序获得13s的响应时间
我正在构建类似于Flipboard简报移动应用程序的报纸应用程序!使用nodejs nestjs框架。
因此,我爬入多个网站以获取数据,最后我得到一个数组,其中有60多个仅用于从每个网站收集的第一页,响应时间在10s到15s范围内,仅3个网站不可接受!!!!
我进行了搜索,发现nestjs提供了一项缓存服务,通过缓存以20ms结尾的结果,效果很好,但是!
我没有使用任何类型的数据库,因为我没有在抓取数据!只是iframe的标题和网址
我的问题是:
- 如何分页显示每页60个项目,最后我的搜寻器再次请求下一页。
- 第一个用户将每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
。至少您的计时听起来像是在等待下一个请求之前等待每个请求完成。