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

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

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

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

Ruby

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

2675閲覧

【Ruby on Rails】スクレイピングしたデータをActiveRecordに保存したい

k-taku

総合スコア20

スクレイピング

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

Ruby

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2017/03/12 10:42

###前提・実現したいこと
現在ゲームのキャラクターの能力値をnokogiriでスクレイピングしてきて、そのデータをrailsのActiveRecordに保存し、いつでもそのデータを見ることができるアプリを制作しています。

対象のページから欲しいデータは無事スクレイピングできたのですが、取得したデータをどのようにActiveRecordに保存すれば良いか分からず、詰まっています...

  • スクレイピングで取ってきたデータをActiveRecordに入れる方法を教えていただけると嬉しいです。

よろしくお願いします。

###該当のソースコード

・スクレイピング用のruby

ruby

1require 'nokogiri' 2require 'open-uri' 3require 'open_uri_redirections' 4 5doc = Nokogiri::HTML(open('対象ページのURL')) 6 7(1..302).each do |line| 8 doc.xpath("//*[@id='tablepress-15']/tbody/tr[#{line}]").each do |node| 9 name = node.css('td[2]').inner_text.to_s #キャラクター名 10 hit_point = node.css('td[4]').inner_text.to_i #以下はキャラクターの能力値です 11 attack = node.css('td[5]').inner_text.to_i 12 block = node.css('td[6]').inner_text.to_i 13 contact = node.css('td[7]').inner_text.to_i 14 deffence = node.css('td[8]').inner_text.to_i 15 speed = node.css('td[9]').inner_text.to_i 16 sum = node.css('td[10]').inner_text.to_i 17 end 18end

・migrationファイル

class CreatePokemons < ActiveRecord::Migration def change create_table :pokemons do |t| t.string :name #キャラクター名 t.integer :hit_point #以下能力値 t.integer :attack t.integer :block t.integer :contact t.integer :deffence t.integer :speed t.integer :sum t.timestamps null: false end end end

情報不足でしたらいつでもおっしゃってください。

###補足情報

  • ruby
  • Ruby on Rails

拙い説明で申し訳ありませんがご回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

どういったワークフローを想定しているのかはわかりませんが:

  • モジュールとして定義することで、Rails が関知している範囲内のどこでも処理を呼び出せるようにする(「読み込み即実行」にしない)
  • どこか...コントローラ、Cron, Sidekiq などの定期実行...で処理を実際に呼び出す

ということを想定して、書いてみるといいかもしれません

ruby

1module PokemonScraper 2 class << self 3 def scrape 4 scrape_data = 5 (1..302).to_a.map do |line| 6 # doc.xpath("//*[@id='tablepress-15']/tbody/tr[#{line}]").each do |node| 7 doc.xpath("//*[@id='tablepress-15']/tbody/tr[#{line}]").map do |node| 8 { 9 name: node.css('td[2]').inner_text.to_s, #キャラクター名 10 hit_point: node.css('td[4]').inner_text.to_i, #以下はキャラクターの能力値です 11 attack: node.css('td[5]').inner_text.to_i, 12 block: node.css('td[6]').inner_text.to_i, 13 contact: node.css('td[7]').inner_text.to_i, 14 deffence: node.css('td[8]').inner_text.to_i, 15 speed: node.css('td[9]').inner_text.to_i, 16 sum: node.css('td[10]').inner_text.to_i 17 } 18 end 19 end 20 scrape_data.flatten 21 end 22 end 23end 24 25# 実際に利用するとき 26scrape_data = PokemonScraper.scrape 27 28# 仮にデータをそのまま流し込みたいとした場合 29scrape_data.each do |params| 30 Pokemon.create(params) 31end

すこし気になったのは、「1 ~ 302」とは何の範囲なのか、というところです(あえて代入して、変数名として説明があるといい。あるいはコメントの追記)

なにか参考になれば幸いです

Links

投稿2017/04/20 12:25

gouf

総合スコア2321

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問