木偶不断收到TimeoutError:导航超时超过80000 ms

时间:2020-06-18 21:55:58

标签: node.js express puppeteer ubuntu-18.04 windows-subsystem-for-linux

我正在尝试抓取传递给scrape函数的任何网页,但是无论在page.goto()中设置的超时如何,我都会收到超时错误,如果设置为0,则应用程序将一直等待。 / p>

const express = require('express');
const cors = require('cors');
const MYPORT = process.env.PORT || 4001;


const app = express();
const puppeteer = require('puppeteer');

app.use(express.json());
app.use(cors());

const scrape = async (url) => {
    var body;
    try {
        const browser = await puppeteer.launch({
            headless: true,
            args: ['--no-sandbox'],
            timeout: 0
        });
        console.log('Browser launched');
        const page = await browser.newPage();
        console.log('Page opened');
        await page.goto(url, { waitUntil: 'load', timeout: 3 * 60000 });
        await page.waitForSelector('body', {waitUntil: 'load'})
        console.log('Link opened');
        await page.waitForNavigation({waitUntil: 'networkidle2', timeout: 3 * 60000});
        page.$eval('html', bdy => {
            console.log(bdy);
            body = bdy.innerHTML;
        });
        browser.close();
        return body;
    } catch (err) {
        console.log(err);
    }
};

scrape('http://google.com');

请,我在做什么错了?

我正在WSL(Linux的Windows子系统)上使用Ubuntu 18.04

1 个答案:

答案 0 :(得分:0)

您的脚本的超时等待时间有些复杂。我建议进行以下更改:

  1. 如果您不确定导致超时的原因,则应设置headless: false,以便可以在UI上查看出了什么问题,可以打开浏览器控制台等。
  2. 在脚本用waitForSelector-s完成所需操作之前,请不要设置超时。我从您的脚本中删除了它们。
  3. 如果您对每个网络事件都不感兴趣(特别是对分析和跟踪请求不感兴趣),但只需要DOM,则使用waitUntil: 'domcontentloaded'而不是load或最严格的{{1} }!在文档中查看它们之间的确切区别是什么:[link]
  4. 在等待选择器之后不要networkidle2。这就是脚本失败的主要原因:waitForNavigation出现在DOM中后,您要求伪造者等到导航结束,但此时您没有导航:您已经在页面上了。记住:

    <body>解析页面何时导航到新URL或重新加载。当您运行将间接导致页面导航的代码时,它很有用。 [source]

  5. 您的page.waitForNavigation缺乏异步性,尽管它应该始终保持异步。无论如何,page.eval$中的innerHTML可以使用<body>来更简单地检索。
await page.evaluate(el => el.innerHTML, await page.$('body'))