Как остановить сбой скрипта NodeJS при превышении времени ожидания - PullRequest
1 голос
/ 21 апреля 2019

Ниже вы можете найти ошибку, которая возникает.

Я пытаюсь очистить содержимое сайта, используя NodeJS и кукловод. Иногда код останавливается с ошибкой Timeout Exceeded. Есть ли способ, чтобы при превышении времени ожидания загрузки страницы я мог запустить функцию, которая либо перезагрузит страницу, либо заставит скрипт подождать несколько секунд, а затем перезагрузит страницу, пока она не получит данные правильно, без сбоев? Если так, как бы я продвинулся в реализации этого?

Спасибо.

(node:8300) UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded
    at Promise.then (C:\Users\danie\node_modules\puppeteer\lib\LifecycleWatcher.js:143:21)
  -- ASYNC --
    at Frame.<anonymous> (C:\Users\danie\node_modules\puppeteer\lib\helper.js:108:27)
    at Page.goto (C:\Users\danie\node_modules\puppeteer\lib\Page.js:656:49)
    at Page.<anonymous> (C:\Users\danie\node_modules\puppeteer\lib\helper.js:109:23)
    at scrape (C:\Users\danie\Documents\Node Projects\p-download.js:23:14)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:8300) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:8300) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Мой код:

const puppeteer = require('puppeteer');

let scrape = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();

    await page.setRequestInterception(true);    
    page.on('request', (req) => {
        if(req.resourceType() == 'stylesheet' || req.resourceType() == 'script' || req.resourceType() == 'font' || req.resourceType() == 'media' || req.resourceType() == 'image'){
            req.abort();
        }
        else {
            req.continue();
        }
    }); //Disables loading CSS, images and scripts

    for(i=0; i<5000; i++){
        await page.goto('https://website.com/' + i);
        let result = await page.evaluate(() => {
            var result = '';
            for (i=1; i<=10; i++){
                result += document.getElementsByTagName('td')[i].innerText;
                result += ',';
            }
            result += '\n';
            return result;
        });
    }
}
scrape();

1 Ответ

2 голосов
/ 21 апреля 2019

поместите ваш код в блок try / catch, чтобы избежать сбоя ... я бы переместил код цикла в другую функцию

for(i=0; i<5000; i++){
    result = await open_page(page , i );
}


async function open_page(page , i ){
    try {
            await page.goto('https://website.com/' + i);
            let result = await page.evaluate(() => {
                var result = '';
                for (i=1; i<=10; i++){
                    result += document.getElementsByTagName('td')[i].innerText;
                    result += ',';
                }
                result += '\n';
                return result;
            });


            return {stat:1 , result : result } ;

    }
    catch(e){
        return {stat:0 , error : e } ;
    }

}
...