每次页面内容更新时都需要添加
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?');
})();
自提出此问题以来,该网站在 4 年内发生了变化,但这是一个常见的故事:手动验证某个元素是否存在于开发工具中,并将选择器复制到 Puppeteer,但等待时超时。
至少有一些常见原因:
一种调试策略是全神贯注地运行(OP 已经这样做了,但未来的访问者可能不会这样做)。如果代码有效,那么该网站只会在您无头时将您检测为机器人。请参阅规范的 Why does headless need to false for Puppeteer to work? 了解后续步骤。
console.log(await page.content())
可以帮助确定您是否被无头屏蔽。
如果拼命跑还是不行,查看页面看看原因。在某些情况下,页面可能会显示验证码,从而导致使用 puppeteer 通过 Headless Chrome 绕过验证码。在撰写本文时,当前问题似乎就是这种情况。
通常,添加更多
waitForNavigation
并将超时设置为 0 没有帮助(除非您通过单击或表单提交在页面之间导航,那么 waitForNavigation
可能是合适的)。
披露:我是链接博客文章的作者。