【发布时间】:2021-07-24 14:14:17
【问题描述】:
我试图在谷歌搜索食谱时点击“显示更多”按钮,多次使用 puppeteer。我让它在这样的 for 循环中工作,
for (let i = 0; i <= numberOfClicks; i++) {
await page.click('div[aria-label="Show more"]')
await page.waitForTimeout(800)
}
但是,这会为每次点击增加 800 毫秒,我真的很想避免这种情况,以节省我正在拨打的电话的时间。
我尝试了各种不同的方法,并有类似的感觉,
for (let i = 0; i <= numberOfClicks; i++) {
await page.waitForFunction(
`document.querySelectorAll("g-inner-card a").length > ${i * 9}`
)
await page.click('div[aria-label="Show more"]')
}
应该做我需要的,因为谷歌从 3 个食谱开始,每次点击“显示更多”时都会打开 9 个,但是,到目前为止,我只能让它点击一次,然后用这种方法挂起。
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
您能否分享相关的 URL,以便我自己运行和测试代码?不过,
"g-inner-card a"看起来像是一个糟糕的选择器。如果g-inner-card是一个类,它应该是".g-inner-card a"。每当您在浏览器中运行代码时,最好在控制台中手动测试它或添加listeners,这样您就可以看到记录的错误。 -
因此,作为一个例子,google.com/search?q=spaghetti+bolognese,您可以查看它们是否以某种方式具有
g-inner-card元素。而且,我在我的代码中的其他地方成功地使用了"g-inner-card a"作为选择器,并且还在控制台中对其进行了检查。我认为单击“显示更多”时与移动按钮有关,并且需要放慢速度,因此它与waitForTimeout一起使用。我只是不明白为什么waitForFunction没有像我认为的那样工作 -
感谢您的网址——是的,您是对的,这是一个合法的元素。你的代码对我有用。您最终想要获取哪些数据?我能想到的可能是您提出了太多请求并且它们限制了您,或者存在 A/B 情况或其他情况。
-
我正在尝试获取食谱 URL 的数组。我有,但我真的不想使用waitForTimeout。您可以通过多少次点击来使用您的代码?对我来说,任何不止一次点击的东西都挂着。你能复制并粘贴你写的代码吗?也许我的代码中有一些早一点的东西导致它变慢或什么的。您能否再详细说明一下您所说的 A/B 情况是什么意思?
-
我还有一个问题,当它多次点击时,有时它会出于某种原因点击其中一个实际的食谱。我正在努力调试,因为很难看到 puppeteer 在出错时实际做了什么
标签: javascript google-chrome web-scraping puppeteer