无法在谷歌云功能中调试 Puppeteer 超时

Posted

技术标签:

【中文标题】无法在谷歌云功能中调试 Puppeteer 超时【英文标题】:Cannot debug Puppeteer timing out in google cloud function 【发布时间】:2020-12-11 06:45:21 【问题描述】:

我已经进行了很多调试,阅读了文章,但无法弄清楚为什么我会得到一个

at Promise.then (/workspace/node_modules/puppeteer/lib/cjs/puppeteer/common/LifecycleWatcher.js:106:111) name: 'TimeoutError'

对于下面的“goto”行,我尝试调整参数,并尝试在 package.json 中的 puppeteer 版本中从版本 5 回到 4 到 3。代码在本地运行良好,但在 Google Cloud Function 中一直超时。我通过为 google.com 编写一个简单的 fetch 函数来验证我的 VPC 连接器正在工作,所以这纯粹是 GCF 问题中的 Puppeteer。

仅供参考,这是在 PubSub 主题上触发的。

const puppeteer = require('puppeteer')

const PUPPETEER_OPTIONS = 
  headless: true,
  args: [
    '--disable-gpu',
    '--disable-dev-shm-usage',
    '--disable-setuid-sandbox',
    '--no-first-run',
    '--no-sandbox',
    '--no-zygote',
    '--single-process',
    "--proxy-server='direct://'",
    '--proxy-bypass-list=*',
  ],
;

const closeConnection = async (page, browser) => 
  page && (await page.close());
  browser && (await browser.close());
;

exports.runScraper = async (message, context) => 
    const url = Buffer.from(message.data, 'base64').toString()
    console.log( `triggered with $url`)
    
    const browser = await puppeteer.launch(PUPPETEER_OPTIONS);
    const page = await browser.newPage();

    try // open url and get price and title
    
        console.log( "awaiting goto")
        await page.goto(url,  waitUntil: 'networkidle2' )
        console.log( "awaiting evaluate")
        let item = await page.evaluate( async () => 
            let priceArray = document.querySelector('div.cAIbCF').innerText.split('.')
            return 
                title: document.querySelector('h1 > span').innerText,
                whole: priceArray[0],
                part: priceArray[1]
            
        ) 
     // try
    catch (error) 
        console.log( error );
        throw error;
     finally 
        console.log( "finally closeConnection" );
        await closeConnection(page, browser);
        return;
    

【问题讨论】:

您是否尝试过等待不同的事件?基于this,我们有loaddomcontentloadednetworkidle0。考虑到您稍后会使用一些特定的选择器,也许等待特定的选择器就足够了?此外,也许这是 GCP 的一些机器问题 - 您可以尝试使用节点的 https 而不是使用 puppeteer 执行一个简单的 GET 请求(在生产中使用的 URL 上,不一定是谷歌)? @MarekPiotrowski 我添加了选择器,希望它可以解决问题,前几次运行没有“waitUntil” @MarekPiotrowski 和我尝试过“load”和“dcomcontentloaded”,但没有尝试过“networkidle0” 【参考方案1】:

我遇到了类似的问题。 我变了

await page.goto(url,  waitUntil: 'networkidle2' )

await page.goto(url, 
    waitUntil: 'load',
    timeout: 0
);

它奏效了。请随意使用它并告诉它是否有效。

【讨论】:

以上是关于无法在谷歌云功能中调试 Puppeteer 超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌云功能中使用谷歌表格 API

在谷歌云中部署后,Angular 应用程序无法调用 Flask 服务器 API

使用云功能在谷歌云发布/订阅上发布需要 3 分钟 - nodejs

如何在谷歌云上正确托管 node.js 应用程序?

Bigquery 如何使用存储在谷歌云中的数据?

如何在谷歌云数据流中停止流式传输管道