LoginSignup
28
41

More than 3 years have passed since last update.

【rails】webサイトからスクレイピングしたデータをデータベースに保存する方法

Last updated at Posted at 2019-12-27

はじめに

初学者がポートフォリオ作成でハマったことをメモします。

今回はスクレイピングをする為にMechanizeというgemを使用しました。
Nokogiriというgemもスクレイピングに使われるみたいです。

環境

Ruby 2.6.3 ,Rails 5.2.4

やりたいこと

webサイト(単一のページ)から特定の要素を抜き出してデータベースに保存する。

手順

gemをインストール

Gemfile
gem 'mechanize'
ターミナル
$ bundle install



クラスの作成

スクレイピングを実行するコードを書く為にモデルクラスを作成。

ターミナル
$ rails generate model Scraping

mechanizeをrubyファイルで利用するためにrequire 'mechanize' をファイルの先頭に記述。

scraping.rb
require 'mechanize'



クラス内にメソッドを記述

scraping.rb
def self.scrape
      agent = Mechanize.new                  #agentは任意の変数
      page = agent.get("https://www......")  #pageは任意の変数 getの引数はサイトのURL
      elements = page.search('div.idxcol a') #div.idxcol aは取得したい要素  elementsは任意の変数
      elements.each do |element|
        fish = Fish.new                      #Fishは任意のクラス、fishは任意のインスタンス
        fish.name = element.inner_text
        fish.save
      end
    end
end

agentという変数にMechanizeクラスのインスタンスを代入。

ウェブサイトからHTML情報をgetというメソッドで取得し、pageという変数代入。

任意の変数elementsに、ページ内でほしい要素に付いているクラス名やタグ名を指定。

eachメソッドを使ってelementsから要素を一つづつ取り出だす。

Fishクラスからインスタンスを作成。

inner_textメソッドで要素からテキストのみを取得してしてfishテーブルのnameカラムに代入。
今回はFishクラスのnameカラムにスクレイピングした値を代入したい。
(Fishクラス、fishesテーブル、nameカラムは事前に作成しています。)

最後にsave。


ターミナルで定義したクラスメソッドを実行

ターミナル
$ bundle exec rails console
pry(main)>Scraping.scrape

これでデータが入っているはずです。
  
以上

最後に

誰かのお役にたてれば幸いです。
間違えている部分があればコメントお願いいたします。

参考にした記事
https://qiita.com/4npei/items/2dc18487d3103cb3e5a6
https://qiita.com/takuyanin/items/01256773e1cbfc84f51a
https://freesworder.net/ruby-on-rails-scraping/

28
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
41