NodeJS 人偶师在Heroku上只跑三次

uurity8g  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(161)

我在一个网站上工作,它使用 puppet 从另一个网站上抓取数据。当我在本地机器上运行npm服务器时,它可以很好地抓取数据,但是当我将其部署到Heroku时,它只运行我正在查找的前三个文件,然后停止。
我实际上是在从学校网站上抓取课程的数据,所以我在for循环中运行这一行,
let data = await crawler.scrapeData(classesTaken[i].code)
这将在下面运行此函数。我已经取代了实际的网站网址为我自己的隐私。

const browser = await puppeteer.launch({
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox'
      ]
    })
    const page = await browser.newPage()
    
    await page.goto("website url")
    await page.type('#crit-keyword', code)
    await page.click('#search-button')

    await page.waitForSelector(".result__headline")

    await page.click(".result__headline")

    await page.waitForSelector("div.text:nth-child(2)")

    let data = await page.evaluate(() => {
        let classTitle = document.querySelector("div.text:nth-child(2)").textContent
            .toLowerCase().split(' ')
            .map((s) => s.charAt(0).toUpperCase() + s.substring(1)).join(' ').replace('Ii', "II")
        let classDesc =  document.querySelector(".section--description > div:nth-child(2)").textContent.replace('Lec/lab/rec.', '').trim()

        return {
            title: classTitle,
            desc: classDesc
        }
    })

    console.log(`== Finished grabbing ${code}`)

    return data

这在我自己的本地服务器上运行得很好。但是,当我推到我的Heroku网站时,它只运行前三个类代码。我有一种感觉,这可能是由于我的dyno运行内存不足,但我不知道如何使它等待有可用的内存。
下面是部署日志

2023-05-22T17:29:18.421015+00:00 app[web.1]: == Finished grabbing CS 475
2023-05-22T17:29:19.098698+00:00 app[web.1]: == Finished grabbing CS 331
2023-05-22T17:29:19.783377+00:00 app[web.1]: == Finished grabbing CS 370

2023-05-22T17:29:49.992190+00:00 app[web.1]: /app/node_modules/puppeteer/lib/cjs/puppeteer/common/util.js:317

2023-05-22T17:29:49.992208+00:00 app[web.1]:     const timeoutError = new Errors_js_1.TimeoutError(`waiting for ${taskName} failed: timeout ${timeout}ms exceeded`);

2023-05-22T17:29:49.992209+00:00 app[web.1]:                          ^

2023-05-22T17:29:49.992209+00:00 app[web.1]: 

2023-05-22T17:29:49.992210+00:00 app[web.1]: TimeoutError: waiting for target failed: timeout 30000ms exceeded

2023-05-22T17:29:49.992211+00:00 app[web.1]:     at waitWithTimeout (/app/node_modules/puppeteer/lib/cjs/puppeteer/common/util.js:317:26)

2023-05-22T17:29:49.992230+00:00 app[web.1]:     at Browser.waitForTarget (/app/node_modules/puppeteer/lib/cjs/puppeteer/common/Browser.js:405:56)

2023-05-22T17:29:49.992230+00:00 app[web.1]:     at ChromeLauncher.launch (/app/node_modules/puppeteer/lib/cjs/puppeteer/node/ChromeLauncher.js:100:31)

2023-05-22T17:29:49.992230+00:00 app[web.1]:     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

2023-05-22T17:29:49.992231+00:00 app[web.1]:     at async Object.scrapeData (/app/crawler.js:9:21)

2023-05-22T17:29:49.992231+00:00 app[web.1]:     at async getClassData (file:///app/server.mjs:40:16)

2023-05-22T17:29:49.992234+00:00 app[web.1]:

我在某个地方读到尝试使用这些命令清除构建缓存

$ heroku plugins:install heroku-builds
$ heroku builds:cache:purge --app your-app-name

我已经试过了,它没有做任何事情。我还在 puppet 师GitHub上关注了Heroku的troubleshooting notes
我相信这可能与我的dyno记忆有关的原因是由于this related post。如果是这样的话,我想弄清楚如何等到有可用的内存可以使用。
编辑:我现在也在无头模式下运行浏览器,这会导致完全相同的错误。

bq9c1y66

bq9c1y661#

在进一步的日志记录中,我发现问题是我打开浏览器,然后从未关闭它,从而泄漏内存。通过在scrapeData()函数的return语句之前添加await browser.close()行,内存泄漏停止了,服务器能够正确解析所有类代码。

相关问题