Я создаю газетное приложение, похожее на мобильное приложение Flipboard! используя nodejs nestjs framework.
Так что я ползаю по нескольким веб-сайтам, чтобы получить данные, и у меня получился массив, содержащий более 60 элементов только для первой страницы, собранной с каждого веб-сайта, и время отклика в диапазоне 10 с. 15-ым ведьмам недопустимо только для 3 сайтов !!!!
Я искал это и обнаружил, что nestjs предоставляет сервис кеширования, и это было здорово, кешируя результаты, заканчивающиеся на 20 мс, но!
Я не использую БД любого типа, так как я не собираю данные! только заголовки и URL-адреса для iframes
Мои проблемы:
- Как разбить эти 60 элементов на страницу и в конце сделать новый запрос дляСледующая страница от моих сканеров.
- Первый пользователь столкнется с тем временем ответа 15 с каждые 6 часов (мой конец кэша), как заставить сервер автоматически кэшировать данные, не ожидая запроса
Код сканера:(У меня 3 функции, подобные этой, почти одинаковые, меняются только селекторы CSS)
async getArticlesFromTechWD(page: number) {
const html = await get('https://www.tech-wd.com/wd/category/news/page/' + 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.com'
}
}).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;
}