Итак, как вы указали в своем вопросе, я вижу два подхода к вашей проблеме:
- Использование внешнего сервиса для рендеринга и размещения изображений.
- Рендеринг и размещение изображений самостоятельно.
Я не специалист в этой области, но мой Google до сих пор имеет только возвращенные сервисы, которые позволяют генерировать миниатюры, а не полноразмерные скриншоты (как несколько упомянутых выше). здесь ).Если есть хостинговые сервисы, которые сделают это для вас, я не смог бы их легко найти.
Итак, уходит # 2.Для этого мой первый инстинкт был искать библиотеку ruby, которая могла бы генерировать изображение с веб-страницы, что быстро привело меня к IMGKit (могут быть и другие, но этот выглядел чистым и простым).С помощью этой библиотеки вы можете легко передать URL-адрес, и она будет использовать движок webkit для создания скриншота страницы для вас.Оттуда я бы сохранил его там, где хранятся ваши активы (например, Amazon S3 ), используя драгоценный камень вложения, например Скрепка или CarrierWave ( railscast).Сохраните вложение с полем, в котором записан исходный URL-адрес, который вы передали в IMGKit из WSAPI (API веб-поиска), чтобы можно было сравнивать его с последующими поисками и использовать кэшированную версию вместо повторной визуализации предварительного просмотра.Вы также можете использовать поле created_at
для вашей модели вложения, чтобы добавить некоторую логику типа «если старше x дней, обновите изображение».Наконец, я бы поместил все это в фоновое задание, используя что-то вроде resque ( railscast ), чтобы пользователь не блокировался при ожидании рендеринга скриншотов.Передайте массив возвращенных URL-адресов из WSAPI фоновым работникам в режиме resque, которые будут генерировать изображения с помощью IMGKit - сохраняя их в S3 через paperclip / carrierwave, в основном.Все эти проекты хорошо документированы, и Railscasts проведет вас через основы драгоценных камней resque и carrierwave.
Я не сократил числа, но вы можете не принимать изображения самостоятельно на S3 против любого другого внешнего провайдера создания веб-миниатюр.Конечно, выполнение этого самостоятельно дает вам полный контроль над тем, как выглядит изображение (качество, формат и т. Д.), В то время как большинство служб, с которыми я сталкивался, предлагают лишь небольшую миниатюру, поэтому есть что сказать по этому поводу.Если вы не кэшируете изображения из предыдущих поисков, ваши затраты снижаются еще больше, поскольку вы всегда будете рендерить изображения на лету.Однако я подозреваю, что это не очень хорошо масштабируется, так как вы можете в конечном итоге платить гораздо больше за мощность сервера (для IMGKit и обработки изображений) и пропускную способность (за внешние запросы на выбор исходного HTML-кода для IMGKit).Я бы обязательно включил в ваш проект некоторые метрики , чтобы прикрепить некоторые точные цифры к типу запросов, с которыми вы имеете дело, чтобы помочь определить, каковы будут последующие затраты.
AnywhoЭто был бы мой подход высокого уровня.Надеюсь, это поможет некоторым.