Я использовал open-uri
для этого, потому что это красиво и просто. Он извлечет страницу, но также будет следовать нескольким перенаправлениям:
require 'open-uri'
final_uri = ''
open('http://t.co/yjgxz5Y') do |h|
final_uri = h.base_uri
end
final_uri # => #<URI::HTTP:0x00000100851050 URL:http://nickstraffictricks.com/4856_how-to-rank-1-in-google/>
Документы показывают хороший пример использования нижнего уровня Net :: HTTP для обработки перенаправлений.
require 'net/http'
require 'uri'
def fetch(uri_str, limit = 10)
# You should choose better exception.
raise ArgumentError, 'HTTP redirect too deep' if limit == 0
response = Net::HTTP.get_response(URI.parse(uri_str))
case response
when Net::HTTPSuccess then response
when Net::HTTPRedirection then fetch(response['location'], limit - 1)
else
response.error!
end
end
puts fetch('http://www.ruby-lang.org')
Конечно, все это ломается, если страница не использует перенаправление HTTP. Многие сайты используют мета-перенаправления, которые вы должны обрабатывать, извлекая URL-адрес из метатега, но это другой вопрос.