Я бы начал с организации каждого URL-адреса по узлам, а затем перебирал все узлы и изображения, загружая их по мере необходимости. Примерно так:
require 'uri'
# Organize URLs by host.
by_host = {}
urls.each do |x| # Assume 'urls' is an Array of String URLs.
begin
uri = URI.parse(x)
by_host[uri.host] = [] unless by_host[uri.host]
by_host[uri.host] << uri
rescue URI::InvalidURIError
STDERR.puts "Invalid URL: #{x}"
end
end
# Now download each image from each host.
by_host.each do |host, uris|
Net::HTTP.start(host) do |http|
uris.each do |uri|
resp = http.get(uri.path)
File.open(uri.path, "wb") {|file| file.write(resp.body)}
end
end
end
end
Конечно, вам потребуется дополнительная проверка ошибок, и вы, вероятно, захотите организовать по хосту / порту, а не просто по имени хоста, но приведенный выше пример должен продемонстрировать идею в целом, особенно использование URI класс в Ruby.
Что касается сохранения в каталогах, вы должны либо убедиться, что существует полный путь к каждому uri.path
, либо создать его перед попыткой открыть выходной файл.