harry’s memorandum

おれおれメモ

指定した URL にある画像を取得

dropboxに何も入れておらず寂しくなったので、WallPaperをダウンロードして置いてみたくなりました。
とりあえず、書いてみた。ruby foo.rb でOK.

コード

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

なんか無駄な努力に終わった。

参考

コメント欄にワンライナー乗ってた。便利だ。でもわたしゃーエロい画像なんかダウンロードしないし。*1

追記

友達に、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
}

*1:自分の歴史的にすでに死ぬほどダウンロードしたし

*2:でもワンライナーのをパクったほうがスマートなのはいうまでもない。