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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

3275閲覧

スクレイピング用Rubyスクリプトの使い方について

mannnakakunn

総合スコア24

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2015/12/15 09:23

編集2015/12/15 12:03

Rails,スクレイピング初心者のものです。

###前提・実現したいこと

APIを使わないYoutubeのスクレイピング機能の実装。
viewから@Youtube.id(1).titleのように呼び出せるようにしたい。

###発生している問題・エラーメッセージ

以下のようなソースコード(1)で、ターミナル上で実行すると、タイトル等の取得は成功しているようです。ですが、これをモデルに対してセーブをして、Railsのビューにてこれを@Youtube.id(1).title,@Youtube.id(1).descriptionのようにして取得する方法についてはわからず、ご指導いただければと思い質問しました。

自分でやってみたこととしては、ソースコード(2)のようなものです。
そもそもこうした方向性自体が間違っているのか、それともコードのディテールの問題なのかがわかりません。

これだと
/scrape.rb:75:in `block in <main>': uninitialized constant Entry (NameError)
が発生してしまいます。

結果はuninitialized constant Entry (NameError)になってしまっています。

**__ (追記)ソースコードの場所:app/models/scrape.rb
__ **

###ソースコード⑴

Ruby

1 2# encoding: utf-8 3 4# URLにアクセスするためのライブラリの読み込み 5require 'open-uri' 6 7# Nokogiriライブラリの読み込み 8require 'nokogiri' 9require 'uri' 10 11# 前半部では、検索ワードに関連するリンクの一覧を取得する。 12 urls = [] 13 search_term = URI.encode("キーワード") 14 url="https://www.youtube.com/results?search_query=#{search_term}" 15 doc=Nokogiri::HTML(open(url)) 16 elements=doc.xpath("//h3[@class='yt-lockup-title ']/a") 17 elements.each do |a| 18 code = a.attributes['href'].value 19 urls << "https://www.youtube.com" + code if code.include?('watch') 20 end 21 22# 後半部では、リンク先内容の出力と、文章整形。 23 urls.each do |url| 24 doc =Nokogiri::HTML(open(url),nil,"UTF-8") 25 title = doc.xpath("//h1['watch-headline-title']/span").text.gsub(/¥n/,'') 26 description = doc.xpath("//p[@id='eow-description']").text 27 puts title 28 puts description 29 end

###ソースコード(2)

Ruby

1# encoding: utf-8 2 3# URLにアクセスするためのライブラリの読み込み 4require 'open-uri' 5 6# Nokogiriライブラリの読み込み 7require 'nokogiri' 8require 'uri' 9 10# 前半部では、検索ワードに関連するリンクの一覧を取得する。 11 12 urls = [] 13 search_term = URI.encode("キーワード") 14 url="https://www.youtube.com/results?search_query=#{search_term}" 15 doc=Nokogiri::HTML(open(url)) 16 elements=doc.xpath("//h3[@class='yt-lockup-title ']/a") 17 elements.each do |a| 18 code = a.attributes['href'].value 19 urls << "https://www.youtube.com" + code if code.include?('watch') 20 end 21 22# 後半部では、リンク先内容の出力と、文章整形、そしてモデルへの保存。 23 24 urls.each do |url| 25 entry=Entry.new 26 entry.title = doc.xpath("//h1['watch-headline-title']/span").text.gsub(/¥n/,'') 27 entry.description = doc.xpath("//p[@id='eow-description']").text 28 entry.save 29 end 30

ご指導宜しくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)

Rails 4.2
ruby 2.2.2

修正しました。

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

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

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

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

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

sutonea

2015/12/15 10:39 編集

ソースコード(2) の説明文の区切りに誤りがあるようですので、修正をお願いします。 ソースコード(2) のファイルパスを教えてください。ソースコードの名前や保存場所に問題があるかもしれません。
guest

回答1

0

ベストアンサー

修正ありがとうございます。


uninitialized constant Entry (NameError) の解消方法について

原因:
Rails を使わずに app/models/scrape.rb を実行しているため

解決法:
コンソールから scrape.rb を実行する場合は、
Rails のルートディレクトリで下記のように実行してください。

bash

1./bin/rails runner app/models/scrape.rb

理由:
app/models 配下のクラスが自動的に読み込まれるのは、Rails の仕組みによるものです。
よって、通常の ruby プログラムと同じような実行方法では、クラスの自動読み込みは行われません。

投稿2015/12/15 12:45

sutonea

総合スコア207

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

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

mannnakakunn

2015/12/16 11:54

Shunsuke_Ishige様 ご回答ありがとうございます。 2件質問です。 ①ターミナルからscrape.rbを実行する場合のコードを rails_projectsフォルダ下の、rails_app(アプリケーションのルート)の階層において実行すると以下のエラーが発生してしまいました。 /Users/username/rails_projects/rails_app/vendor/bundle/ruby/2.2.0/gems/railties-4.0.6/lib/rails/commands/runner.rb:53:in `<top (required)>': undefined local variable or method `app' for main:Object (NameError) 対処方法をご指導願います。 ②rails runner appのようにスペースを含んだフォルダ命名は実行の際に影響を及ぼさないのでしょうか。 宜しくお願いします。
sutonea

2015/12/16 13:06 編集

昨日私が書き込んだ下記のコマンドについてです。 ./bin/rails runner app/models/scrape.rb これは、 ./bin/runner に引数として runner と app/models/scrape.rb を渡して実行しています。 実行プログラムと引数を区切るためにスペースを挿入しています。 フォルダ名にはスペースは含まれていません。
sutonea

2015/12/16 13:27

追記です。 コマンドラインで実行するサンプルなどを見ると、 入力内容がスペースで区切られている場合があると思います。 こういったものも、実行プログラムと引数を区切るためにスペースを利用しています。 ls コマンドを例に取ります。 下記のように、プログラム名のみで実行したり... ls 下記のように、引数をひとつ渡したり... ls app 下記のように、引数をふたつ渡したりできます。 ls app bin つたない説明で申し訳ありません。 Linux や、Windows コマンドプロンプトの入門サイトを参考にされるとよいかもしれません。。
mannnakakunn

2015/12/16 22:22

Shunsuke_Ishige様  ご回答ありがとうございます。 Rails内ではrails generateやrails destroyなどと同様、rails runnerという機能があるのですね。 ./bin/rails runner app/models/scrape.rb を実行すると以下のようなエラーが出てしまう点については解決が難しいのでしょうか? /Users/user/.rbenv/versions/2.2.2/lib/ruby/2.2.0/psych.rb:464:in `initialize': No such file or directory @ rb_sysopen - rails_projects\rails_app\config\database.yml (Errno::ENOENT) ご指導お願いします。
sutonea

2015/12/16 22:33

このトピックでの主題とは異なっているため、別途質問を作成してください おそらく database.yml がないのが原因です
mannnakakunn

2015/12/17 11:09

もう一度コードを精査したところ、余計な一文があったため、エラーが発生していた模様です。rails runner の引数として実行すれば、動いているようです。お手数おかけしまして申し訳ございません。Shunsuke_Ishige様、ご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問