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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1078閲覧

Youtubeのスクレイピング、xpathはどこを参照すれば良いでしょうか。

isumidaichi

総合スコア7

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

2クリップ

投稿2018/02/19 09:36

前提・実現したいこと

Rails、nokogiriを利用しyoutubeからのスクレイピングをしようと試みています。
本サイトで以前ご質問されていた方のソースコードを拝借し実装中ですが、動画の視聴回数が全て0で返ってきます。そこで、自分でchromeのディベロッパーツールを用いxpathを取得し、指定しているのですが、0すら返ってこなくなりました。他の要素もディベロッパーツールで確認できるxpathと拝借したソースコードのxpathが異なり、ディベロッパーツールで確認できるxpathを指定するとデータが取得できません。
Youtubeのxpathはどこを参照すれば良いのでしょうか。

ぜひご教授ください。

該当のソースコード

Ruby

1class Video < ApplicationRecord 2 3 # encoding: utf-8 4 5 # URLにアクセスするためのライブラリの読み込み 6 require 'open-uri' 7 # Nokogiriライブラリの読み込み 8 require 'nokogiri' 9 require 'uri' 10 11 12def self.get 13 # 前半部では、検索ワードに関連するリンクの一覧を取得する。 14 15 urls = [] 16 # 配列の宣言 17 search_q="アウディ" 18 search_term = URI.encode(search_q) 19 # サーチタームを定義。URIオブジェクトのencodeメソッドでutf-8に対応している? 20 url="https://www.youtube.com/results?search_query=#{search_term}" 21 # urlは普通に、YouTubeの検索した時のurl。 22 23 doc=Nokogiri::HTML(open(url)) 24 # ノコギリで、urlを開いてdocという変数へ入れる。 25 elements=doc.xpath("//h3[@class='yt-lockup-title ']/a") 26 # 要素の切り出しをxpathを使って行う。 h3タグでyt-lookup-title(注意:末尾に半角スペース1つ入ります!)というクラスが付与された要素下のa要素を取得。 27 elements.each do |a| 28 # その中のリンク要素それぞれを取り出す。 29 code = a.attributes['href'].value 30 # そして、その要素が持つhref属性、すなわちアドレスを取得する。 31 urls << "https://www.youtube.com" + code if code.include?('watch') 32 # 配列宣言しておいたurlsにそれぞれのアドレスをお尻に付加した、youtubeのアドレスをぶっこんでいく。 33 end 34 35 # 後半部では、各リンクの中の要素を取得していく。 36 urls.each do |url| 37 # それぞれのurlについて情報を吐き出させる。 38 doc = Nokogiri::HTML(open(url),nil,"UTF-8") 39 video = Video.new 40 41 # 動画URLを取得 42 video.url = url 43 # 動画のタイトルを取得 44 video.title = doc.xpath("//h1['watch-headline-title']/span").text.gsub(/\n /,'').gsub(/\n /,'') 45 # 動画の説明文を取得 46 video.description = doc.xpath("//p[@id='eow-description']").text 47 48 49 # 動画の視聴回数を取得 50 video.views = doc.xpath('//*[@id="count"]/yt-view-count-renderer/span[2]').text 51 52 53 # 動画のチャンネルを取得 54 video.chnnnel = doc.xpath("//*[@id='watch7-user-header']/div/a").text 55 56 video.save 57 end 58 59end 60 61 62 63end 64

試したこと

参照ソースコードのxpathから、ディベロッパーツールでのxpathに変更しました。

Ruby

1#元々のxpath 2video.views = doc.xpath("//*[@id='watch7-views-info']/div[1]").text 3 4#変更後 5video.views = doc.xpath('//*[@id="count"]/yt-view-count-renderer/span[2]').text

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

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

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

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

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

guest

回答2

0

APIがあるのでそちらを使うのが良いと思います。

【YouTube Data API の概要  |  YouTube Data API (v3)  |  Google Developers】
https://developers.google.com/youtube/v3/getting-started?hl=ja

投稿2018/02/19 15:46

kei344

総合スコア69364

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

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

0

自己解決

ありがとうございます!
API使ってみますね。

投稿2018/02/23 12:53

isumidaichi

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問