ようこそゲストさん

chibilog

2009/04/08(水) Rubyで画像収集でも

はてブ情報 はてブに登録 はてブ数 2009/04/08 24:55 パソコン

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って全然使わないんです。


参考サイト



名前:  非公開コメント   

URL(任意):
  • TB-URL  http://chibilog.name/0357/tb/