我想抓取在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>"
。 session_token
作为表单数据(这是POST
)。我不知道从哪里来:(。我认为您将在这里推高Nokogiri的极限,因为AFAIK并非旨在遵循Ajax请求或处理Javascript。也许the ruby Selenium driver更适合于此。
高温超导
关于ruby - 使用nokogiri从youtube抓取网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38314809/