Rubyスクレイピング Mechanize の設定をクラス定義でまとめて使い回す : 連載-2

Overview – 概要

対象のgemでいつも決まって使用する設定たちや、
よく使うプロセスをオリジナルに定義したクラスでまとめて、リユースできるようにする。
今回は実際に仕事で必要になったMechanizeを例として使っています。

ちょっと詰まりましたので、忘れないようにアウトプット! 😐

Contents – 目次

1. Intention – 目的
2. Examples – 例
3. References – 参考文献
4. Revision – 改訂

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!


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 self.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 – 参考文献

📚 LINK : Qiita – Rubyのクラスメソッドとインスタンスメソッドの例
👤 AUTHOR : tbpgr様 2015/06/30

今回は上記を参考にさせていただきました。
ありがとうございました。THX! 😆 Pretty awesome!

4. Revision – 改訂

Qiitaにて、偉大なるプログラマー様からご指摘がございました。
大変すみません。謹んで修正いたしました。


  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

P.S.
このブログのデザインを早く作りたいですね。
でも忙しいですね 😿

そして、ワードプレスのemojiが可愛いことを今知りました。
私はAndroidのデザインが一番かわいいと思います。
🔗 LINK : Emojipedia
Emoji

投稿者:

Alex.js

プログラマーのアレックスです。 日本人の母と、アメリカ人の父の間に生まれました。 出身は、ITの聖地シリコンバレーのあるサンタクララです。 Hi. I'm Alex.J.Smith. It's Japanease American born in Santa Clara CA.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です