Puppeteer 错误错误:等待选择器超时

问题描述 投票:0回答:2
javascript node.js web-scraping puppeteer
2个回答
6
投票

每次页面内容更新时都需要添加

page.waitForNavigation()

(async () => {
  const browser = await pptrFirefox.launch({headless: false});
  const page = await browser.newPage();
  const navigationPromise = page.waitForNavigation({waitUntil: "domcontentloaded"});
  await page.goto('https://zillow.com');
  await navigationPromise;
  await page.type('.react-autosuggest__input', '8002 Blandwood Rd. Downey, CA 0240');
  await page.click('.zsg-search-button_primary');
  await navigationPromise;
  await page.waitForSelector('.photo-tile');

  console.log('did I get this far?');

})();

3
投票

自提出此问题以来,该网站在 4 年内发生了变化,但这是一个常见的故事:手动验证某个元素是否存在于开发工具中,并将选择器复制到 Puppeteer,但等待时超时。

至少有一些常见原因

  • 该元素位于影子根中
  • 该元素位于 iframe 中
  • 元素需要滚动到视图中,否则会超出视口
  • 服务器将您的脚本检测为机器人并阻止您,或呈现验证码

一种调试策略是全神贯注地运行(OP 已经这样做了,但未来的访问者可能不会这样做)。如果代码有效,那么该网站只会在您无头时将您检测为机器人。请参阅规范的 Why does headless need to false for Puppeteer to work? 了解后续步骤。

console.log(await page.content())
可以帮助确定您是否被无头屏蔽。

如果拼命跑还是不行,查看页面看看原因。在某些情况下,页面可能会显示验证码,从而导致使用 puppeteer 通过 Headless Chrome 绕过验证码。在撰写本文时,当前问题似乎就是这种情况。

通常,添加更多

waitForNavigation
并将超时设置为 0 没有帮助(除非您通过单击或表单提交在页面之间导航,那么
waitForNavigation
可能是合适的)。

披露:我是链接博客文章的作者。

© www.soinside.com 2019 - 2024. All rights reserved.