ruby - 使用nokogiri从youtube抓取网页

标签 ruby youtube nokogiri

我想抓取在YouTube视频下方发表评论的所有用户的名字。
我正在使用ruby和nokogiri。

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "https://www.youtube.com/watch?v=tntOCGkgt98"
doc = Nokogiri::HTML(open(url))

doc.css(".comment-thread-renderer > .comment-renderer").each do |comment|
    name = comment.css("#comment-section-renderer-items .g-hovercard").text

    puts name
end 

但这不起作用,我没有任何输出,也没有错误。

最佳答案

我将无法为您提供解决方案,但至少我可以给您一些提示,可能会帮助您前进。

您拥有的代码无法正常工作,因为在页面加载后,注释部分是通过ajax调用加载的。如果您在浏览器中进行了重新加载,则将在各节注释中看到一个旋转图标和一个Loading...文本,等待加载内容。当Nokogiri通过http请求获取页面时,它将获取在加载注释之前看到的html内容。实际上,以后将添加内容的位置如下所示:

<div id="watch-discussion" class="branded-page-box yt-card">
  <div id="comment-section-renderer"
    class="comment-section-renderer vve-check"
    data-visibility-tracking="CCsQuy8iEwjr3P3u1uzNAhXIepAKHRV9D8Ao-B0=">
      <div class="action-panel-loading">
        <p class="yt-spinner ">
          <span class="yt-spinner-img  yt-sprite" title="Loading icon">
          </span>
          <span class="yt-spinner-message">Loading...</span>
        </p>
      </div>
  </div>
</div>

这就是为什么找不到所需的div的原因,因为它们不属于您的html。

查看浏览器中的网络控制台,似乎将获取评论数据的ajax请求发送到了https://www.youtube.com/watch_fragments_ajax?v=tntOCGkgt98&tr=time&distiller=1&ctoken=EhYSC3RudE9DR2tndDk4wAEAyAEA4AEBGAY%253D&frags=comments&spf=load。如您所见,v参数是视频ID,但是有几点警告:
  • 有一个ctoken参数,可以通过抓取原始页面内容来获取。它位于<script>标记内,格式为'COMMENTS_TOKEN': "<token>"
  • 但是,您仍然需要在AJAX请求的主体中发送session_token作为表单数据(这是POST)。我不知道从哪里来:(。

  • 我认为您将在这里推高Nokogiri的极限,因为AFAIK并非旨在遵循Ajax请求或处理Javascript。也许the ruby Selenium driver更适合于此。

    高温超导

    关于ruby - 使用nokogiri从youtube抓取网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38314809/

    相关文章:

    asp.net - 无需 youtube api 即可上传 youtube 视频

    ruby - 修改 html 节点内的文本 - nokogiri

    ruby - 如何创建 nokogiri 不区分大小写的 Xpath 选择器?

    sql - ruby rails : Query where date equals another date (ignoring time)

    ruby-on-rails - 为什么 Helpers 中不应该有 html?

    mysql - 如何在rails中存储用户上次访问的页面

    vim 下 ruby​​ 段错误

    ruby - 如何使用 Nokogiri 选择元素

    iphone - 如何在iPad应用程序中启动youtube视频?

    jquery - 通过 jQuery 在 YouTube 嵌入电影中启用自动播放