2011-06-01 63 views
1

我能夠從Amazon::AWS::ItemSearch獲得評論iframe url,但我無法將iframe內容加載到Nokogiri中。如果我的網址粘貼到瀏覽器如何使用Nokogiri打開亞馬遜評論iframe?

OpenURI::HTTPError: 403 Forbidden 

頁是隻是空白:

iframe_url = "http://www.amazon.com/reviews/iframe?[...snip...]" 
iframe = Nokogiri::HTML(open(iframe_url)) 

這給出了一個403錯誤。但是,如果我把它放在一個iframe在我的網頁這樣的內容加載罰款:

%iframe{:src => "http://www.amazon.com/reviews/iframe?[...snip...]"}/ 

我覺得做這樣的:

iframe_url = "http://www.amazon.com/reviews/iframe?[...snip...]" 
html = "<iframe src = #{iframe_url}></iframe>" 
iframe = Nokogiri::HTML(html) 

但這不會獲取遠程內容。我怎樣才能做到這一點?

+0

無論何時,您可以從瀏覽器中檢索頁面,但不能從代碼中檢索頁面,您應該懷疑他們正在尋找傳入連接中的某些內容。它通常是一個cookie,會話ID或瀏覽器簽名。機械化使其與任何這些工作非常容易。 – 2011-06-01 05:03:35

回答

2

它看起來像亞馬遜檢查HTTP引用值,然後返回適當的響應。我建議您嘗試使用Mechanize來檢索具有正確指定的所有標題的頁面。

0

403禁止是由於亞馬遜阻止iframe請求。谷歌做同樣的事情,如果你在Chrome瀏覽器加載谷歌和開放的網絡督察,你會看到在標題是這樣的:

X-content-frame-options example

如果你看一下截圖,你可以看到, google會設置一個名爲x-frame-options的標頭,其值爲SAMEORIGIN。現代瀏覽器閱讀這個標題,瀏覽器本身阻止你注入它。這就是爲什麼當你把它直接放入你的網頁時它會起作用。

我已經通過在同一個域上創建一個代理並iframing來解決此問題。例如,在yourapp.com/proxy和GET操作中設置路由,執行服務器端HTTP請求來獲取所需的URL。然後,將其渲染到您的視圖中,然後將URL從查詢參數中提取出來,以取代iframe,您可以使用iframe http://yourapp.com/proxy?url=http://amazon.com/...和voila!你會得到同樣的結果。