Webscraping TimeoutError:超过 30000 毫秒的导航超时

Tha*_*ang 15 node.js platformio puppeteer

我正在尝试使用 puppeteer 从公司网站中提取一些表格。

但我不明白为什么浏览器打开 Chromium 而不是我的默认 Chrome,然后导致“TimeoutError:超过 30000 毫秒的导航超时”,不让我有足够的时间使用 CSS Selector。我找不到引用此的文档。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage()
  await page.goto('https://www....com');
//search tearm
  await page.type("#search_term","Brazil");

  //await page.screenshot({path: 'sc2.png'});
  //await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

ama*_*ary 26

Puppeteer 默认是基于 Chromium 的。如果您想使用 Chrome,则必须通过executablePath启动参数指定可执行路径。但说实话,大多数时候,这样做是没有意义的。

let browser = await puppeteer.launch({
    executablePath: `/path/to/Chrome`,
    //...
});
Run Code Online (Sandbox Code Playgroud)

和使用 chromium之间没有相关性TimeoutError: Navigation timeout of 30000 ms exceeded,而是更有可能您的目标网址(尚)不可用。

如果出现以下情况,page.goto 将抛出错误:

  • 存在 SSL 错误(例如,在自签名证书的情况下)。
  • 目标网址无效。
  • 导航期间超时。
  • 远程服务器没有响应或无法访问。
  • 主要资源加载失败。

默认情况下,最大导航超时为 30 秒。如果由于某种原因,您的目标网址需要更多时间来加载(这似乎不太可能),您可以指定一个timeout: 0选项。

await page.goto(`https://github.com/`, {timeout: 0});
Run Code Online (Sandbox Code Playgroud)

由于 Puppeteer 在返回 HTTP 状态代码时不会抛出错误...

当远程服务器返回任何有效的 HTTP 状态代码时,page.goto 不会抛出错误,包括 404“未找到”和 500“内部服务器错误”。

我通常检查HTTP 响应状态代码以确保没有遇到任何404 Client 错误响应 Bad Request

let status = await page.goto(`https://github.com/`);
status = status.status();
if (status != 404) {
    console.log(`Probably HTTP response status code 200 OK.`);
    //...
};
Run Code Online (Sandbox Code Playgroud)

我在这里盲目飞行,因为我没有你的目标网址,也没有关于你想要完成的任务的更多信息。

您还应该阅读puppeteer api 文档。

  • 我在 Circleci 上收到此错误,因为我没有在 puppeteer args 上设置代理设置。因此该测试 url 无法访问。这是我的解决方案。`const browser = wait puppeteer.launch({ args: ['--proxy-server=http://your-proxy-url:port'], });` 参考 => https://stackoverflow.com/a /72540678/2853544 (2认同)

小智 6

下面的方法对我有用。尝试将以下“1 Liner”添加到您的代码中。

setDefaultNavigationTimeout方法允许您定义选项卡的超时,并期望第一个参数为value in milliseconds. 这里有一个值0 means an unlimited amount of time。因为我知道我的页面有一天会加载。

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage()
  // Add the below 1 line of code
  page.setDefaultNavigationTimeout(0);
  // follows the rest of your code block
})();
Run Code Online (Sandbox Code Playgroud)

  • setDefaultNavigationTimeout 的返回类型为 void,无需“await” (3认同)