哈士奇WWW
2021-11-04 16:02:47
我正在構(gòu)建一個(gè)類似于 Flipboard 簡(jiǎn)報(bào)移動(dòng)應(yīng)用程序的報(bào)紙應(yīng)用程序!使用 nodejs nestjs 框架。因此,我正在爬入多個(gè)網(wǎng)站以獲取數(shù)據(jù),最終我得到了一個(gè)數(shù)組,其中包含 60 多個(gè)項(xiàng)目,僅用于從每個(gè)網(wǎng)站收集的第一頁(yè),響應(yīng)時(shí)間在 10 到 15 秒之間,這對(duì)于僅 3 個(gè)網(wǎng)站來說是不可接受的?。?!!我搜索了這個(gè),我發(fā)現(xiàn) nestjs 提供了一個(gè)緩存服務(wù),緩存結(jié)果以 20 毫秒結(jié)束,這很棒,但是!我沒有使用任何類型的數(shù)據(jù)庫(kù),因?yàn)槲覜]有抓取數(shù)據(jù)!只是 iframe 的標(biāo)題和 URL我的問題是:如何對(duì)每頁(yè) 60 個(gè)項(xiàng)目進(jìn)行分頁(yè),并最終從我的爬蟲中發(fā)出對(duì)下一頁(yè)的新請(qǐng)求。第一個(gè)用戶將面臨每 6 小時(shí) 15 秒的響應(yīng)時(shí)間(我的緩存結(jié)束)那么如何讓服務(wù)器自動(dòng)緩存數(shù)據(jù)而不是等待請(qǐng)求爬蟲代碼:(我有 3 個(gè)類似的函數(shù),只是 CSS 選擇器發(fā)生了變化)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;}將所有爬蟲數(shù)據(jù)合并到一個(gè)數(shù)組中: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;}
2 回答

交互式愛情
TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
而不是一次一個(gè):
const unlimitTech = await this.getArticlesFromUnlimitTech();
const tectWd = await this.getArticlesFromTechWD();
您可以同時(shí)執(zhí)行以下兩項(xiàng)操作:
const [unlimitTech, tectWd] = await Promise.all([
this.getArticlesFromUnlimitTech(),
this.getArticlesFromTechWD()
])

一只甜甜圈
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
訣竅是一次做多件事。開始您的所有請(qǐng)求,然后await
在每個(gè)請(qǐng)求結(jié)束。至少你的時(shí)間聽起來像是在開始下一個(gè)請(qǐng)求之前等待每個(gè)請(qǐng)求完成。
添加回答
舉報(bào)
0/150
提交
取消