【问题标题】:Puppeteer not working as excepted (pause/freeze when browser not in focus)Puppeteer 无法正常工作(浏览器不在焦点时暂停/冻结)
【发布时间】:2021-01-28 07:14:45
【问题描述】:

我正在使用 Puppeteer.js 来抓取一些 URL。我正在使用 Puppeteer 的默认 Chromium 浏览器。
一切运行良好,但问题是,当我运行爬虫脚本并在后台执行其他操作时,焦点不再在 Chromium 浏览器上Puppeteer,它不起作用:等待元素的时间太长,并且中止操作,或者换句话说:puppeteer 被暂停(或冻结)。

P.S,我还使用 puppeteer-extrapuppeteer-extra-plugin-stealth NPM 包作为高级选项。

这是我创建浏览器和页面的方法:

async initiateCrawl(isDisableAsserts) {
    // Set the browser.
    this.isPlannedClose = false;
    const browser = await puppeteerExtra.launch({
        headless: false,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--start-maximized',
            '--disable-background-timer-throttling',
            '--disable-backgrounding-occluded-windows',
            '--disable-renderer-backgrounding'
        ]
    });
    const pid = browser.process().pid;
    browser.on('disconnected', () => {
        systemUtils.killProcess(pid);
        if (!this.isPlannedClose) {
            systemUtils.exit(Status.BROWSER_CLOSE, Color.RED, 0);
        }
    });
    process.on('SIGINT', () => {
        this.close(browser, true);
    });
    // Set the page and close the first empty tab.
    const page = await browser.newPage();
    const pages = await browser.pages();
    if (pages.length > 1) {
        await pages[0].close();
    }
    await page.setRequestInterception(true);
    await page.setJavaScriptEnabled(false);
    await page.setDefaultNavigationTimeout(this.timeout);
    page.on('request', (request) => {
        if (isDisableAsserts && ['image', 'stylesheet', 'font', 'script'].indexOf(request.resourceType()) !== -1) {
            request.abort();
        } else {
            request.continue();
        }
    });
    return {
        browser: browser,
        page: page
    };
}

我已经看过了:
https://github.com/puppeteer/puppeteer/issues/3339
https://github.com/GoogleChrome/chrome-launcher/issues/169
https://www.gitmemory.com/issue/GoogleChrome/puppeteer/3339/530620329

无效的解决方案:

const session = await page.target().createCDPSession();
await session.send('Page.enable');
await session.send('Page.setWebLifecycleState', {state: 'active'});
const chromeArgs = [
  '--disable-background-timer-throttling',
  '--disable-backgrounding-occluded-windows',
  '--disable-renderer-backgrounding'
];
var ops = {args:[
        '--kiosks',
        '--disable-background-timer-throttling',
        '--disable-backgrounding-occluded-windows',
        '--disable-renderer-backgrounding',
        '--disable-canvas-aa',
        '--disable-2d-canvas-clip-aa',
        '--disable-gl-drawing-for-tests',
        '--disable-dev-shm-usage', 
        '--no-zygote', 
        '--use-gl=desktop', 
        '--enable-webgl',
        '--hide-scrollbars',
        '--mute-audio',
        '--start-maximized',
        '--no-first-run',
        '--disable-infobars',
        '--disable-breakpad', 
        '--user-data-dir='+tempFolder, 
        '--no-sandbox',
        '--disable-setuid-sandbox'
    ], headless: false, timeout:0   };
puppeteer = require('puppeteer');
    browser = await puppeteer.launch(ops);
    page = await browser.newPage();

以前有没有人遇到过这个问题并且知道如何解决这个问题?谢谢。

【问题讨论】:

  • 我遇到了同样的问题,它工作正常,但最近它停止工作了。
  • 经过一段时间后有没有报错?
  • @Mu-Majid 不,浏览器只是冻结。
  • 也许在无头模式下运行解决它

标签: javascript node.js puppeteer chromium freeze


【解决方案1】:

当我更新到最新的 puppeteer 版本 (9.0.0) 后,我的问题得到了解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2018-06-15
    • 2015-02-22
    • 2015-08-22
    相关资源
    最近更新 更多