在 puppeteer 中的特定时间后如何 运行 window.stop

How to run window.stop after certain time in puppeteer

我想对一个站点进行网络抓取,但该站点的问题是,站点中的内容在 1 秒内加载,但导航栏中的加载器持续加载 30 到 1 分钟,所以我的 puppeteer 抓取器一直在等待加载器导航栏停止? 有没有办法在一定的超时后运行window.stop()

GITHUB

    const checkBook = async () => {
        await page.goto(`https://wattpad.com/story/${bookid}`, {
            waitUntil: 'domcontentloaded',
        });
        const is404 = await page.$('#story-404-wrapper');
        if (is404) {
            socket.emit('error', {
                message: 'Story not found',
            });
            await browser.close();
            return {
                error: true,
            };
        }
        storyLastUpdated = await page
            .$eval(
                '.table-of-contents__last-updated strong',
                (ele: any) => ele.textContent,
            )
            .then((date: string) => getDate(date));
    };

你可以去掉

 waitUntil: 'domcontentloaded',

支持此处记录的超时 https://github.com/puppeteer/puppeteer/blob/v14.1.0/docs/api.md#pagegotourl-options

或将超时设置为零,而是像这样使用 page.waitFor... 之一

await page.waitForTimeout(30000);

与 Marcel 的回答类似的方法。以下将完成这项工作:

page.goto(url)
await page.waitForTimeout(1000)
await page.evaluate(() => window.stop())
// your scraper script goes here
await browser.close()

备注:

  • page.goto() 未等待,因此与等待 DOMContentLoadedLoad 事件相比,您可以节省时间...
  • ...如果没有等待 goto,您需要确保您的脚本可以使用 DOM 开始工作。您可以使用 page.waitForTimeout() or page.waitForSelector().
  • 你必须在page.evaluate()内执行window.stop(),这样你就可以避免这种错误:Error: Navigation failed because browser has disconnected!