3

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

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

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

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

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

我真的很感谢全面的答案,并且任何代码示例都在使用 rails 的 ruby​​ 中。

4

2 回答 2

2

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

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

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

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

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

Anywho,这将是我的高级方法。我希望它可以帮助一些人。

于 2011-06-28T19:47:27.307 回答
1

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

我的一位同事使用了大多数(如果不是全部)当前技术来为他的一个个人项目生成网页截图。他在这里写了一篇内容丰富的文章,介绍了他现在如何使用 SaaS 解决方案,而不是尝试自己维护解决方案。

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

于 2011-06-29T15:22:42.727 回答