You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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”的结果,导致循环仅执行一次就终止。不清楚计数不更新的原因,请问如何修改代码以加载完所有评论?

问题根源分析

  1. 选择器失效:YouTube的页面元素标识(比如comment-content这个id)会随页面更新变化,当前评论的核心元素已经不再用这个id定位,导致你统计的数量始终是初始加载的固定值。
  2. 滚动逻辑不合理:固定滚动1000像素可能没触碰到“加载更多评论”的触发阈值,尤其是评论区本身有独立滚动容器时,全局滚动无法触发评论加载。
  3. 硬等待不可靠: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:35:44