2011-06-21 14 views
3

我使用Google的自定義搜索API動態提供網絡搜索結果。我非常強烈地搜索API的文檔,並且找不到任何說明它允許您訪問Google的網站圖像預覽的東西,這些預覽恰好存儲爲base64編碼。如何在使用Google的網頁搜索API時提供網站的圖片預覽?

我希望能夠爲Google網絡搜索API返回的每個網址提供網站圖片預覽。請記住,我不希望這些圖像是縮略圖,而是大圖像。我的問題是,無論從短期還是長期來看,在效率和成本方面,做這件事的最好方法是什麼。

一種選擇是抓取網頁並自己生成並存儲圖像。然而,這超出了我的技術能力,並且加上存儲所有這些圖像將會太昂貴。

另一種選擇是在Google的API返回搜索結果後動態獲取圖像。然而,我在哪裏/如何獲取圖像是另一個問題。

自己生成圖像會有一種低成本的方式嗎?或者最好的解決方案是使用某種類型的網站縮略圖服務,爲我做到這一點?這會足夠快嗎?它會太貴嗎?該服務會爲我提供正確尺寸的圖像嗎?如果不是,我怎樣才能改變圖像的大小?

我真的很感謝全面的答案,以及任何使用rails的代碼示例。

+0

退房http://webthumb.bluga.net/home和http://snippets.dzone.com/posts/show/3621 – neezer

+0

此外,出於好奇,你最終的目標是什麼?這些網站截圖將用於什麼?你需要存儲圖像,還是可以動態渲染,異步返回(如[Litmus](http://litmus.com/)對他們的電子郵件預覽)? – neezer

+0

兩者。我想存儲緩存的圖像,但最初我需要動態渲染它們並異步返回 –

回答

2

所以,當你在你的提問時指出,有我可以看到你的問題,兩種方法:

  1. 使用外部服務來渲染和主機圖像。
  2. 你自己渲染和託管圖像。

我在外地的專家,但我的谷歌搜索迄今僅恢復服務,讓您生成縮略圖,而不是全尺寸的屏幕截圖(如提及here少數)。如果有託管服務可以爲您提供幫助,我無法輕鬆找到它們。

因此,那會留下#2。爲此,我的第一個直覺是尋找一個可以從網頁生成圖像的ruby庫,這很快將我帶到了IMGKit(可能有其他的,但這個看起來乾淨簡單)。藉助這個庫,您可以輕鬆傳入URL,並使用Webkit引擎爲您生成頁面的屏幕截圖。從那裏,我將使用文件附件寶石(如PaperclipCarrierWaverailscast))將其保存到您的資產存儲位置(如Amazon S3)。將附件存儲在一個記錄您從WSAPI(Web Search API)傳遞給IMGKit的原始URL的字段中,以便您可以在隨後的搜索中對其進行比較,並使用緩存版本而不是重新呈現預覽。您還可以使用created_at字段作爲您的附件模型來引入一些「如果超過x天,刷新圖像」類型的邏輯。最後,我會使用類似resquerailscast)這樣的後臺作業,以便在等待屏幕截圖呈現時不會阻止用戶。基本上,將來自WSAPI的返回URL數組傳遞給後臺工作人員,通過IMGKit生成圖像 - 基本上通過paperclip/carrierwave將其保存到S3。所有這些項目都有詳細記錄,Railscasts將帶您瞭解resque和carrierwave寶石的基礎知識。

我沒有嘎吱嘎吱的數字,但可以對上S3對網頁縮略圖生成的任何其他外部提供商託管自己的影像。當然,自己動手可以完全控制圖像的外觀(質量,格式等),而我遇到的大多數服務只提供一個小縮略圖,所以有一點要說。如果您不緩存先前搜索的圖像,那麼您的成本會進一步降低,因爲您將始終在動態呈現圖像。不過,我懷疑這不會很好地擴展,因爲您可能最終會爲服務器電源(用於IMGKit和圖像處理)和帶寬(用於獲取IMGKit的源HTML的外部請求)支付更多費用。我一定會在你的項目中包含一些metrics來附加一些確切的數字給你處理的請求類型,以幫助確定後續成本。

Anywho,這將是我的高層次的方法。我希望它有助於一些。

+0

很酷的謝謝!到目前爲止,我正在做一些與你的建議非常相似的事情。我目前正在使用PhantomJS,一個帶有JavaScript API的Webkit引擎,並行生成圖像Resque後臺任務。然而,它並不是特別適合Rails,所以我一定會研究IMGKit,看看我是否更喜歡它。我擔心無法在Heroku上使用PhantomJS,而且似乎您建議的圖書館可以處理它。 –

+0

我也不會保存除文件系統上存儲圖像的文件路徑之外的任何內容,而且我正在檢查文件是否存在('File.exist?(「path」)')以查看是否應該爲它服務從那裏。但是,這可能不會允許我執行更新緩存的任何邏輯,'created_at'字段可以幫助我做。好想法!我會這樣做的。 –

+0

哦,我也在紐約:) –

1

屏幕shotting網頁確實是非常難拉斷。主要問題是所有當前的解決方案(khtml2png,CutyCapt,Phantom.js等)都基於QT,它提供對嵌入式Webkit庫的訪問。然而,這個webkit的構建相當古老,並且使用HTML5和CSS3,大多數效果要麼不顯示,要麼渲染不正確。

我的一個同事使用了大多數,如果不是全部,目前的技術,用於生成網頁的截圖爲他個人的項目之一。他已經寫了一篇關於它的信息性文章here,說明他現在如何使用SaaS解決方案,而不是試圖自己維護解決方案。

TLDR版本;他現在使用URL2PNG來做他所有的縮略圖和全尺寸截圖。這不是免費的,但他說它爲他做了這份工作。如果你不想使用它們,他們有一個競爭對手名單here

+0

這真的很不錯。有點昂貴,但:/ –

+0

是的,我認爲有一個折扣碼的博客文章,使其稍微便宜。最終,它取決於多少截圖對您的產品意味着什麼。對我的同事來說,這是他準備支付的一大特色。如果這不是什麼大問題,那麼使用上述現有技術中的一種就足夠了。 – lloydpick

+0

請注意,PhantomJS已經不再使用庫存QtWebKit了,預計未來版本中會出現更多出色的WebKit功能。 –

相關問題