【问题标题】:How should I go about providing image previews of sites while using Google's Web Search API?在使用 Google 的 Web Search API 时,我应该如何提供网站的图像预览?
【发布时间】:2011-06-21 00:54:31
【问题描述】:

我正在使用 Google 的自定义搜索 API 来动态提供网络搜索结果。我非常认真地搜索了 API 的文档,但找不到任何声明它授予您访问 Google 站点图像预览的权限,而这些预览恰好存储为 base64 编码。

我希望能够为 Google 网络搜索 API 返回的每个网址提供网站的图像预览。请记住,我不希望这些图像是缩略图,而是大图像。我的问题是,在短期和长期的效率和成本方面,这样做的最佳方法是什么。

一种选择是自己抓取网络并生成和存储图像。然而,这超出了我的技术能力,而且存储所有这些图像太贵了。

另一种选择是在 Google 的 API 返回搜索结果后立即动态获取图像。但是,我在哪里/如何获取图像是另一个问题。

是否有一种低成本的方式让我自己生成图像?或者最好的解决方案是使用某种为我做这件事的网站缩略图服务?这会足够快吗?会不会太贵?该服务会为我提供正确尺寸的图像吗?如果没有,我怎么能改变图像的大小?

我非常感谢全面的答案以及任何使用 Rails 的 ruby​​ 代码示例。

【问题讨论】:

  • 另外,出于好奇,您在这里的最终目标是什么?这些网站截图将用于什么?您是否需要存储图像,或者它们可以即时渲染,异步返回(就像Litmus 对他们的电子邮件预览所做的那样)?
  • 两者。我想存储图像以进行缓存,但最初我需要动态渲染它们并异步返回它们
  • 也许code.google.com/p/wkhtmltopdf 更更新——不过您需要转换为图像。渲染对我们来说很好(javascript、canvas 和所有 ..)

标签: ruby-on-rails database image google-search-api


【解决方案1】:

正如您在问题中指出的那样,我可以看到两种方法来解决您的问题:

  1. 使用外部服务来呈现和托管图像。
  2. 自己渲染和托管图像。

我不是该领域的专家,但我的谷歌搜索到目前为止只返回了允许您生成缩略图而不是全尺寸屏幕截图的服务(就像提到的少数 here)。如果有可以为您执行此操作的托管服务,我无法轻松找到它们。

所以,剩下#2。为此,我的第一个直觉是寻找可以从网页生成图像的 ruby​​ 库,这很快将我带到了IMGKit(可能还有其他的,但这个看起来很干净和简单)。使用这个库,您可以轻松地传入一个 URL,它会使用 webkit 引擎为您生成页面的屏幕截图。从那里,我会使用像PaperclipCarrierWave (railscast) 之类的文件附件gem 将它保存到您的资产存储的任何位置(例如Amazon S3)。使用记录您从 WSAPI(Web 搜索 API)传递给 IMGKit 的原始 URL 的字段存储您的附件,以便您可以在后续搜索中与它进行比较,并使用缓存版本而不是重新呈现预览。您还可以为附件模型使用 created_at 字段来添加一些“如果超过 x 天,请刷新图像”类型的逻辑。最后,我会使用 resque (railscast) 之类的东西将这一切都放在后台作业中,这样用户在等待屏幕截图呈现时就不会被阻止。将返回的 URL 数组从 WSAPI 传递给 resque 中的后台工作人员,后台工作人员将通过 IMGKit 生成图像——基本上,通过回形针/carrierwave 将它们保存到 S3。所有这些项目都有详细的文档记录,Railscast 将引导您了解 resque 和carrierwave gems 的基础知识。

我没有计算过这些数字,但您可以反对自己在 S3 上托管图像,而不是任何其他网络缩略图生成的外部提供商。当然,自己做可以让您完全控制图像的外观(质量、格式等),而我遇到的大多数服务只提供一个小缩略图,所以有话要说。如果您不缓存以前搜索的图像,那么您的成本会进一步降低,因为您将始终动态渲染图像。但是我怀疑这不会很好地扩展,因为您最终可能会为服务器功率(用于 IMGKit 和图像处理)和带宽(用于获取 IMGKit 源 HTML 的外部请求)支付更多费用。我一定会在您的项目中包含一些metrics,以便为您正在处理的请求类型附加一些确切的数字,以帮助确定后续成本。

任何人,这将是我的高级方法。希望对大家有所帮助。

【讨论】:

  • 非常感谢!到目前为止,我正在做的事情与您的建议非常相似。我目前正在使用 PhantomJS,一个带有 javascript API 的 Webkit 引擎,在并行 Resque 后台任务中生成图像。然而,它并不特别适合 Rails,所以我肯定会研究 IMGKit 看看我是否更喜欢它。我担心无法在 Heroku 上使用 PhantomJS,而且您建议的库似乎可以使用它。
  • 我最初也不打算在文件系统上存储存储图像的文件路径以外的任何内容,我正在检查文件是否存在 (File.exist?("path")) 以查看是否应该从那里。但是,这可能不允许我执行任何更新缓存的逻辑,created_at 字段可以帮助我做到这一点。好想法!我会这样做的。
  • 哦,我也在纽约 :)
  • @neezer IMGKit 在尝试生成图像时给我带来了麻烦。
  • @Justin Meltzer - 你安装了wkhtmltoimage吗?尽管这可能在 Heroku 上也不起作用,因为 wkhtmltoimage 是一个单独的编译二进制文件。您可以启动一个最小的slice 并在那里托管您的“图像处理”(IMGKit 或 PhantomJS),并作为 Heroku 应用程序的外部 API 与其通信。此外,您可能想更新您的问题,说明您在 Heroku 上托管。
【解决方案2】:

可靠地截屏网页是极其难以实现的。主要问题是所有当前的解决方案(khtml2png、CutyCapt、Phantom.js 等)都基于 QT,它提供了对嵌入式 Webkit 库的访问。然而,该 webkit 构建相当陈旧,并且使用 HTML5 和 CSS3,大多数效果要么不显示,要么渲染不正确。

我的一位同事使用了大部分(如果不是全部)当前技术来为他的一个个人项目生成网页截图。他写了一篇关于它的信息性帖子here,介绍了他现在如何使用 SaaS 解决方案,而不是尝试自己维护解决方案。

TLDR 版本;他现在使用URL2PNG 来制作他所有的缩略图和全尺寸屏幕截图。它不是免费的,但他说它可以为他完成这项工作。如果您不想使用它们,他们有他们的竞争对手列表here

【讨论】:

  • 这真是太好了。虽然有点贵:/
  • 是的,我认为博文上有一个折扣代码可以让它稍微便宜一些。最后,这实际上取决于屏幕截图对您的产品意味着多少。对我的同事来说,这是一个主要特点,所以他准备付钱。如果没什么大不了的,那么使用上述当前技术之一就足够了。
  • 请注意,PhantomJS 已经不再使用现有的 QtWebKit,期待在未来的版本中加入更多前沿的 WebKit 功能。
  • URL2PNG 也使用 Chromium 11,它是一年前发布的(因此,除非后端升级,否则很快也会属于“过时”的 WebKit 类别)。
猜你喜欢
  • 2016-07-04
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2018-05-19
相关资源
最近更新 更多