2016-07-11 2 views
0

Я хочу очистить все имена пользователей, которые прокомментировали ниже видео с YouTube. Я использую рубин и нокогири.Веб-скребок с youtube с 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 

Но это не работает, я не получаю никаких результатов, никаких ошибок.

+1

Если вы не получаете результат или ошибку, вы должны подтвердить, что на самом деле получаете ожидаемый HTML-код. Отключите Javascript в своем браузере и посмотрите на эту страницу. Вы видите контент, который хотите? Используйте 'nokogiri 'https: //www.youtube.com/watch? V = tntOCGkgt98'' в командной строке и оглядитесь, или используйте' curl' или 'wget' для загрузки страницы. Если вы не можете найти его, шансы хороши, это динамический HTML, и необходимая информация недоступна, если вы не используете что-то, что может интерпретировать DHTML. –

+0

не отвечает на ваш вопрос, но как насчет API? – nikkypx

ответ

0

Я думаю, что вам нужно name.css("#comment-section..."

каждый оператор будет перебирать элементы, используя переменную name.

Вы можете использовать node вместо имени:

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

    puts name 
end 
+0

Не работает. (обновленный код) – Max

+0

На самом деле 'комментарий' лучше, чем'node'. Я бы попробовал 'puts comment'. –

1

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

Код, который у вас есть, не работает, потому что раздел комментариев загружается через вызов ajax после загрузки страницы. Если вы сделаете жесткую перезагрузку в своем браузере, вы увидите, что в комментариях разделов есть значок spinner и текст 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 s вы ищете, потому что они не являются частью html у вас есть.

Рассматривая сетевую консоль в браузере, кажется, что запрос ajax для получения данных комментариев отправляется в https://www.youtube.com/watch_fragments_ajax?v=tntOCGkgt98&tr=time&distiller=1&ctoken=EhYSC3RudE9DR2tndDk4wAEAyAEA4AEBGAY%253D&frags=comments&spf=load. Как вы можете видеть параметр v является идентификатором видео, однако есть несколько предостережений:

  • Существует ctoken пар, которые вы можете получить путем соскоба исходного содержимого страницы. Он находится внутри метки <script>, в форме 'COMMENTS_TOKEN': "<token>".
  • Однако вам все равно необходимо отправить session_token в виде данных формы в теле запроса AJAX (который является POST). То, что я не знаю, откуда исходит из :(.

Я думаю, что вы будете раздвигает границы Nokogiri здесь, как AFAIK она не предназначена, чтобы следовать Ajax запросов или обработку Javascript. Может быть the ruby Selenium driver лучше подходит для этого.

НТН

0

Я написал this рельсы приложение с помощью nokogiri, чтобы увидеть все теги, что страница, прежде чем любой браузер запустить в браузере. исходный код here, так что вы можете настроить его, если вам нужно добавить дополнительную информацию об узле в представлении.

Это может легко сказать вам, является ли конкретный элемент тега, который вы ищете, - это то, что вы можете получить, не выполняя какой-либо JS-eval.

Большинство веб-искателей не поддерживают рендеринг на стороне клиента, что дает вам представление о том, что выполнение JS при очистке содержимого не является тривиальной задачей.

+0

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

+0

Это не отвечает на неявный вопрос OP: «Что я делаю неправильно? Где моя ошибка? »Рассказывая им, как вы это делали, вряд ли полезно. –

Смежные вопросы