capybaraを使ってWebページをスクレイピングする(テストじゃなくて)


capybaraはWebアプリケーションのテスト用のライブラリとして有名ですが、テスト目的でなく、単にスクレイピング用のツールとしても使えます。この記事ではcapybara+selenium+chromeヘッドレスを使用してWebページをスクレイピングするサンプルを紹介します。

動作環境

  • Mac OS High Sierra 10.13
  • ruby 2.5

capybaraのセットアップ

まずはcapybaraのセットアップからです。selenium-webdriver経由でヘッドレスchromeを操れるように設定します。最初に必要なライブラリをhomebrewでインストールしておきます。

📄Gemfile
$ brew install chromedriver

次に必要なgemをインストールするため、Gemfileを作ります。

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'capybara'
gem 'selenium-webdriver'
gem 'launchy'

lauchyというのはスクリーンショットを取ったと同時にプレビュー.appで開くようにしてくれるgemです。いつも通りbundle installしてください。

これでcapybaraを使用する準備ができたので、capybaraの初期設定をします。

📄scrape.rb
require 'capybara'
require 'selenium-webdriver'

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app,
    browser: :chrome,
    desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
      chrome_options: {
        args: %w(headless disable-gpu window-size=1280,800),
      },
    )
  )
end
Capybara.javascript_driver = :selenium

chrome_options の詳しい説明などは こちら で確認してみてください。

ひとまず、これでcapybaraを使用する準備が整いました。

使ってみる

ではgoogleのトップページにアクセスして、スクリーンショットを保存してみましょう。先程のscrape.rbに次のコードを追記します。

📄scrape.rb
...

def start_scraping(url, &block)
  Capybara::Session.new(:selenium).tap { |session|
    session.visit url
    session.instance_eval(&block)
  }
end

start_scraping 'https://www.google.com/' do
  # ここにスクレイピングのコードを書く
  p title #=> "Google"
  save_and_open_screenshot
end

Capybara::Sessionを開始して、Googleのページのスクリーンショットを保存します。ヘッドレスなので実際にChromeは可視化しませんが、ちゃんとアクセスできているのがスクリーンショットを見れば分かると思います。

あとは煮るなる焼くなり好きにして下さい。capybaraの使い方に関しては解説サイトもたくさんあるので、ググってみてください。

github

サンプルプロジェクトをpushしていますので、よかったら使ってください。

itmammoth/capybara-bootstrap

関連する記事


コメントする

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください