На сайте амазона есть возможность поиска товаров также и у определенной фирмы.
Все бы ничего - бери парсер - парси результаты поиска товаров и в свою базу, но не тут то было...
Оказывается у амазона жестко прописано ограничение на кол-во страниц результатов поиска - 400 страниц, даже если мы видим, что товаров более 27000 физически мы не можем просмотреть далее 400-ой страницы.
сначала был написан небольшой парсер с помощью средств jruby и celerity - но тако решение оказалось слишком долгим в эксплуатации - 2000 товаров заливались примерно за 5 часов - очень долго. Было найдено более быстрое решение - использовать готовое решение для получения результатов поиска товаров - gem ruby-aws.
Напрмер в этой вариации: http://github.com/res0nat0r/ruby-aws
Отрывок из кода:
is = ItemSearch.new( 'Tools', { 'Title' => "Firma title #{keyword}" } )
req = Request.new
req.locale = 'us'
resp = req.search(is, :ALL_PAGES)
Тут мы делаем запрос на получение товаров из категории Tools, содержащих в названии слова CRL и ключевое слово для сужение результатов поиска (помним про злополучные 400 страниц)
items = resp.collect { |r| r.item_search_response[0].items[0].item }.flatten rescue resp.item_search_response[0].items[0].itemИ получаем массив товаров.
puts "Найдено #{items.size} товаров"
items.each do |item|
limit += 1
#return "Загрузка окончена" if limit > 5
attribs = item.item_attributes[0]
title = attribs.title.to_s
asin = item.asin.to_s
price = item.offer_summary[0].lowest_new_price.formatted_price.to_s.gsub('$', '') rescue "Не указано"
url = item.detail_page_url.to_s
description = item.editorial_reviews[0].editorial_review.content.to_s
unless Product.find_by_catalogn(asin)
Product.create!(:name => title,
:description => description,
:price_orig => price,
:price => AmazonPrice.calculate(price),
:url => url,
:catalogn => asin,
:status => 'new')
puts "Новый товар: #{title}"
end
end
puts "После запроса CRL #{keyword} в базе #{Product.all.size} товар(ов)"
Для корректного сужение результатов поиска как варианнт можно составить список ключевых слов в виде массива и записать:
keywords = ["rail", "door", "pack", "tool", "security", "bar", "push", "rod", "aluminium", "storm", "screen", "panel", "package", "automatic", "mirror", "pull", "indicator", "window", "glass", "display", "system", "sliding", "trailer", "box", "bronze", "nickel", "toyota", "mazda", "isuzu", "jeep"].......
keywords.each do |keyword|
puts start = Time.now
is = ItemSearch.new( 'Tools', { 'Title' => "CRL #{keyword}" } )
На моем слабом компе товары в кол-ве 3985 шт залились примерно за 25 минут - что ж - уже лучше.