Для этого не нужно использовать Watir.Запрос HTTP HEAD
даст вам представление о том, разрешается ли URL-адрес и будет ли он быстрее.
Ruby's Net::HTTP
может сделать это, или вы можете использовать Open::URI
.
Использование Open:: URI вы можете запросить URI и получить страницу назад.Поскольку вам на самом деле все равно, что содержит страница, вы можете выбросить эту часть и только вернуть, получили ли вы что-то:
require 'open-uri'
if (open('http://www.example.com').read.any?)
puts "is"
else
puts "isn't"
end
Преимущество - Open :: URI разрешает перенаправления HTTP.Недостатком является то, что он возвращает полные страницы, поэтому он может быть медленным.
Ruby's Net :: HTTP может несколько помочь, потому что он может использовать HTTP HEAD
запросы, которые не возвращают всю страницу, только заголовок,Этого само по себе недостаточно, чтобы знать, достижима ли настоящая страница, потому что ответ HEAD может перенаправить на страницу, которая не разрешается, поэтому вы должны циклически перебирать перенаправления, пока вы либо не получить перенаправление, или вы получите ошибку.Документы 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
print fetch('http://www.ruby-lang.org')
Опять же, этот пример возвращает страницы, что может замедлить работу.Вы можете заменить get_response
на request_head
, который возвращает ответ, как get_response
, что должно помочь.
В любом случае, есть еще одна вещь, которую вы должны рассмотреть.Многие сайты используют « meta refreshes », что заставляет браузер обновлять страницу, используя альтернативный URL, после анализа страницы.Для их обработки требуется запросить страницу и проанализировать ее, ища теги <meta http-equiv="refresh" content="5" />
.
Другие HTTP-гемы, такие как Typhoeus и Patron , также могут легко выполнять HEAD
запросов, поэтому взгляните на них.В частности, Typhoeus может обрабатывать некоторые тяжелые нагрузки через своего компаньона Hydra
, что позволяет легко использовать параллельные запросы.
EDIT:
require 'typhoeus'
response = Typhoeus::Request.head("http://www.example.com")
response.code # => 302
case response.code
when (200 .. 299)
#
when (300 .. 399)
headers = Hash[*response.headers.split(/[\r\n]+/).map{ |h| h.split(' ', 2) }.flatten]
puts "Redirected to: #{ headers['Location:'] }"
when (400 .. 499)
#
when (500 .. 599)
#
end
# >> Redirected to: http://www.iana.org/domains/example/
На всякий случай, если у вас нетВот как выглядит ответ.Это полезно именно для той ситуации, на которую вы смотрите:
(rdb:1) pp response
#<Typhoeus::Response:0x00000100ac3f68
@app_connect_time=0.0,
@body="",
@code=302,
@connect_time=0.055054,
@curl_error_message="No error",
@curl_return_code=0,
@effective_url="http://www.example.com",
@headers=
"HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/\r\nServer: BigIP\r\nConnection: Keep-Alive\r\nContent-Length: 0\r\n\r\n",
@http_version=nil,
@mock=false,
@name_lookup_time=0.001436,
@pretransfer_time=0.055058,
@request=
:method => :head,
:url => http://www.example.com,
:headers => {"User-Agent"=>"Typhoeus - http://github.com/dbalatero/typhoeus/tree/master"},
@requested_http_method=nil,
@requested_url=nil,
@start_time=nil,
@start_transfer_time=0.109741,
@status_message=nil,
@time=0.109822>
Если вам нужно проверить множество URL-адресов, см. Пример Hydra , который является частью Typhoeus.