Парсинг веб-страниц с помощью Nokogiri::HTML и Ruby — сохранение изображений

Я работаю над скриптом для получения данных и изображений со страниц продуктов интернет-магазина (с одобрения владельца)

У меня есть рабочий скрипт, который перебирает CSV-файл с URL-адресами продуктов 20042, чтобы получить нужные мне данные, которые хранятся в CSV-файле. Последнее, что мне нужно, это сохранить изображения продукта.

У меня есть этот код (спасибо Phrogz в этом потоке)

    URL = 'http://www.sample.com/page.html'

    require 'rubygems'
    require 'nokogiri'
    require 'open-uri'
    require 'uri'

    def make_absolute( href, root )
      URI.parse(root).merge(URI.parse(href)).to_s
    end

    Nokogiri::HTML(open(URL)).xpath('//*[@id="zoom"]/@href').each do |src|
      uri = make_absolute(src,URL)
      File.open(File.basename(uri),'wb'){ |f| f.write(open(uri).read) }
    end

который отлично работает для отдельного URL-адреса, но я изо всех сил пытаюсь заставить его работать и перебирать URL-адреса из файла CSV в моем основном сценарии, который начинается так:

    # encoding: utf-8
    require 'nokogiri'
    require 'open-uri'
    require 'csv'
    require 'mechanize'

    @prices = Array.new
    @title = Array.new
    @description = Array.new
    @warranty = Array.new
    @leadtime = Array.new
    @urls = Array.new 
    @categories = Array.new
    @subcategories = Array.new
    @subsubcategories = Array.new

    urls = CSV.read("lotofurls.csv")
    (0..urls.length - 1).each do |index|

      puts urls[index][0]
        doc = Nokogiri::HTML(open(urls[index][0]))

Похоже, все, что мне нужно выяснить, это как передать URL-адреса коду, сохраняющему изображение, но любая помощь будет очень признательна!


person user2215918    schedule 31.03.2013    source источник


Ответы (1)


Вы можете быстро справиться с этим с помощью чего-то вроде RMagick (или ImageMagick, MiniMagick и т. д.).

Для RMagick вы можете сделать что-то вроде этого

require 'rmagick'

images.each do |image|
  url = image.url # should be a string
  Magick::Image.read(url).first.resize_to_fill(200,200).write(image.desired_filename)
end    

Это создаст изображение размером 200x200 пикселей для каждого предоставленного вами URL-адреса (очевидно, resize_to_fill не является обязательным). Библиотека очень мощная, с множеством опций. Если вы пойдете по этому пути, я бы порекомендовал railscast для обработки изображений: http://railscasts.com/episodes/374-image-manipulation

И документация, если вы хотите узнать больше: http://rmagick.rubyforge.org/

person Tyler    schedule 12.05.2013