自動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 件のコメント:
コメントを投稿