Сделайте так, чтобы программа ruby ​​запускала каждую часть массива в коде загрузки изображений - PullRequest
0 голосов
/ 26 января 2011
Net::HTTP.start("static.flickr.com") { |http|
  resp = http.get("/92/218926700_ecedc5fef7_o.jpg")
  open("fun.jpg", "wb") { |file|
    file.write(resp.body)
   }
}

Вот пример кода загрузки изображения. Теперь вместо того, чтобы открыть его, я хочу сохранить его в уже выбранном каталоге. Кроме того, я хотел бы, чтобы он проходил через каждый URL в массиве. Используя 4chan в качестве примера (я делаю риппер изображений.) Вот что содержит массив, после копирования их из исходного кода:

http://static.4chan.org/image/title/1065156729813.jpg
http://static.4chan.org/support/jlist_leader/728x90_gothic.jpg
http:flag.jpg
http://static.4chan.org/support/jlist_top/jlist_adult_01.jpg
http://images.4chan.org/v/src/1296062231626.png

(и т.д.)
Вот что я предлагаю сделать: URI как-то разбирает каждый URL через массив Введите каждую часть каждого проанализированного URL-адреса в каждую из областей последовательно Если изображение не может быть загружено / проанализировано (например, соответствует, например, flag.jpg), оно пропускает его Он сохраняет их все в предопределенном каталоге, не открывая их. Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 26 января 2011

Я бы начал с организации каждого 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, либо создать его перед попыткой открыть выходной файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...