hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

サイト上にある画像のURLを抽出する

ちょっと思いつき企画一日に一つ、小さなお題を出し、それを実装する。
名付けて『本日のお題』をやってみたいと思います。
タイトルがそのままなのは気にしてはいけません。

本日のお題

『Webページ上にあるURLを抽出せよ』

仕様

ソースコード

#! /usr/bin/ruby
# encoding: utf-8

require 'open-uri'
require 'timeout'

# URL上に存在する画像ファイルのURLを取得し、一覧表示させます。
def extract_url(url)  
  begin
    timeout(1){
      begin
        uri = URI(url)
        if uri.scheme == "http"
          url_images = uri.read.scan(/img.+src=[\"|\']?([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:@&=\$\,\%\#]+\.(jpg|jpeg|png|gif|bmp))/i)
          images = []
          url_images.each {|img| images << URI.join(url, img[0]) }
          images.uniq!
          puts images
        end
      rescue => exception
        case exception
        when OpenURI::HTTPError
          puts "ページが存在しません。"
        when URI::InvalidURIError
          puts "URLが入力されていません。"
        else
          puts exception.to_s + "(#{ exception.class })"
        end
      end
    }
  rescue TimeoutError
    puts "読み込みエラー"
  end
end

extract_url(ARGV[0])

解説

URI

URLとURNを含んだ言い方。
使い方に関してはリファレンスを参照。

正規表現

正規表現を使って、取得したいURLのみ抽出する。
オプションに「i」を付けることにより、大文字小文字を無視します。
使い方に関してはwikipediaを参照。

重複URLの削除

Array#uniq! を使うことにより、同一データを集約する。

エラー対応

タイムアウト、404エラー、入力エラー、その他に対応。

今回わかったこと

URIの使い方がなんとなく理解できた。
今回は参考サイトをマネてコーディングしたが、次からは自力でやってみると良いかもしれない。

次やりたいこと

画像ダウンロードしたい。