Подтвердить что ты не робот

Скремблирование комментариев Youtube в R

Я извлекаю комментарии пользователей с нескольких веб-сайтов (например, reddit.com), а 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, на самом деле, если вы посмотрите, например, на источник видео Youtube, например , вы увидите, что комментарии не отображаются в источнике.

Есть ли у кого-нибудь предложения по извлечению данных в таких обстоятельствах?

Большое спасибо!

4b9b3361

Ответ 1

В ответ на этот ответ R: rvest: соскабливание страницы динамической электронной торговли

Вы можете сделать следующее:

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 so adorable when she was dancing on a rainbow it 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 | получить источник страницы youtube

Комментарий 2: Этот код дает вам первые 44 комментария. В некоторых комментариях есть ссылка "показать все ответы", которая должна была бы щелкнуть. Кроме того, чтобы увидеть еще больше комментариев, вам нужно нажать кнопку "Показать больше" в нижней части страницы. В этом превосходном учебнике RSelenium показано, как щелкнуть: http://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-basics.html

Ответ 2

вы упомянули, что комментарии youtube не отображаются в исходном коде html на странице youtube. Тем не менее, я использовал инструменты разработчика, встроенные в Chrome, и я смог увидеть разметку html, которая составляет комментарии. Я также попытался загрузить страницу с блокировкой скриптов, и комментарии остались.

Предполагая, что ваш парсер может видеть комментарии, следующий xpath должен позволять вам выбирать содержимое комментариев.

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

Альтернативно, если вы хотите выбрать всю информацию внутри блока комментариев, например имя пользователя, вы можете использовать это выражение

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