Статус ошибки 503 при множестве запросовс помощью axios. Как исправить ошибку?

Глаз замылился и голова уже не особо работает, обращаюсь за помощью к вам. Практикуюсь с промисами, делаю парсер для парсинга товаров с амазона. суть такова:

С помощью функции recursiveLinkCrawling я делаю запрос с помощью axios.get на базовую (первую ссылку), далее обрабатываю полученный результат с помощью cheerio: получаю ссылки товаров со страницы и проверяю ДОСТУПНА ЛИ СЛЕДУЮЩАЯ СТРАНИЦА. Ссылки добавляю в массив, а значение следующей страницы проверяю: если доступна запускаю рекурсию и отправляю запрос на следующий url. C этим все понятно.

function recursiveLinkCrawling(pageNum = 1, arrResults = []) {
    return axios.get(basicUrl, {
        params: {k: 'laptop', page: pageNum},
        headers: {'X-Requested-With': 'XMLHttpRequest'}
    })
        .then(response => {
            return response.data;
        })
        .then(data => {
            console.log(pageNum); //delete in final
            let processedInfo = getLinksCheerio(data);

            if (processedInfo.links) arrResults = arrResults.concat(processedInfo.links);
            if (processedInfo.next) return recursiveLinkCrawling(pageNum+1, arrResults);

            return arrResults;
        })
        .catch(err => {
            console.error(err);
            return arrResults;
        });
}

Функция возвращает массив ссылок. Далее на эти ссылки нужно еще отправить запрос и получить данные уже из этих "ответов". Для этого есть следующий код:

function getProductData(link){
    return axios.get(link)
        .then(response => {
            return response.data;
        })
        .then(data => {
            //parsing data with cheerio
            return getProductDataCheerio(data);
        })
        .catch(err => {
            console.log(err);
        })
}

Отправляя запрос на 1 или 2 СТРАНИЦЫ ТОВАРОВ все работает превосходно. Но как только я пытаюсь обработать 10-20 страниц - Ошибка сервера 503.

Запускаю код данной функцией:

function crawler(){
    return recursiveLinkCrawling()
        .then(links => {
            let promises = links.map(link => getProductData(link));

            return Promise.all(promises);
        })
        .catch(err => console.log(err));
}

crawler().then(data => console.log(data));

Вопрос следующий: Данные проблемы из-за дерьмового кода или это некое состояние гонки из-за паралельного выполнения Promise.all(promises)? Или может сделать очередь выполнения? Очень прощу помочь. Большое все спасибо.

Спустя некоторое время, по советам, решил сделать некую очередь выполнения, но проблема все та же! Вот код класса очереди и исползование соответственно!

class TaskQueue {
    constructor(concurrency) {
        this.concurrency = concurrency;
        this.running = 0;
        this.queue = [];
    }
    //The pushTask () simply adds the new job to the queue and starts processing by calling the this.next () method.
    //The next () method starts several jobs from the queue, given the set limit.
    pushTask(task) {
        this.queue.push(task);
        this.next();
    }

    next() {
        while(this.running < this.concurrency && this.queue.length) {
            const task = this.queue.shift();
            task().then(() => {
                this.running--;
                this.next();
            });
            this.running++;
        }
    }
}

Использую так:

let queue = new TaskQueue(2);

async function crawler() {
    let links = await recursiveLinkCrawling();

    if (links.length === 0){
        return Promise.resolve();
    }

    return new Promise((res, rej) => {
        let completed = 0;

        links.forEach(link => {
           let task = () => {
                return getProductData(link)
                    .then(() => {
                        if (++completed === links.length) res();
                    })
                    .catch((err) => {
                         if (err) rej();
                    });
           };
           queue.pushTask(task);
        });
    });
}

crawler().then(data => console.log(data));

Допустил ли я ошибку в классе очереди?


Ответы (0 шт):