首页 > 解决方案 > 在云功能上使用 puppeeter 进行长期工作

问题描述

我正在谷歌云平台上开发一些云功能。我需要抓取一个网页,然后我决定将 nodeJS 云功能与 Puppeteer 一起使用。

我的刮刀完成一项需要 1 到 3 分钟才能完成的工作。

我的想法是通过 API 调用触发函数,返回成功消息,然后抓取页面并将数据保存在数据库中。

以下是我的代码。

const puppeteer = require('puppeteer');


async function browserPromise() {
    return await puppeteer.launch({
        args: [
            "--ignore-certificate-errors",
            "--no-sandbox",
        ],
        headless: true
    })
}

exports.Runner = async (req, res) => {

    const browser = await browserPromise();
    const page = await browser.newPage();
    await page.setViewport({width: 1200, height: 720});

    scraper(browser, page, req.body)

    res.json('OK')
}


async function scraper(browser, page, formdata) { 
...do stuff...
}

问题是当我运行上面的代码时,我收到响应“OK”但刮板内的代码总是失败并出现以下错误

Error: Process exited with code 16
    at process.<anonymous>

相反,如果我等待如下响应,它会起作用。

const data = await scraper(browser, page, req.body)

问题是,如果我使用上述方法,调用我的函数的客户端必须等待 1 分钟,然后才能看到超时消息。我想让客户看到一条成功的消息,然后在后台进行所有的抓取。

做我需要做的最好的方法是什么?

谢谢你。

标签: node.jsgoogle-cloud-functionspuppeteer

解决方案


是的,初始化浏览器、创建页面和做其他你想做的事情都需要时间。

您需要检查哪些步骤花费的时间太长。

console.time('method1');
console.timeEnd('method1');

我正在使用这些参数:

var args = [
            '--proxy-server='+proxy,
            '--no-sandbox',
            '--disable-gpu',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--no-first-run',
            '--no-zygote',
            '--single-process'
        ];

你必须使用

scraper(browser, page, req.body)

代替

await scraper(browser, page, req.body)

在响应发送之前


推荐阅读