【问题标题】:Best way to run a Puppeteer function in hourly intervals每小时运行 Puppeteer 函数的最佳方式
【发布时间】:2020-06-24 09:22:53
【问题描述】:

我有一个简单的 Puppeteer 脚本,我想每隔一小时运行一次。我采取了两种方法 1) 使用 setIntervals 2) 使用睡眠功能。我知道可能还有其他方法,例如 cron 作业,并且想问一下解决这个问题的最佳方法是什么。

  1. 使用设置间隔
const runPuppeteer = () => {
    puppeteer.launch({
        headless: isHeadless,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    }).then(async browser => { 
       //Do something... 

       await browser.close()  // close browser after
})}

setInterval(runPuppeteer, 60 * 1000 * 60);

  1. 使用睡眠
const runPuppeteer = () => {
    puppeteer.launch({
        headless: isHeadless,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    }).then(async browser => { 

       while(true){
          //Do something...           
          sleep.sleep(60 * 60)
       }
})}

由于某种原因,当我采用 2) sleep 方法并查看 htop 时,有多个线程和任务(我认为这主要是由于我的代码..)

【问题讨论】:

  • 宁可去setTimeout(yourFunction, hour);
  • 对不起,setTimeout 不是只执行一次而不是间隔吗?
  • 您还可以使用 AWS lambda + Cloudwatch 事件等服务来运行您的任务
  • 可以使用递归setTimeoutstackoverflow.com/questions/7188145/…

标签: javascript puppeteer


【解决方案1】:

也许这将帮助您设计更复杂的 cron 作业

const cron = require('node-cron')
const execute = require('child_process').exec
const puppeteer = require('puppeteer')
const processIDs = []

const createBrowser = async () => {
    const browser = await puppeteer.launch()
    processIDs.push(browser.process().pid)
    return browser
}

const closeBrowser = async (browser) => {
    await browser.close()
    for (let i = 0; i < processIDs.length; i++) {
        execute(`echo ${process.env.PASSWD} | sudo -S kill -9 ${processIDs[i]}`)
    }
}

const runHourly = async () => {
    const browser = await createBrowser()
    const [page] = await browser.pages()
    const response = await page.goto(url)
    const screenshot = await page.screenshot({
        path: 'screenshot_' + Date.now() + '.png'
    })
    const closeTab = await page.close()
    const exit = await closeBrowser(browser)
}

cron.schedule('0 * * * *', () => {
    console.log('running every minute 0 / hourly')
    await runHourly()
})

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多