スクレイピングで画像をダウンロードしてみよう

スクレイピングとは、WebページのHTMLを解析して任意の操作を行うことです。だいたいのことはできますが、よく使われるのはimgタグのsrc属性を取得してファイルをダウンロードしたり、フォーム情報を自動的に入力して送信ボタンを押したり、特定のHTMLタグのテキスト情報を取得したりします。

今回はスクレイピングでよく使用される selenium というライブラリをRubyで操作して、当社が提供しているチャットサービス「ChatSquare」ログイン画面 にあるロゴ画像をダウンロードしてみようと思います。

準備

selenium-webdriver のインストール

$ gem install selenium-webdriver

geckodriver のインストール

https://github.com/mozilla/geckodriver/releases

PATHが通っている場所にダウンロードした実行ファイルを配置してください(私は /usr/local/bin にしました)。

ソース

require 'selenium-webdriver'
require 'open-uri'

# 使用するブラウザを指定
driver = Selenium::WebDriver.for :firefox

# ページにアクセス
driver.get('https://chat-square.com/users/login')

# imgのsrc属性を取得
src = driver.find_element(:xpath, '//img[@class="logo"]').attribute('src')

# ダウンロード
open('logo.png', 'wb') do |output|
  open(src) do |data|
    output.write(data.read)
  end
end

driver.quit # ブラウザを閉じる

たったのこれだけです。seleniumでimgタグのsrc属性を取得した後は、Ruby標準のopen-uriを利用してファイルをダウンロードしています。取得したHTMLのimgタグにアクセスするのに以前ご紹介した Xpath を使用しました。

Selenium::WebDriver のメソッドについてはこちらのページを眺めればだいたい把握できます。

https://github.com/SeleniumHQ/selenium/blob/9ac652d4975e0cea3ea8e0ffe60772c7ef64b513/rb/lib/selenium/webdriver/common/driver.rb

http://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/Driver.html

スクリーンショットを撮るだけなら

driver.save_screenshot('screenshot.png')

とするだけなのでとても簡単です。

selenium の他にもブラウザを実際に起動せずに高速にスクレイピングする capybara-webkit
poltergeist などがあります。自分の用途にあった使い方があると思うので、ぜひ活用してみてください。