rails 独学して軽くにちゃんまとめつくる

rails でクローラーを使ってで画像を収集してモデルに保存する

ruby で画像収集する記事はたくさんあるけど rails に実装して、モデルに保存するまでのことは書いてくれてなかったので困ったこともあり、書く。 Nokogiri つかうのかなーと思ったけどそこまで大層なことはせずとも open-uri だけで十分だった。

まあまずコードを書く。

require 'open-uri'


pic_url =  "http://imgcc.naver.jp/kaze/mission/USER/20160510/69/6685859/20/512x640x0d5b1c4c7f720f698946c7f6.jpg"

kakuchosi = File.basename(pic).match(/(\..*)/)
fileName = pic.hash.abs.to_s 
dirName  = "app/assets/images/"
filePath = dirName + fileName + kakuchosi.to_s 
        
open(filePath, 'wb') do |output|     #保存するパス名
  open(pic) do |data|                #保存したい画像のリンク
    output.write(data.read)          
  end
end

一つずつ説明していく。

pic_url はその名のとおり画像のurlである。こんかいは Naverから「る鹿」さんの画像を起用させてもらった。ページのURL ではなく、ちゃんと画像のURL を指定しよう

f:id:mooooooooooriiiiii:20170320193005j:plain

kakuchosi もその名のとおり拡張子のことだ。 jpgとかgif とかの画像の拡張子を格納する変数のことだ。そのなかのFile.basename(pic)というのは pic という変数にある URL の最後の部分を取得するものだ。具体的には

http://imgcc.naver.jp/rukasan.jpg なら rukasan.jpg という箇所を返すメソッドだ。今 pic には http://imgcc.naver.jp/kaze/mission/USER/20160510/69/6685859/20/512x640x0d5b1c4c7f720f698946c7f6.jpg というリンクが入ってるから 512x640x0d5b1c4c7f720f698946c7f6.jpg という値がかえってくる。そして拡張子 .jpg がほしいのだから . とその後ろの文字を取得するという意味で正規表現を使い .match(/(\..*)/ とした。

fileName = pic.hash.abs.to_s というのは、ただハッシュ値がほしかったからつけた。同じ名前がかぶったら取得できないかもしれないから。ということで文字列に .hash とつけたら数字に変えてくれてかつ同じ文字でも違う値を返してるメソッドである .hash をつくった。 abs は絶対値にしてくれるもの。 .hash は負の値をも返すときがあるから面倒なので。.to_s は数値を文字列になおしてくれるメソッド。

dirName  = "app/assets/images/"

これはまあまあ大事。ダウンロードしてきた画像の場所を指定するもの。後で使うからさきに定義しておいた。assets の images にいれるためのコードを絶対パスで指定しておいている。

filePath = dirName + fileName + kakuchosi.to_s 

これはいままで作ってきたのをくっつける。例えばこんな形になる app/assets/images/345592834532.jpg 保存するときに使のでね。

open(filePath, 'wb') do |output|     #保存するパス名
  open(pic) do |data|                #保存したい画像のリンク
    output.write(data.read)          
  end
end

ここから本番。2つの open が続いているが、1つめは保存するパスを指定するほうのopen で自分のrailsワークスペースのパスだ。2つめのが保存したい画像のパスでオンライン上のどこかのサーバーのパスだ。

ひとつめに先ほどつくった filePath を入れて置き、2つめに pic をいれる。で、自分の保存したい場所に write で書き込む。イメージとしては、空の何もない jpg ファイルを一つ目の open で作っておいて、その後 write で pic で拾ってきた画像ファイルを書き込んでいる。

これでコードの解説は完了。これを rails のコードに入れればオッケー。さしあたりコントローラーの create メソッドにでも挟み込んでおいて、実際る鹿さんの画像がダウンロードできていることをたしかめてみよう。

でつぎに画像を表示する。image_tag をやればいいのだが、モデルに fileName + kakuchosi.to_s という名前で保存しておいて、 image_tag の第一引数にいれる。そしたら表示できる。