在 R 中抓取 Youtube 评论

Posted

技术标签:

【中文标题】在 R 中抓取 Youtube 评论【英文标题】:Scraping Youtube comments in R 【发布时间】:2014-10-03 04:18:54 【问题描述】:

我正在从一系列网站(如 reddit.com)中提取用户 cmets,而 Youtube 对我来说也是另一个丰富的信息来源。我现有的刮板是用 R 编写的:

# x is the url
html = getURL(x)
doc  = htmlParse(html, asText=TRUE) 
txt  = xpathSApply(doc, 
   //body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]",xmlValue) 

这不适用于 Youtube 数据,事实上,如果您查看像 this 这样的 Youtube 视频源,您会发现源中没有出现 cmets。

有人对如何在这种情况下提取数据有任何建议吗?

非常感谢!

【问题讨论】:

它们可能是在页面加载后通过 javascript 下载的。您可以使用 Chrome 开发者工具在不同的 URL 上查找对 cme​​ts 的请求,或者使用像 RSelenium 这样的包,它可以与浏览器交互以在页面上执行 javascript。 您应该为此使用 Youtube 的 api - 它会为您提供更加一致的结果,并会在更改时警告您。您可以在developers.google.com/youtube/articles/changes_to_comments 或***.com/questions/19965856/… 阅读有关它的信息 非常感谢大家,通过 waternova 的链接,我发现使用以下 URL(其中 VID = 视频 ID)可以满足我的需求:https://gdata.youtube.com/feeds/api/videos/VID/comments?orderby=published Cheers! @de1pher,请随意回答您自己的问题(并接受它),以免它留在未回答的队列中。 【参考方案1】:

您提到 youtube cmets 不会出现在 youtube 页面的 html 源代码中。但是,我习惯于将开发人员工具构建到 Chrome 中,并且能够看到构成 cmets 的 html 标记。我还尝试在脚本被阻止的情况下加载页面,并且 cmets 仍然存在。

假设您的解析器可以看到 cmets,下面的 xpath 应该允许您选择 cmets 的内容。

"//body//div[@class='comment-text-content']/text()"

或者如果你想选择评论块内的所有信息,比如用户名,你可以使用这个表达式

"//body/div[@class='comments']//div[@class='comment-item']"

【讨论】:

感谢您的回复@Dirk7589,恐怕这种方法似乎不起作用,我得到 NULL 作为回应。经过仔细检查,我发现发生了一些奇怪的事情:xpathSApply(doc,'//*/span[@class="yt-spinner-message"]') 返回以下结果:` [[1]] Loading... `这么多的结构不可用 - 它正在加载...?【参考方案2】:

关注这个答案:R: rvest: scraping a dynamic ecommerce page

您可以执行以下操作:

devtools::install_github("ropensci/RSelenium") # Install from github

library(RSelenium)
library(rvest)
pJS <- phantom(pjs_cmd = "PATH TO phantomjs.exe") # as i am using windows
Sys.sleep(5) # give the binary a moment
remDr <- remoteDriver(browserName = 'phantomjs')
remDr$open()
remDr$navigate("https://www.youtube.com/watch?v=qRC4Vk6kisY")
remDr$getTitle()[[1]] # [1] "YouTube"

# scroll down
for(i in 1:5)      
  remDr$executeScript(paste("scroll(0,",i*10000,");"))
  Sys.sleep(3)    


# Get page source and parse it via rvest
page_source <- remDr$getPageSource()
author <- html(page_source[[1]]) %>% html_nodes(".user-name") %>% html_text()
text <- html(page_source[[1]]) %>% html_nodes(".comment-text-content") %>% html_text()

#combine the data in a data.frame
dat <- data.frame(author = author, text = text)

Result:
> head(dat)
              author                                                                                       text
1 Kikyo bunny simpie Omg I love fluffy puff she's so adorable when she was dancing on a rainbow it's so cute!!!
2   Tatjana Celinska                                                                                     Ciao 0
3      Yvette Austin                                                                   GET OUT OF MYÂ  HEAD!!!!
4           Susan II                                                                             Watch narhwals
5        Greg Ginger               who in the entire fandom never watched this, should be ashamed,\n\nPFFFTT!!!
6        Arnav Sinha                                                                 LOL what the hell is this?

评论1:你确实需要github版本见rselenium | get youtube page source

评论2: 此代码为您提供了最初的 44 cmets。一些 cmets 有一个“显示所有答案”链接,必须点击。此外,要查看更多 cmets,您必须单击页面底部的显示更多按钮。 在这个优秀的 RSelenium 教程中解释了点击: http://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-basics.html

【讨论】:

太好了,现在我的脑袋里卡着粉红色的蓬松独角兽了。 谢谢!这就是我要找的:)

以上是关于在 R 中抓取 Youtube 评论的主要内容,如果未能解决你的问题,请参考以下文章

用于抓取所有评论和回复的 YouTube 数据 API

如何获得特定的 YouTube 评论?

YouTube 订阅列表抓取

ReferenceError:未定义 YouTube/将 YouTube 评论插入电子表格

直接链接到 YouTube 评论

使用带有 python 的 youtube api 发布 youtube 评论,每次询问“授权此应用程序”