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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

2387閲覧

スクレイピングしたコードはどこに書けばいいのでしょうか?

renren643

総合スコア279

スクレイピング

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

Ruby

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

Ruby on Rails

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

0グッド

2クリップ

投稿2017/09/28 09:11

編集2017/09/28 09:15

スクレイピングした結果をrailsのviewを通してブラウザに出力したいのですが、どこに記述をしたらいのかわからず困っています。
例えば、

require 'open-uri' require 'nokogiri' url = 'http://www.yahoo.co.jp/' user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36' charset = nil html = open(url, "User-Agent" => user_agent) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) puts doc.css('#topicsfb > div.topicsindex > ul.emphasis > li:nth-child(1) > a').text

を実行するとヤフーのトップページが取得できるのですが、コンソール上でのやり方しかわかりません。

これをviewを通してブラウザに出力したいのですが、どの部分をコントローラーに、どの部分をviewに記述したらいのかわかりません。
一応railsを使ってwebサイトを立ち上げたりしたのですが、練習でツイッター的なサイトを作ってそれをアレンジしただけなので、恥ずかしながら肝心な基礎が抜けていると思います。
例えばputs(1+1)で2が出力されるのでしょうが、それをrailsを通してブラウザ上に「2」と出力したいとき、どうしたらいいのかわかりません。(どの部分をコントローラーに、どの部分をviewに記述したらいのわからない)
いろんなサイトや、海外の動画も見たのですが、rubyのコンソール内で完結しているものばかりでブラウザへの出力方法があるサイトは見当たりませんでした。
おそらく基礎的すぎて説明する必要もないことなのでしょうが、もしわかる方がいれば教えてください。

(一応、こうなんじゃないか?と思いやってみたコードですが、全く違うと思います。というか違いました)
コントローラー

def top require 'open-uri' require 'nokogiri' url = 'http://www.yahoo.co.jp/' user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36' charset = nil html = open(url, "User-Agent" => user_agent) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) end

ビュー

<%= puts doc.css('#topicsfb > div.topicsindex > ul.emphasis > li:nth-child(1) > a').text %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

多分、一番簡単な方法

1.scaffoldコマンドで適当なmodelとControllerとviewを作成します。

2.作成されたControllerの中のindexアクションを書き換えて、indexアクション内でスクレイピングを実行するコードを書く

3.スクレイピング結果をクラス変数(@titleとか適当なクラス変数)に格納する

4.index.html.erbを修正して、<%= @title %>とどこかに埋め込む

scaffoldコマンドわかりますか?
(質問のレベルからすると、おそらくわかってないと思ってます。)

投稿2017/09/28 10:00

mtdsnsk

総合スコア789

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

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

renren643

2017/09/28 10:07

scaffoldコマンドわかります! コントローラーのアクションの中にスクレイピングを実行するコードを書き、その中で@title=puts doc.css('#topicsfb > div.topicsindex > ul.emphasis > li:nth-child(1) > a').text とし、アクションに対応するviewの中で<%= @title %>としてあげれば良いということでしょうか?
mtdsnsk

2017/09/28 11:24

そうです!試してみてください!
renren643

2017/09/28 11:32

回答ありがとうございます。 ・アクションの中身 def top require 'open-uri' require 'nokogiri' url = 'http://www.yahoo.co.jp/' user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36' charset = nil html = open(url, "User-Agent" => user_agent) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) @title= puts doc.css('#topicsfb > div.topicsindex > ul.emphasis > li:nth-child(1) > a').text end ・ビューの中身 <%= @title %> とし、rails sでブラウザを表示しましたが、真っ白でした。。。 どこかおかしな点はあるでしょうか?
mtdsnsk

2017/09/28 11:57

@title= "結果:" + doc.css('#topicsfb > div.topicsindex > ul.emphasis > li:nth-child(1) > a').text これで再度試してみてください!
renren643

2017/09/28 12:13

できました!!!!!!!!本当に感謝します。 ちなみになんですが、なぜ「"結果:" +」を付け加えるだけでできたのでしょうか?
mtdsnsk

2017/09/28 12:37

puts というのが 標準メソッドで、標準メソッドの出力結果が@titleに格納されていました。 doc.css('#topicsfb > div.topicsindex > ul.emphasis > li:nth-child(1) > a').textが空白文字だった場合 単に"結果:"とだけ出るので、出力エラーかスクレイピングの結果がちゃんと取れてないか確認できるのでそのように伝えました
renren643

2017/09/28 13:12

なるほど。わかりました。本当にありがとうございました。
mtdsnsk

2017/09/29 00:31

スクレイピングの結果を貯めておくためのModelを用意して、タスクでスクレイピングを実行して結果をデータベースに書き込み、そのデータを表現するViewを用意して表示するってのが一般的です。
renren643

2017/09/29 00:55

では、普通はスクレイピングの記述はアクション内に書かず、例えばこの場合だとPostモデルなんかを作り、 コントローラーには def top @title=Post.all end とし、 ビューは、そのままで、スクレイピングの記述自体はタスク内に書く。 、、、、というのが一般的ということでしょうか? (タスク、というのは初めて聞いたので、解釈があっているか自信がありませんが。。。。)
mtdsnsk

2017/09/29 05:01

そんな感じです!通常スクレイピングするのであれば、定期的に行いたい場合がほとんどだと思います。URLにアクセスするタイミングで発火するとなると、毎回相手のwebサイトにアクセスしてしまうことになりますし、表示が遅くなってしまいます。 定期的に行いたい処理を登録する時は、taskをcronから呼び出す感じにするのが一般的ですよー
renren643

2017/09/29 07:14

わかりました。自動でやってくれる処理があるんですね。 やって見ます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問