質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.38%

  • Ruby

    9947questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

YouTubeのチャンネル登録者数をクローリングしたい!

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 594

yuta_tokyo

score 29

nokogiriを初めて使っています。
試しにrubyでYouTubeのチャンネル情報をクローリングしようと心見たのですが、
YouTuberの名前はクローリングできたのですが、
YouTuberのチャンネル登録者数がクローリングできません。

例えば、はじめしゃちょーの情報をクローリングするとします、
https://www.youtube.com/channel/UCgMPP6RRjktV7krOfyUewqw/about

require 'nokogiri'
require 'open-uri'

channel_id = "UCgMPP6RRjktV7krOfyUewqw"
url = "https://www.youtube.com/channel/#{channel_id}/about"

doc = Nokogiri::HTML(open(url), nil, "UTF-8")
channel_name = doc.xpath("//h1['channel-title-container']/span").text
subscriber = doc.xpath("//h1['channel-title-container']/yt-formatted-string").text

puts channel_name
puts subscriber
$ ruby test.rb
はじめしゃちょー(hajime)

YouTuber名は取れるのですが、チャンネル登録者数が取れません。
xpathが通ってないのが理由かと思い、試行錯誤したのですが解決しません。
どなたかご教授ください!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

チャンネル登録者数は<h1>以下にないため、別の要素が引っかかります。

XPathはこれでいいかと。
//yt-formatted-string[@id='subscriber-count']
JavaScriptでDOMを書き換えているらしく、↑の方法ではうまくいきませんでした。

代わりにページのソースコードをcurlコマンドで取得して確認してみたところ、
以下のようにすればうまく取得できました。

subscriber = doc.css(".yt-subscription-button-subscriber-count-branded-horizontal").text

今回はCSSセレクタで対応しましたが、Google Chromeだとコンソールに$x(xpath文字列)と打つと結果がすぐ見れるので、デバッグに使ってみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/11 20:47

    $ curl -O https://www.youtube.com/channel/UCgMPP6RRjktV7krOfyUewqw/about
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 148k 0 148k 0 0 270k 0 --:--:-- --:--:-- --:--:-- 270k

    このようなコードが出ますが、どのようにしたらソースコードをダウンロードできるのでしょうか?
    初歩的な質問ですみません。

    しかし、今回cssセレクタの中身の".yt-subscription-button-subscriber-count-branded-horizontal"を見つけたのが curl -O を実行したからだとお伺いしたので、何卒curl -Oを実行方法を知りたいです。

    キャンセル

  • 2018/08/11 21:18

    では、詳しく説明します。

    実は、すでにダウンロードできています。

    まず、curlコマンドの実行したときに画面に表示されているのは、ダウンロード状況です。

    curlの-Oオプションは、「ページ名をファイル名とする」オプションです。
    今回のURLは以下のようになっているので、最後の'about'がファイル名になります。
    https://www.youtube.com/channel/UCgMPP6RRjktV7krOfyUewqw/about

    よって、curlコマンドを実行したディレクトリに、'about'というファイルができているはずです。

    次に、このファイルをテキストエディタで開きます。

    それから、今回取得したいのがチャンネル登録者数なので、「チャンネル登録者数」でファイルの中身を検索すると、以下のようなspanが引っかかります。

    <span class="yt-subscription-button-subscriber-count-branded-horizontal subscribed yt-uix-tooltip" title="6,681,011" tabindex="0" aria-label="チャンネル登録者数 6,681,011 人">6,681,011</span

    このclassにマッチするセレクタを書けばいいのでは?と判断して、回答を書きました。

    ちなみに、yt-subscription-button-subscriber-count-branded-horizontalを選んだ理由は「何となく長いほうが被らなさそう」と思っただけで、subscribedを使っても問題ないみたいです(確認しました)。

    キャンセル

  • 2018/08/12 05:32

    懇切丁寧にご説明いただきありがとうございます!実際にセレクタ探すことができました!他の数値もクローリングしてみようと思います!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    9947questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。