Heroku beschränkt den Puppenspieler darauf, nur dreimal zu rennen
P粉986860950
P粉986860950 2024-04-02 19:49:08
0
1
502

Ich entwickle eine Website, die Puppenspieler verwendet, um Daten von einer anderen Website zu extrahieren. Wenn ich den npm-Server auf meinem lokalen Computer betreibe, löscht er die Daten einwandfrei, aber wenn ich ihn auf Heroku bereitstelle, führt er nur die ersten drei Dateien aus, nach denen ich suche, und stoppt dann.

Ich möchte im Wesentlichen Daten über Kurse von meiner Schulwebsite extrahieren, also führe ich diese Zeile in einer for-Schleife aus,

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

Dadurch wird die folgende Funktion ausgeführt. Aus Datenschutzgründen habe ich die tatsächliche Website-URL ersetzt.

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

Das funktioniert gut auf meinem eigenen lokalen Server. Wenn ich jedoch auf meine Heroku-Site pushe, werden nur die ersten drei Codeklassen ausgeführt. Ich habe das Gefühl, dass das daran liegen könnte, dass mein Prüfstand nicht mehr genügend Speicher hat, aber ich weiß nicht, wie ich ihn auf verfügbaren Speicher warten lassen kann.

Dies ist das Bereitstellungsprotokoll

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

Ich habe irgendwo gelesen, dass man versuchen soll, den Build-Cache mit diesen Befehlen zu leeren

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

Ich habe es bereits versucht, aber nichts funktioniert. Ich habe auch die Anweisungen zur Fehlerbehebung für Heroku auf dem GitHub des Puppenspielers befolgt.

Der Grund, warum ich glaube, dass dies mit meinem dynamischen Gedächtnis zusammenhängt, ist dieser verwandte Artikel. Wenn dies der Fall ist, würde ich gerne herausfinden, wie ich warten kann, bis freier Speicher zur Verfügung steht.

EDIT: Ich verwende den Browser jetzt auch im Headless-Modus, was zu genau demselben Fehler führt.

P粉986860950
P粉986860950

Antworte allen(1)
P粉129168206

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

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!