Ruby
rubygems
Nokogiri
scraping
Webスクレイピング

Rubyで画像収集を行う【3】検索結果の取得

目次

1:検索条件の入力 
2:検索結果の取得 
3:画像の取得と保存 ←いまここ
つづく

前回のおさらい

【2】検索結果の取得 では、画像の元URLを配列で取得した。
今回はそれらをもとに、実際に画像を保存する

早速始めよう

def save_image(url)
  #その日の名前でディレクトリを作成
  dn = DateTime.now
  dt = dn.year.to_s + dn.mon.to_s + dn.day.to_s + "\\"
  #僕はカレントディレクトリにあるimgフォルダのの中に格納している
  dirName = "\img\\" + dt
  #同名のものが既にない場合のみディレクトリを作成
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)


  #前回取得したurlにあるファイル名を取得
  fileName = File.basename(url)
  filePath = dirName + fileName

  #?などを含む名前はファイルにつけられないので変更
  if fileName.include?('?')
    dn = DateTime.now
    fileName='img' + dn.hour.to_s + 'h' + dn.min.to_s + 'm' + dn.sec.to_s + 's' + '.jpg'
  end

  #同名のファイルがある場合は変更
  if File.exist?(filePath)
    dn = DateTime.now
    fileName='img' + dn.hour.to_s + 'h' + dn.min.to_s + 'm' + dn.sec.to_s + 's' + '.jpg'
  end

  #改めて最終的なファイルパスを設定
  filePath = dirName + fileName

  #ファイルパスを出力  
  p filePath

  # 指定したパス(自分のディレクトリ)を開いて
  open(filePath, 'wb') do |output|
    #urlを開いて書き込み(保存)
    open(url) do |data|
      output.write(data.read)
    end
  end
end

コメント

save_image関数で画像を保存する部分を書きました。
が、見てわかるように保存する部分は最後のとこだけで、
それ意外の前半部分はディレクトリの確認や
ファイル名に問題がないようにしています

一応補足ですが、この関数は各画像URLに対して1回呼ばれるので、
このプログラム内での変数urlは配列ではなく1つです。