使用p操纵者永远刮取同一页面

时间:2019-02-25 14:32:31

标签: javascript node.js web-scraping puppeteer

进行报废。我如何能停留在页面上并阅读内容以每隔xx秒搜索一次数据而不刷新页面?我使用这种方式,但一段时间后PC崩溃了。关于如何提高效率的任何想法?我想不使用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 :(得分:2)

具有递归回调的简单解决方案

但是,在进行此操作之前,您可以尝试运行该函数本身,而不是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.waitForwhile

防止内存泄漏

对于在一段时间内重新生成的高级情况,诸如bull之类的Queue和诸如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查看日志。