▼ 2009/04/08(水) Rubyで画像収集でも
Rubyのhpricotを使って画像系のサイトにアクセスして、HTMLの解析をして画像を保存するスクリプトを書いてみた。おかげで画像系のサイトを徘徊するのが便利になったので晒しておきます。サイトを徘徊ってか、ローカルに画像を保存しちゃうから徘徊しなくなって便利になったってことだけど・・・それにどうせ徘徊して手動で保存なんてするよりはスクリプトで一気にやっちゃえみたいな。ちょっとグレーなツールな気もする・・・
#!/usr/bin/env ruby
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'
base_path = '/Users/chibi/img/'
urls = [
"",
]
$stdout.sync = true
def get_image(url, path)
puts url
puts path
open(path, 'wb') do |file|
open(url) do |data|
file.write(data.read)
end rescue return false
end
end
urls.each do |url|
image_urls = []
doc = Hpricot(open(url).read)
title = (doc/:title).inner_html.toutf8.strip
#puts title
save_path = File.join(base_path, title)
Dir.mkdir(save_path) unless File.exist?(save_path)
(doc/"a[@href$='.jpg']").each do |link|
#image_title = link.inner_html.toutf8
image_url = link[:href]
image_urls << image_url
#print image_title, "¥t", image_url, "¥n"
end
image_urls.each do |image_url|
save_file = File.join(save_path, File.basename(image_url))
if not File.exist?(save_file) then
get_image(image_url, save_file)
elsif File.zero?(save_file) then
get_image(image_url, save_file)
#else
#puts "skip"
end
end
end
__END__
urlsの中に画像を収集したいサイトのURIを記述すればおk。もちろん複数の指定もおk。これはMacで使ってるんだけど、/Users/chibi/imgというディレクトリに指定したサイトの名前のディレクトリを作って、そこにガツガツそのサイトの画像を保存していく。もちろんこのツールを1日に何回も実行することになると思うので、既に画像が保存済みの場合はスキップするようにしてある。また画像の保存にたまに失敗することもあるので、サイズが0なものとかは次の実行時にもう1度取りに行くようにしてある。なお、HTMLの解析は、.jpgなリンクだけをターゲットにしてる。
基本的には問題無いんだけどlivedoorとかに対しては失敗に終わってるんだよな・・・アクセス制御かけられたみたいな挙動になる。このスクリプト回した後、取得に失敗してるから直接その画像のURIにブラウザからアクセスするとアクセス制御かけられてるような挙動になってる。何か違う問題な気もするけどまだ解決してない。しかしRubyなんてすげー久しぶりに使ったな。たまには書いておかないと忘れるなってことで。僕はPerlとPythonが好きなのでRubyって全然使わないんです。
参考サイト
▼ コメント(0件)
- TB-URL http://chibilog.name/0357/tb/
