使用Watir滚动加载YouTube全部评论时计数不更新的问题求助
如何用Watir滚动加载YouTube全部评论(解决计数不更新问题)
我尝试通过滚动加载YouTube视频的全部评论,采用计数器对比当前显示评论数的方式实现,编写了如下Watir代码:
mycount = 0 1.upto(20) do thiscount = browser.div(id: "contents").divs(id: "comment-content").size puts "#{ mycount } : #{ thiscount }" break if mycount == thiscount mycount = thiscount browser.driver.execute_script("window.scrollBy(0,1000)") sleep 10 end但首次滚动后评论计数并未增加,即使设置了10秒等待让评论加载并更新计数,仍出现“20 : 20”的结果,导致循环仅执行一次就终止。不清楚计数不更新的原因,请问如何修改代码以加载完所有评论?
问题根源分析
- 选择器失效:YouTube的页面元素标识(比如
comment-content这个id)会随页面更新变化,当前评论的核心元素已经不再用这个id定位,导致你统计的数量始终是初始加载的固定值。 - 滚动逻辑不合理:固定滚动1000像素可能没触碰到“加载更多评论”的触发阈值,尤其是评论区本身有独立滚动容器时,全局滚动无法触发评论加载。
- 硬等待不可靠:
sleep 10是固定时长等待,可能评论加载完成更快,也可能网络慢时还没加载完,无法精准判断新评论是否已加载。
修改后的代码
# 定位评论区的核心容器(YouTube页面稳定的元素结构) comments_container = browser.element(css: "ytd-item-section-renderer #contents") mycount = 0 loop do # 用稳定的css选择器定位所有已加载的评论 current_comments = comments_container.elements(css: "ytd-comment-renderer") thiscount = current_comments.size puts "#{mycount} : #{thiscount}" # 评论数量不再变化时,说明已加载完成 break if mycount == thiscount mycount = thiscount # 滚动到最后一条评论的位置,触发加载更多逻辑 last_comment = current_comments.last browser.driver.execute_script("arguments[0].scrollIntoView(true);", last_comment.wd) # 显式等待新评论加载完成,超时10秒,每0.5秒检查一次 Watir::Wait.until(timeout: 10, interval: 0.5) do comments_container.elements(css: "ytd-comment-renderer").size > mycount end end
关键改动说明
- 选择器优化:改用
ytd-comment-renderer定位单条评论,ytd-item-section-renderer #contents定位评论容器,这些是YouTube长期稳定的元素标识,避免因页面更新导致定位失败。 - 滚动逻辑调整:滚动到最后一条评论的位置,确保触发评论区的加载更多机制,比固定滚动距离更精准。
- 替换硬等待为显式等待:用
Watir::Wait.until监听评论数量变化,直到数量增加或超时,既保证加载完成,又避免不必要的等待。 - 无限循环替代固定次数:去掉20次循环限制,直到评论数量不再变化才终止,确保加载完所有评论。
内容的提问来源于stack exchange,提问作者Rich_F
相关产品推荐
相关产品推荐

