指定した URL にある画像を取得
dropboxに何も入れておらず寂しくなったので、WallPaperをダウンロードして置いてみたくなりました。
とりあえず、書いてみた。ruby foo.rb
コード
require 'rubygems' require 'hpricot' require 'open-uri' url = ARGV[0] class PhotoGet def initialize(url) @url = url @doc = Hpricot(open(@url).read) @a = [] end def get(ext) reg = /#{ext}$/ @a = (@doc/:a).map {|elem| elem[:href] if elem[:href] =~ reg } @a.delete(nil) @a.each {|o| puts o dat = open(o).read File.open(o.split('/')[-1],'w+b').write dat } end end http = PhotoGet.new(url) http.get('jpg')
ワンライナー
でも、ぐぐると便利なワンライナーとかあるんだよなぁ。
wget -q -O - http://hoge.html | perl -ne 'while(/a href="(.*?\.jpg)"/g){print "$1\n"}' | xargs wget
- ruby
wget -q -O - http://hoge.html | ruby -ne 'scan(/a href="(.*?\.jpg)"/).each{|c| puts c}' | xargs wget
- wgetだけ
ドメインが違うとだめだけど、wgetのみでもできなくもない。
wget -r -A .jpg http://hoge.html
なんか無駄な努力に終わった。
追記
友達に、hpricot使わなくても、URIクラスだけいけると教えてもらいました。
これだけで、httpのパスを配列で返してくれる、だそうです。便利だ。
URI.extract(open(str).read, %w[http])
書き直し。*2
require 'open-uri' url = ARGV[0] reg = /jpg$/ URI.extract(open(url).read, %w[http]).select {|u| u if u =~ reg }.each {|o| puts(o); dat = open(o).read; File.open(o.split('/')[-1],'w+b').write dat }