Overview - 概要
対象の gem
でいつも決まって使用する設定たちや、
よく使うプロセスをオリジナルに定義したクラスでまとめて、リユースできるようにする。
今回は実際に仕事で必要になった Mechanize
を例として使っています。
スクレイピングは、対象サイトごとに構造が違うので、コードを書き分けないといけませんが、
基本的なフローや動作はほとんど同じなので、可能な部分は再利用します。
ちょっと詰まりましたので、忘れないようにアウトプット!
Contents - 目次
- Intention - 目的
- Examples - 例
- References - 参考文献
- Postscript - あとがき
- Revision - 改訂
2016/01/08 修正
1. Intention - 目的
Mechanize使用時に、いつも共通で行っている設定やよく使うメソッドを
専用クラスで定義して、使いまわせるようにする。
require 'mechanize'
agent = Mechanize.new
agent.user_agent_alias = 'Windows Chrome'
agent.ca_file = "../etc/cacert.pem"
agent.keep_alive = false
agent.max_history = 1
agent.open_timeout = 60
agent.read_timeout = 180
基本的に使用する上記の設定を専用に定義したクラスの initialize
で実行する。
※注意:6行目 (agent. 3行目) の ca_file
は、外部ファイルを指定しているので上記コードコピペでは使用不可。後日別投稿にて解説予定。
2. Examples - 例
失敗例から紹介しますね。
はじめは何も考えずに、さくっと以下のコードにしてしまったんですね。
require 'mechanize'
class MechanizeHelper
def initialize
agent = Mechanize.new
agent.user_agent_alias = 'Windows Chrome'
agent.ca_file = "../etc/cacert.pem"
agent.keep_alive = false
agent.max_history = 1
agent.open_timeout = 60
agent.read_timeout = 180
return agent
end
end
# Call part
agent = MechanizeHelper.new
page = agent.get('http://www.foo.com/bar.htm')
HEY! 楽勝ですね!
Let"s run!
gems/mechanize-2.7.4/lib/mechanize.rb:464:in `get': undefined method `fetch' for nil:NilClass (NoMethodError)
from mechanize_helper_mistake.rb:19:in `<main>'
OMG!
考えてみると、今までこういった使い方をするシーンに出会ったことがありませんでした。
きちんと調べて作りましょう! と調べまして、できましたのが以下のコードです。
require 'mechanize'
class MechanizeHelper < Mechanize
def initialize
super
self.user_agent_alias = 'Windows Chrome'
self.ca_file = "cacert.pem"
self.keep_alive = false
self.max_history = 1
self.open_timeout = 60
self.read_timeout = 180
return self
end
end
agent = MechanizeHelper.new
page = agent.get('http://www.foo.com/bar.htm')
# => Success!
Tada!
やりましたね!
私のケースでは設定値はほとんど変えることがないので、直接書き込んでいます。
しかし、外部ファイルに分けて読み込ませたり、呼び出しごとに引数を設定してもいいでしょう。
あとは他にも良く使うプロセスを考えて、メソッドとして追加していこうと思います。
3. References - 参考文献
Rubyのクラスメソッドとインスタンスメソッドの例
Atuhor : tbpgr様 2015/06/30
tbpgr様の投稿には、いつも助けられております。
今回は、上記を参考にさせていただきました。
ありがとうございました。THX!Pretty awesome!
4. Postscript - あとがき
最後までお読み頂き有難うございました。
間違いや改善点などございましたら、遠慮無くご指摘頂けましたら幸いです。
ご質問やそれ以外のコメントも歓迎です。
Posted by Alex Origin Post
5. Revision - 改訂
2016/01/08 修正
偉大なる little様よりご指摘を頂きまして修正いたしました。すみませんでした。
誤でも、動くは動きますが、ユーザーエージェントなど反映されません。
ユーザーエージェント表示ページを取得して、確認済みです。
正
require 'mechanize'
class MechanizeHelper < Mechanize
def initialize
super
self.user_agent_alias = 'Windows Chrome'
self.ca_file = "cacert.pem"
self.keep_alive = false
self.max_history = 1
self.open_timeout = 60
self.read_timeout = 180
return self
end
end
誤
require 'mechanize'
class MechanizeHelper < Mechanize
def self.initialize
user_agent_alias = 'Windows Chrome'
ca_file = "cacert.pem"
keep_alive = false
max_history = 1
open_timeout = 60
read_timeout = 180
end
end