Как мне открыть обзоры Amazon iframe с помощью Nokogiri? - PullRequest
1 голос
/ 01 июня 2011

Я могу получить отзывы о URL iframe от Amazon::AWS::ItemSearch, но у меня возникают проблемы с загрузкой содержимого iframe в Nokogiri.

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

Это дает ошибку 403:

OpenURI::HTTPError: 403 Forbidden

Если я вставлю URL в мой браузер, страница будет пуста. Тем не менее, если я добавлю это в 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 ]

2 голосов
/ 01 июня 2011

Похоже, Amazon проверяет значение HTTP referer, а затем возвращает соответствующий ответ. Я рекомендую вам попробовать Mechanize, чтобы получить эту страницу со всеми правильно указанными заголовками.

0 голосов
/ 05 марта 2015

Запрещено 403 из-за того, что Amazon блокирует запросы iframe. Google делает то же самое, и если вы загрузите 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/... и вуаля! вы получите тот же результат.

...