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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

Q&A

解決済

1回答

682閲覧

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

yuta_tokyo

総合スコア35

Ruby

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

0グッド

0クリップ

投稿2018/08/07 05:56

編集2018/08/07 05:57

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が通ってないのが理由かと思い、試行錯誤したのですが解決しません。
どなたかご教授ください!

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

ruby

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

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

投稿2018/08/07 06:12

編集2018/08/09 12:11
ikemo

総合スコア332

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuta_tokyo

2018/08/07 06:21 編集

早速のご返信ありがとうございます!しかし、 subscriber = doc.xpath("//yt-formatted-string[@id='subscriber-count']").text puts subscriber でも通りません...
ikemo

2018/08/07 06:28

これだとできました。 subscriber = doc.css(".yt-subscription-button-subscriber-count-branded-horizontal").text 先程のXPathで動かなかったのはおそらく、JavaScriptでDOMが書き換えられたからです。 以下のコマンドでファイルを取得して、中身をチェックしたら、必要なセレクタが見つかりました。 > curl -O https://www.youtube.com/channel/UCgMPP6RRjktV7krOfyUewqw/about
yuta_tokyo

2018/08/11 11: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を実行方法を知りたいです。
ikemo

2018/08/11 12: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を使っても問題ないみたいです(確認しました)。
yuta_tokyo

2018/08/11 20:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問