Maison  >  Questions et réponses  >  le corps du texte

Heroku limite Puppeteer à ne courir que trois fois

Je développe un site Web qui utilise le marionnettiste pour récupérer les données d'un autre site Web. Lorsque j'exécute le serveur npm sur ma machine locale, il récupère très bien les données, mais lorsque je le déploie sur Heroku, il n'exécute que les trois premiers fichiers que je recherche, puis s'arrête.

Je souhaite essentiellement récupérer des données sur les cours du site Web de mon école, j'exécute donc cette ligne dans une boucle for,

let data =等待crawler.scrapeData(classesTaken[i].code)

Cela exécutera la fonction ci-dessous. J'ai remplacé l'URL réelle du site Web pour ma propre confidentialité.

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

Cela fonctionne bien sur mon propre serveur local. Cependant, lorsque j'accède à mon site Heroku, il n'exécute que les trois premières classes de code. J'ai le sentiment que cela peut être dû au fait que mon banc manque de mémoire, mais je ne sais pas comment le faire attendre la mémoire disponible.

Voici le journal de déploiement

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]:

J'ai lu quelque part pour essayer de vider le cache de build à l'aide de ces commandes

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

Je l'ai déjà essayé mais rien ne fonctionne. J'ai également suivi les instructions de dépannage pour Heroku sur le marionnettiste GitHub.

La raison pour laquelle je pense que cela peut être lié à ma mémoire dynamique est à cause de cet article connexe. Si tel est le cas, j'aimerais savoir comment attendre qu'il y ait de la mémoire libre à utiliser.

EDIT : j'utilise également maintenant le navigateur en mode sans tête, ce qui entraîne exactement la même erreur.

P粉986860950P粉986860950180 Il y a quelques jours429

répondre à tous(1)je répondrai

  • P粉129168206

    P粉1291682062024-04-03 11:15:37

    Après m'être connecté davantage, j'ai découvert que le problème était que j'avais ouvert le navigateur et ne l'avais jamais fermé, provoquant une fuite de mémoire. En scrapeData() 函数的 return 语句之前添加行 await browser.close(), la fuite de mémoire s'arrête et le serveur est capable d'analyser correctement tout le code de classe.

    répondre
    0
  • Annulerrépondre