写真をダウンロードしてみる
Webページに掲載されている写真をローカルにダウンロードします。そのためには写真のURLが必要です。まず、どこか写真の載っているWebページを開いて、そのURLを調べます。多くのWebブラウザでは右クリックをして「画像を開く」などを選ぶことで画像だけを開くことができます。そこからURLを取得します。
こうして得られた画像のURLを覚えておきます。今回は
http://chsv.nikon-image.com/jpn/products/camera/slr/digital/d3x/img/sample/pic_009.jpg
とします。
open-uriを使う
おそらく一番お手軽なものはopen-uriを使うことでしょう。require ‘open-uri’することでopenでURLを開くことが可能になります。
require 'open-uri'
filename = ARGV[0].split("/")[-1]
data = open(ARGV[0])
file = open(filename, "w")
file.puts(data.read)
file.close
これを保存して引数にURLを与えるとファイルをダウンロードすることができます。今回は約17MBと大きいものでしたが、無事にダウンロードすることができました。
関連項目
- URLからファイル名を取り出す
- 配列の添え字
- ファイルに記録する
net/httpを使う
より細かい動作をしたいときにはnet/httpがよいでしょう。これを用いるとGET以外にもPUTもできるようになります。
require 'uri'
require 'net/http'
Net::HTTP.version_1_2
uri=URI(ARGV[0])
filename = ARGV[0].split("/")[-1]
file = open(filename, "w")
Net::HTTP.start(uri.host, uri.port) do |http|
file.puts(http.get(uri.path).body)
end
file.close
Socketを使う(その1)
さらに細かい制御が欲しい場合にはSocketを使うこともできます。
require 'uri'
require 'socket'
uri = URI(ARGV[0])
filename = ARGV[0].split("/")[-1]
puts ARGV[0]
puts filename
file = open(filename, "w")
socket = TCPSocket.new(uri.host, uri.port)
socket.puts "GET #{uri.path} HTTP/1.0\r\n"
socket.puts "Host: #{uri.host}\r\n"
socket.puts "\r\n"
# ヘッダを捨てる
file.puts(socket.read.split("\r\n\r\n")[1..-1].join("\r\n\r\n"))
socket.close
file.close
関連項目
- HTMLのヘッダを捨てる
- splitとjoin
- 配列の添え字
Socketを使う(その2)
たとえば1024バイトずつ読んでみることもできます。
require 'uri'
require 'socket'
uri = URI(ARGV[0])
filename = ARGV[0].split("/")[-1]
file = open(filename, "w")
socket = TCPSocket.new(uri.host, uri.port)
socket.puts "GET #{uri.path} HTTP/1.0\r\n"
socket.puts "Host: #{uri.host}\r\n"
socket.puts "\r\n"
# ヘッダを読み飛ばす
header = ""
while true do
read = socket.recv(1024)
if read.size == 0 then
break
end
header += read
response = header.split("\r\n\r\n")
if response.size != 1 then
body = response[1..-1].join("\r\n\r\n")
size = body.size
file.print(body)
break
end
end
while true do
read = socket.recv(1024)
if read.size == 0 then
break
end
size += read.size
puts "read : " + size.to_s + "bytes"
file.print(read)
end
socket.close
file.close
実行結果
[・・・・]# ruby socket2.rb http://data.tumblr.com/J98fYvxSwi9giuxz1vPx43LSo1_400.jpg read : 998bytes read : 2022bytes read : 2378bytes read : 3402bytes read : 4426bytes read : 5450bytes read : 6474bytes read : 7498bytes read : 8522bytes read : 8618bytes read : 9642bytes (略)
Socketを使う(その3)
非同期読み込みについて。
- Newer: Ajaxがわからない
- Older: Adsense警備員
Comments:0
Trackback+Pingback:0
- TrackBack URL for this entry
- http://blog.neoneet.jp/2009/01/09/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89/trackback/
- Listed below are links to weblogs that reference
- ファイルのダウンロード from 週刊(月刊?)プレカリアート















