Ruby + Mechanize でネット上の画像を保存する
業務でインターネット上にある画像ファイルを収集する必要があったので、Ruby + Mechanize を使い保存しまくった際のメモ。Mechanize はサーバにアクセスするための「Web ブラウザ」を表現するクラス。このクラスのオブジェクトを操作してウェブにアクセスできる。便利なライブラリの1つ。アマゾンで購入できる「データサイエンティスト養成読本」の画像を保存するRubyのコードは次の通り。※環境はWin7 32bit、Ruby1.9.3 p448、Mechanize2.7.2
# -*- encoding: Shift_JIS -*- require 'rubygems' require 'mechanize' agent = Mechanize.new agent.keep_alive = false agent.max_history = 1 agent.open_timeout = 60 agent.read_timeout = 180 targetASIN = "4774158968" # ASINコード targetURI = "http://amazon.jp/dp/" + targetASIN.chomp # URLの編集 puts targetURI agent.get(targetURI) #webPageの取得 puts agent.page.search('title').inner_text # タイトル src = agent.page.search('//*[@id="prodImage"]').at('img')['src'] # 商品画像 puts src agent.get(src).save_as("./img/" + targetASIN.chomp + ".jpg") # 保存する
Mechanize をインストールしていない場合は
gem install mechanize
それぞれの部分の意味は次のとおり
agent = Mechanize.new agent.keep_alive = false agent.max_history = 1 agent.open_timeout = 60 agent.read_timeout = 180
Mechanizeインスタンスを作り、各種設定を行っておきます。
プロキシ環境の場合は次のコードを追加すれば良い
agent.set_proxy('アドレス',ポート,'ユーザーID','パスワード')
アマゾンの商品はASIN(Amazon Standard Identification Number)で管理されており商品ページは下記ルールで表示することができる。
http://www.amazon.jp/dp/4774158968/ http://www.amazon.jp/gp/product/4774158968/ http://www.amazon.jp/o/ASIN/4774158968/ http://amazon.jp/dp/4774158968/ http://amazon.jp/gp/product/4774158968/ http://amazon.jp/o/ASIN/4774158968/
したがってアクセスするURLは下記のようにした
targetASIN = "4774158968" # ASINコード targetURI = "http://amazon.jp/dp/" + targetASIN.chomp # URLの編集 puts targetURI
指定したURLにアクセスする
agent.get(targetURI) #webPageの取得
保存する画像は、searchでxpathを指定し参照先のsrc(url)を取得する必要がある。最近のブラウザは要素確認できるからその機能を使えば簡単に把握できる。他にもさまざまな指定方法があり画像が複数ある場合には配列処理も可能。
src = agent.page.search('//*[@id="prodImage"]').at('img')['src'] # 商品画像 puts src
得たimgタグのsrc(url)を指定して保存を行う。この場合はカレントディレクトリにあるimgフォルダにASINコード.jpgで保存される。※すでに同一名のファイルがあった場合は勝手に連番が付加され保存される。
agent.get(src).save_as("./img/" + targetASIN.chomp + ".jpg") # 保存する
保存された画像はこちら
あとは、例外(エラー)処理を追加したり工夫すればよい
最後に、API(Amazon Product Advertising API)でも ItemLookup などで画像参照先のURLを得ることができるが、実際にはURLを得ることができない商品が多いのでクロールして保存した方が良いと思う。