自動ZIPでくれスクリプト第2回。
画像検索APIを叩いて帰ってきたJSONデータの例が↓(公式ドキュメントより)
-------------------------------------------------------------------------------------------------
{ "SearchResponse":{ "Version":"2.0", "Query":{ "SearchTerms":"xbox site:microsoft.com" }, "Image":{ "Total":92, "Offset":0, "Results":[ { "Title":"Microsoft Deutschland GmbH auf der CeBIT 2006.", "MediaUrl":"http:\/\/www.microsoft.com\/germany\/presseservice\/images\/pressemappen\/cebit2006\/Xbox-360_5.jpg", "Url":"http:\/\/www.microsoft.com\/germany\/presseservice\/service\/pressemappen\/cebit2006.mspx", "DisplayUrl":"http:\/\/www.microsoft.com\/germany\/presseservice\/service\/pressemappen\/cebit2006.mspx", "Width":3259, "Height":3264, "Thumbnail":{ "Url":"http:\/\/ts2.images.live.com\/images\/thumbnail.aspx?q=2847678867077&id=b3ba5b922c04d322d937275335c8cf75", "ContentType":"image\/jpeg", "Width":159, "Height":160, "FileSize":2624 } }, ...
getしたい画像データがどこに入っているかというと
"MediaUrl" ここ。
というわけでMediaUrlが.jpg or .jpegだったらDLしてきてローカルに保存。200件終わったらまとめてzipにする。
zipに固める為gem install rubyzipしておく
rubyでの実装は 橋本商会 いかにしておっぱい画像をダウンロードするか〜2012 をRubyで書いた様を
--------------------------------------------------------------------------------------------------------------------
# -*- encoding: utf-8 -*- require 'rubygems' require 'open-uri' require 'json' require 'uri' require 'kconv' require 'zip/zipfilesystem' APP_ID = '' #APPIDは別途取得 API_URI = 'http://api.bing.net/json.aspx' dir = './img/' Dir.mkdir dir unless File.exists? dir page_count = 0 dl_count = 0 query = "Yukie Nakama" loop do if page_count == 4 #50 * 4 DLしたら打ち止め break end url = API_URI + '?' + "AppId=" + APP_ID + "&" + "Version=2.2&Market=ja-JP&Sources=Image&Image.Count=50&Image.Offset=" + URI.encode((page_count * 50).to_s) + "&Adult=off&Query="+ URI.encode(query.to_s) search_result = JSON.parse(open(url).read.toutf8) search_result['SearchResponse']['Image']['Results'].each do |entry| if /\.jpe?g$/ =~ entry['MediaUrl'] then #jpg or jpegを拾う dl_count += 1 file_name = dl_count.to_s + ".jpg" #ファイル名は 数字 + jpg path = "#{dir}/#{file_name}" puts "No #{dl_count}:Start" begin #imgをDLしてローカルに保存 img = open(URI.encode entry['MediaUrl']) img.close puts "DL Success" File.rename(img.path, path) rescue puts "DL Fail" next end else next end end page_count += 1 end #画像DLここまで #zipで圧縮 Zip::ZipFile.open("./#{query}.zip", Zip::ZipFile::CREATE) do |zip| Dir.open(dir).each{|f| next if f == "." or f == ".." #ディレクトリの下のみが対象 f = File.expand_path(f,dir) zip.add(File.basename(f), f) } end #DLしたファイルの削除 Dir.open(dir).each{|f| next if f == "." or f == ".." #ディレクトリの下のみが対象 f = File.expand_path(f,dir) File.unlink(f) } Dir.rmdir(dir)
これでYukie Nakama.zipができて生活がはかどった。
クエリを変えれば壁紙収集ぐらいはできるのかな。
0 件のコメント:
コメントを投稿