業務でMechanizeを使ったスクレイピングをする機会があり、RubyプロジェクトをBundlerで管理する手順を共有します。
Bundlerを使ってgemを管理するメリットは以下参照
https://blog.tokoyax.com/entry/ruby/bundler
Bundlerをインストール
$ gem install bundler
Bundlerをグローバルインストールします。
Rubyプロジェクトを作成する
$ mkdir ruby_project
$ cd ruby_project
Rubyプロジェクトを作成するためのフォルダを作成して、移動します。
Bundler を使った gem のローカルインストール
$ bundle init
これで、プロジェクトのルートにGemfileが作成されます。
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
# gem "rails"
# 以下のgemを追加
gem 'mechanize'
作成されたGemfileにgem 'mechanize'
の記述を追加します。
$ bundle install --path=vendor/bundle
Bundler で Gemfile に書かれている gem をインストールします。
新たにGemfile.lockが作成されて、その中にインストールされたgem一覧が記述されています。
これで、gemのローカルインストールが完了しました。
gemがローカルインストールされているか確認
gemがグローバルインストールされているか、ローカルインストールされているかは以下の方法で検証できます。
$ gem list | grep mechanize # グローバルインストールされているgem一覧
$ bundle exec gem list | grep mechanize # ローカルインストールされているgem一覧
mechanize (2.7.6)
bundle exec
を付けた方だけ、mechanize (2.7.6)
が表示されているのでローカルでのみ
mechanize
のインストールが完了しています。
スクレイピングするRubyコードの作成
最後に、Rubyコードを書いていきます。
mkdir scraper
vi scraping.rb
Rubyファイルを編集します。
require 'mechanize'
agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.search('title')
puts elements
bundle exec ruby scraper/scraping.rb
<title>Qiita</title>
<title>Qiita</title>
補足
ちなみに、bundle exec
を実行コマンドの前につけることでローカルのgemが適用されます。
bundle exec
を実行コマンドの前に付けなかった場合、グローバルのgemが適用され、グローバルgemにはmechanize
をインストールしていないためエラーになります。
ruby scraper/scraping.rb
/Users/tatsuminaoki/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mechanize (LoadError)
from /Users/tatsuminaoki/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from scraper/mansion_review.rb:1:in `<main>'
これで、RubyプロジェクトをBundlerで管理することができました。