2016-07-11 6 views
0

私はyoutubeのビデオの下でコメントしたユーザーのすべての名前を掻きたいと思います。 私はルビーとノコギリを使用しています。nokogiriでyoutubeからWebを削る

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を使用して、要素を反復しますname.css("#comment-section..."

が必要だと思います。私はあなたのソリューションを提供することはできませんが、少なくとも私はあなたが移動するのを助けることができるヒントのカップルを与えることができます

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

実際に 'コメント'は 'ノード'よりも優れています。私は 'puts comment'を試みます。 –

1

あなたはnodeの代わりに名前を使用することもできます前方に

ページが読み込まれた後にコメントセクションがajax呼び出しを介して読み込まれるため、あなたが持っているコードは機能しません。ブラウザでハード・リロードすると、セクション・コメントにスピナー・アイコンとLoading...のテキストがあり、コンテンツのロードを待っていることがわかります。 Nokogiriがhttpリクエストでページを取得すると、の前に表示されるhtmlコンテンツが取得され、の前にコメントが読み込まれます。彼らはの一部ではないので、あなたが探しているdiv Sを見つけることができません理由であること

<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> 

:実際のところ内容は、後になる場所は次のようにルックスを追加しましたあなたは持っています。

ブラウザでネットワークコンソールを見ると、コメントデータを取得するためのajaxリクエストがhttps://www.youtube.com/watch_fragments_ajax?v=tntOCGkgt98&tr=time&distiller=1&ctoken=EhYSC3RudE9DR2tndDk4wAEAyAEA4AEBGAY%253D&frags=comments&spf=loadに送信されているようです。あなたはvパラメータは動画IDで見ることができるように、しかし、注意点がいくつかあります:

  • あなたは元のページの内容をこすることで得ることができますctoken paramは、あります。それは 'COMMENTS_TOKEN': "<token>"の形式で<script>タグの内部にあります。
  • ただし、session_tokenをAJAXリクエストの本文にフォームデータとして送信する必要があります(POST)。私はAJAXリクエストやJavascriptを取り扱いに従うことを意図していない私の知る限りとしてあなたが、ここで鋸山の限界に挑戦することになると思い、私は:(どこから来ているのか分からない。

こと。たぶんthe ruby Selenium driverが優れていますこれに適しています。

HTH

0

は、私は、ページがブラウザで実行されるJavaScriptの任意の前に持っているすべてのタグを見ることが鋸山を使用してthisレールのアプリを書いた。ソースコードはhereで、あなたがあれば、それを調整することができますので、ビューのノードに関する詳細を追加する必要があります。

あなたが探している特定のタグ要素が、いくつかのJS評価をすることなく検索できるものかどうかは簡単に分かります。

ほとんどのWebクローラはクライアント側のレンダリングをサポートしていないため、コンテンツをスクラップするときにJSを実行するのは簡単なことではないという考えがあります。

+0

可能な限り、回答は外部のリンクに依存せず、回答自体に関連するすべてのコードを含むべきではありません。 –

+0

これは、OPの暗黙の質問に答えることはできません: "私は間違って何ですか?私のミスはどこにあるの? "彼らにあなたがどのように*役に立ったかを伝えた。 –

関連する問題