我可以从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)
但这不会获取远程内容。我怎么能这样做?
答案 0 :(得分:2)
看起来Amazon会检查HTTP referer值,然后返回相应的响应。我建议您尝试使用Mechanize来检索具有正确指定的所有标题的页面。
答案 1 :(得分:0)
403禁止使用亚马逊阻止iframe请求。 Google会做同样的事情,如果您在Chrome中加载谷歌并打开网络检查器,您会在标题中看到类似的内容:
如果您查看屏幕截图,可以看到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/...
并且瞧!你得到相同的结果。