2 flat logo on transparent 256
2019-02-10

Rubyでサイトをスクレイピングし、ローカルに画像を保存する

20190210p

サイトスクレイピングは指定したサイトのURL構造を解析し、指定した要素を抜き出す事が可能です。

これにより、対象の画像URLやページのタイトルなどを抜き出す事ができ、今回は海外のフリー素材のサイトからビジネスに関する画像をローカルに保存します。

対象サイト

検証したRubyバージョンは2.41です。

関連記事

Python3で画像をスクレイピングしてローカルに保存する|BeautifulSoupを利用

Ruby on Railsで外部APIを利用して、簡単なアプリケーションを作成する

Rubyで画像をスクレイピングする

今回はselenium-webdriverとopenuriredirectionsの2つのgemを利用します。

また、seleniumを利用する際はドライバも必要になります。

gem install open_uri_redirections
gem install selenium-webdriver

Fetching: rubyzip-1.2.2.gem (100%)
Successfully installed rubyzip-1.2.2
Fetching: childprocess-0.9.0.gem (100%)
Successfully installed childprocess-0.9.0
Fetching: selenium-webdriver-3.141.0.gem (100%)
Successfully installed selenium-webdriver-3.141.0
Parsing documentation for rubyzip-1.2.2
Installing ri documentation for rubyzip-1.2.2
Parsing documentation for childprocess-0.9.0
Installing ri documentation for childprocess-0.9.0
Parsing documentation for selenium-webdriver-3.141.0
Installing ri documentation for selenium-webdriver-3.141.0
Done installing documentation for rubyzip, childprocess, selenium-webdriver after 5 seconds
3 gems installed

以下からグーグルドライバをインストール

グーグルドライバ

※今回はmac用をインストールしました。

グーグルドライバのPathを通す

ダウンロードしたchromedriverをRubyを保存している環境に移動します。

今回はMacのsmt環境にchromedriverを保存しました。

また、rbenvでRubyを管理しているので、 /Users/smt/.rbenv/shimsへchromedriverを配置します。

$ which ruby
/Users/smt/.rbenv/shims/ruby

$ mv chromedriver /Users/smt/.rbenv/shims

Rubyで画像をスクレイピングする際のサンプルコード

以下がサンプルコードです。 必要な解説はコメントを御覧ください。

require 'selenium-webdriver'
require 'open_uri_redirections'

def get_images
  # chromeでselenium-webdriverを起動
  driver = Selenium::WebDriver.for :chrome
  # 検索対象のURL
  driver.navigate.to 'https://www.freepik.com/search?query=business%20&sort=popular'

  # サイトのimg要素のURLを取得
  driver.find_elements(:xpath, '//img')
  elements = driver.find_elements(:class, 'landscape')

  url_arrays=[]
  # サイトのimgURLを配列に追加
  elements.each do |element|
    url_arrays << element.attribute("data-src")
  end
  # create_imagesへURLが格納されたurl_arraysを渡す
  create_images(url_arrays)
end

def create_images(urls)
  urls.each_with_index do |url, i|
    #ファイル名を変更と同時に拡張子を設定
    filename = "test#{i}.jpg"
    #ファイルを書き込み
    open(filename, 'wb') do |file|
      open(url) do |data|
        p file.write(data.read)
      end
    end
  end
end

get_images

以上になります。

その他関連記事

Rubyの練習問題:条件分岐編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:配列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:文字列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:ハッシュ編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:繰り返し処理編|初心者・独学者向け入門コンテンツ

Gitの基本コマンドと覚えておくと効率が上がるコマンド一覧

前の記事
次の記事