如何用Nokogiri打开亚马逊评论iframe?

时间:2011-06-01 03:32:54

标签: ruby ruby-on-rails-3 iframe amazon-web-services nokogiri

我可以从Amazon::AWS::ItemSearch获取评论iframe网址,但我在将iframe内容加载到Nokogiri时遇到问题。

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

这会产生403错误:

OpenURI::HTTPError: 403 Forbidden

如果我将网址粘贴到我的浏览器中,该页面就是空白。但是,如果我将其放在我的网页上的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)

但这不会获取远程内容。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

看起来Amazon会检查HTTP referer值,然后返回相应的响应。我建议您尝试使用Mechanize来检索具有正确指定的所有标题的页面。

答案 1 :(得分:0)

403禁止使用亚马逊阻止iframe请求。 Google会做同样的事情,如果您在Chrome中加载谷歌并打开网络检查器,您会在标题中看到类似的内容:

X-content-frame-options example

如果您查看屏幕截图,可以看到Google设置了名为x-frame-options的标头,其值为SAMEORIGIN。现代浏览器读取此标题,浏览器本身会阻止您注入它。这就是为什么当你把它直接放入你的网页时它的工作原理。

我已经通过在同一个域上创建代理并将其改为相似来解决这个问题。例如,在yourapp.com/proxy设置路由并在GET操作中,执行服务器端HTTP请求以获取所需的URL。然后将其渲染到您的视图中,并从查询参数中提取URL以进行请求,而不是iframing http://amazon.com/... iframe http://yourapp.com/proxy?url=http://amazon.com/...并且瞧!你得到相同的结果。