【问题标题】:Puppeteer how to retry url fetch with delay if it failed如果失败,Puppeteer 如何延迟重试 url 获取
【发布时间】:2019-12-23 22:56:01
【问题描述】:

我尝试使用 puppeteer library 编写简单的 web-scraper

当我通过page.goto通过url获取页面时,如果失败,我需要重试,即响应代码> = 400。

我的sn-p:

'use strict';
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    await page.setViewport({width: 1024, height: 768});
    await page.setDefaultNavigationTimeout(0);

    await page.goto('https://google.com');

    await browser.close();
    process.exit();
})();

如果response.code >= 400,我需要实施失败策略来重试 url。
我需要在尝试之间延迟等于retryNumber * 1000ms:

  • 第一次尝试 1000 毫秒;
  • 第二次尝试 2000 毫秒;
  • 第三次尝试 3000 毫秒,依此类推。

如果retryNumber 超过maxRetryNumber,则应拒绝承诺。

谁知道如何通过代码实现这一点?有没有现成的使用packets或者sn-ps来达到目的?

【问题讨论】:

标签: javascript node.js web-scraping es6-promise puppeteer


【解决方案1】:

然后您可以使用一个简单的 for 循环来执行您的重试(当您的请求成功时退出 for 循环):

'use strict';
const puppeteer = require('puppeteer');
const delay = (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms));
};

(async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    await page.setViewport({width: 1024, height: 768});
    await page.setDefaultNavigationTimeout(0);

    const maxRetryNumber = 10;
    let success = false;
    for (let retryNumber = 1; retryNumber <= maxRetryNumber; retryNumber++) {
        const response = await page.goto('https://google.com');
        if (response.status() < 400) {
            success = true;
            break;
        }
        await delay(1000 * retryNumber);
    }

    if (!success) {
        // do something
    }

    await browser.close();
    process.exit();
})();

Source of delay function.

【讨论】:

  • 感谢伪代码,它帮助我构建了真正的代码。
【解决方案2】:
var maxRetryNumber = 10 ;
var retryNumber  = 0 ;

scrape();

async function scrape(){

    retryNumber++;
    if(retryNumber >= maxRetryNumber )
    {
        console.log(' retryNumber exceeded maxRetryNumber ! ');
        return ;
    }

    try {
        const browser = await puppeteer.launch({headless: false});
        const page = await browser.newPage();
        await page.setViewport({width: 1024, height: 768});
        await page.setDefaultNavigationTimeout(0);
        await page.waitFor(retryNumber*1000);
        let response = await page.goto('https://google.com');
        await browser.close();

        if(response.status()   >= 400)
            scrape();
        else
        {
            console.log('ALL OK');
        }
    }
    catch(e){

        scrape();

    }
}

【讨论】:

  • 在这种情况下,递归解决方案似乎不是最好的方法
猜你喜欢
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多