你如何等待选择器,但只在木偶师的特定时间段内?



我正在从YouTube上抓取数据并试图获得评论数量。我正在尝试抓取包含该值的元素,但如果视频的评论被禁用,则该元素根本不存在,我认为waitForSelector()等待大约 30 秒才能结束程序。我怎样才能告诉木偶师等待该元素,比如说,5秒钟,如果它不存在,继续其余的代码?

这是我正在使用的代码-

await page.waitForSelector("yt-formatted-string.count-text.style-scope.ytd-comments-header-renderer")
let commentCount = await (await (await page.$("yt-formatted-string.count-text.style-scope.ytd-comments-header-renderer")).getProperty("textContent")).jsonValue()

下面的代码你可以尝试等待 -

await page.waitForSelector(yourSelector, {timeout: TIMEOUT});

前任:

await page.waitForSelector(yourSelector, {timeout: 5000});

更新:

抓住timeouterror并做点什么——

const {TimeoutError} = require('puppeteer/Errors');
try {
await page.waitForSelector(yourSelector, {timeout: 5000});
} catch (e) {
if (e instanceof TimeoutError) {
// Do something if this is a timeout.
}
}

参考:

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagewaitforselectorselector-options

尝试下面的代码,只需添加一个timeout选项

try {
await page.waitForSelector("yt-formatted-string.count-text.style-scope.ytd-comments-header-renderer", {timeout: 5000 }); // 5s timeout
} catch (e) {
// something wrong !!!!!!
}
let commentCount = await (await (await page.$("yt-formatted-string.count-text.style-scope.ytd-comments-header-renderer")).getProperty("textContent")).jsonValue()

我设法在浏览器中运行它并将其包含在page.evaluate()中。如果将来有人需要它,这是代码 -

while(true){
if(await page.evaluate(async () => { // scroll till there's no more room to scroll or the comment element shows up
return await new Promise((resolve, reject) => {
var scrolledHeight = 0  
var distance = 100 
var timer = setInterval(() => {
var scrollHeight = document.documentElement.scrollHeight
window.scrollBy(0, distance)
scrolledHeight += distance
if(scrolledHeight >= scrollHeight || document.querySelector("yt-formatted-string.count-text.style-scope.ytd-comments-header-renderer")){
clearInterval(timer)
resolve(true)
}
}, 500)
})
})){
break
}
}
let commentElement = await page.$("yt-formatted-string.count-text.style-scope.ytd-comments-header-renderer"), commentCount = null
if(commentElement !== null){
commentCount = await (await commentElement.getProperty('innerHTML')).jsonValue()
}

最新更新