忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

rubyでブログの画像を全部ダウンロード
あるブログを見ていて画像をダウンロードしたくなりました。firefoxのアドオンDownThemAll!を使って1ページごとに画像を落としていきました。しかし、エロ画像へのリンクは騙しがあるので、ファイルが無いページでもDownThemAll!を起動するのは面倒だし、何より時間の無駄だと思った。
昼間留守のうちにブログの画像を端から端まですべてダウンロードしておいて、帰ってきたら画像を見るだけだ、という状態を作りたいと思った。

そこで、最近始めたrubyを使ったら実現できるのではないかと思った。
いろいろ悩みながらソースコードを書いてみた。実行結果は下の写真のとおりうまくいった。これからは画像が沢山あるブログを見つけるだけだ。

ダウンロードした画像
ruby

今までの面倒な作業は何だったのだろうか。もっと早くrubyをやっていればよかった。

download

hpricotは標準ライブラリではないのでインストールしなくてはならない。
gem install hpricot でインストールする。

get_jpg.rb
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'net/http'

Net::HTTP.version_1_2
links_list = []
n = 1

#画像のuriを収集
for i in 0..50
  begin
    doc = Hpricot(open(uri = "http://doragong.19.dtiblog.com/page-#{i}.html").read.downcase)
  rescue
    sleep(1)
    retry
  end
  (doc/:a).each {|link|
    if link[:href] =~ /\.jpe?g/
      links_list << link[:href]
    end
  }
end

#画像をダウンロードして保存
links_list.uniq!.each{|link|
  if link =~ %r|http://(.*?)(/.*/(.*\.jpg))|
    print n,"\sDownloding...\s",link,"\n"
    begin
      open($3,"wb"){|file|
        Net::HTTP.start($1, 80) {|http|
          response = http.get($2)
          file.puts response.body
        }
      }
    rescue
      next
    end
    n += 1
  end
}

まずwebpageを開いて、画像のURIを収集します。URIはlinks_listという配列に入れます。次はURIをnet/httpを使ってダウンロードします。画像が開けなかった場合は、その画像が無いとして次の画像に移ります。

悩んだこと
ファイルをテキスト形式で保存してしまい、画像が見れなかった。wではなくwbとしてバイナリで保存したら解決した。
webpageに連続してアクセスしたため、強制的に切断されてしまうエラーが出た。error処理を行い、切断された場合には1秒後に再度アクセスするようにした。

参考文献
ページ内の画像を一括してダウンロードするRubyスクリプト
RubyでHTMLとWebを操作するためのライブラリ、HpricotとWWW::Mechanize
Ruby Scraping
PR

トラックバック

トラックバックURL:

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字(絵文字)


最新CM
[10/29 rafting]
最新TB
アクセス解析

ジオターゲティング
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
プロフィール
HN:
崖の上の宗介
性別:
非公開
ブログ内検索
カウンター
アクセス解析
バーコード