Зачистка одной и той же страницы навсегда с помощью кукловода - PullRequest
0 голосов
/ 25 февраля 2019

Изготовление слома.Как я могу оставаться на странице и читать содержимое для поиска данных каждые XX секунд без обновления страницы?Я использую этот способ, но компьютер через некоторое время вылетает.Любые идеи о том, как сделать это эффективно?Я хотел бы добиться этого без использования while (true).Функция readOdds не всегда задерживает одно и то же время.

//...
while(true){
   const html = await page.content();
   cant = await readOdds(html); // some code with the html
   console.info('Waiting 5 seconds to read again...');
   await page.waitFor(5000);
}

это раздел

async function readOdds(htmlPage){
    try {
        var savedat = functions.mysqlDateTime(new Date());
        var pageHtml=htmlPage.replace(/(\r\n|\n|\r)/gm,"");
        var exp_text_all = /<coupon-section(.*?)<\/coupon-section>/g;
        var leagueLinksMatches = pageHtml.match(exp_text_all);
        var cmarkets = 0;

        let reset = await mysqlfunctions.promise_updateMarketsCount(cmarkets, table_markets_count, site);
        console.log(reset);

        if(leagueLinksMatches == null){
            return cmarkets;
        }
        for (let i = 0; i < leagueLinksMatches.length; i++) {
            const html = leagueLinksMatches[i];
            var expc = /class="title ellipsis-text">(.*?)<\/span/g;
            var nameChampionship = functions.getDataInHtmlCode(String(html).match(expc)[0]);

            var idChampionship = await mysqlfunctions.promise_db_insert_Championship(nameChampionship, gsport, table_championship);


            var exp_text = /<ui-event-line(.*?)<\/ui-event-line>/g;
            var text = html.match(exp_text);
            // console.info(text.length);

            for (let index = 0; index < text.length; index++) {
                const element = text[index];               
.... 

1 Ответ

0 голосов
/ 25 февраля 2019

Простое решение с рекурсивным обратным вызовом

Однако, прежде чем мы углубимся в это, вы можете попытаться запустить саму функцию вместо while, которая будет работать постоянно без какого-либо должного контроля.

const readLoop = async() => {
  const html = await page.content();
  cant = await readOdds(html);
  return readLoop() // run the loop again
}

// invoke it for infinite callbacks without any delays at all
await readLoop();

Который будет выполнять одну и ту же блочную функцию непрерывно, без задержки, пока ваша функция readOdds не вернется.Вам не нужно будет использовать page.waitFor и while.

Предотвращение утечек памяти

Для сложных случаев, когда вы возрождаетесь в течение определенного периода времени, Очередь, как bull и менеджер процессов, такой как PM2 , вступает в игру.Тем не менее, очередь аннулирует вашу without refresh the page? часть вашего вопроса.

Вы определенно должны использовать pm2.

Использование выглядит следующим образом:

npm i -g pm2
pm2 start index.js --name=myawesomeapp // or your app file

Есть несколько полезных аргументов,

  • --max-memory-restart 100M, он может ограничить использование памяти до 100M и перезапустить себя.
  • --max-restarts 50, он перестанет работать после перезапуска 50 раз из-за ошибки (или утечки памяти).

Вы можете проверить журналы, используя pm2 logs myawesomeapp, как вы установилиимя выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...