読者です 読者をやめる 読者になる 読者になる

でたぁっ 感動と失敗の備忘録

データ解析を担当することになったサラリーマンの備忘録

Ruby + Mechanize でネット上の画像を保存する

Ruby

 業務でインターネット上にある画像ファイルを収集する必要があったので、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") # 保存する


保存された画像はこちら
f:id:deta:20131009220237j:plain

あとは、例外(エラー)処理を追加したり工夫すればよい

最後に、API(Amazon Product Advertising API)でも ItemLookup などで画像参照先のURLを得ることができるが、実際にはURLを得ることができない商品が多いのでクロールして保存した方が良いと思う。