亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Nodejs/nestjs:從我的多個爬蟲獲得 13 秒的響應時間

Nodejs/nestjs:從我的多個爬蟲獲得 13 秒的響應時間

哈士奇WWW 2021-11-04 16:02:47
我正在構建一個類似于 Flipboard 簡報移動應用程序的報紙應用程序!使用 nodejs nestjs 框架。因此,我正在爬入多個網站以獲取數據,最終我得到了一個數組,其中包含 60 多個項目,僅用于從每個網站收集的第一頁,響應時間在 10 到 15 秒之間,這對于僅 3 個網站來說是不可接受的??! !!我搜索了這個,我發現 nestjs 提供了一個緩存服務,緩存結果以 20 毫秒結束,這很棒,但是!我沒有使用任何類型的數據庫,因為我沒有抓取數據!只是 iframe 的標題和 URL我的問題是:如何對每頁 60 個項目進行分頁,并最終從我的爬蟲中發出對下一頁的新請求。第一個用戶將面臨每 6 小時 15 秒的響應時間(我的緩存結束)那么如何讓服務器自動緩存數據而不是等待請求爬蟲代碼:(我有 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;}
查看完整描述

2 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

而不是一次一個:


const unlimitTech = await this.getArticlesFromUnlimitTech();

const tectWd = await this.getArticlesFromTechWD();

您可以同時執行以下兩項操作:


const [unlimitTech, tectWd] = await Promise.all([

  this.getArticlesFromUnlimitTech(),

  this.getArticlesFromTechWD()

])


查看完整回答
反對 回復 2021-11-04
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

訣竅是一次做多件事。開始您的所有請求,然后await在每個請求結束。至少你的時間聽起來像是在開始下一個請求之前等待每個請求完成。


查看完整回答
反對 回復 2021-11-04
  • 2 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號