Самый быстрый способ проверить, существует ли URL - PullRequest
0 голосов
/ 04 августа 2020

в настоящее время я пишу программу, которая должна проверять множество возможных URL-адресов в поисках тех, которые действительно существуют. Чтобы быть точным, я имею в виду существовать, так как вы можете посетить URL-адрес, и там есть какое-то фактическое содержимое ... не анализ строки, чтобы увидеть, в формате URL-адреса.

Программа генерирует список возможных вариантов для filename, а затем проверяет каждый из них, пока не получит действительный URL-адрес, поэтому большая часть URL-адреса остается прежней. Примеры:

https://www.test.com/folder1/FILE.png
https://www.test.com/folder1/File.png
https://www.test.com/folder1/file.png
https://www.test.com/folder1/file1.png

Тем не менее, мой код в настоящее время работает нормально ... однако в итоге на проверку URL-адреса требуется около 2-4 секунд, и я не знаю способа ускорить это. Есть ли более быстрый или лучший способ проверки URL-адресов, или мне просто не повезло?

Это моя функция для проверки URL-адресов:

require "net/http"

def url_exist? url_path
  url = URI.parse(url_path)
  req = Net::HTTP.new(url.host, url.port)
  req.use_ssl = true
  res = req.request_head(url.path)
 
  if res.code == "200" || res.code == "403"
    return true
  end
end

Спасибо, что нашли время, чтобы прочитать это и любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 04 августа 2020

Ваш код создает новое соединение для каждого URL. Должно быть быстрее отправлять несколько запросов через одно и то же соединение через HTTP keep-alive .

В Ruby вы можете открыть такое соединение через Net::HTTP.start , например:

require 'net/http'

class URLChecker
  def initialize(base_url)
    uri = URI(base_url)
    Net::HTTP.start(uri.host, uri.port, use_ssl: uri.is_a?(URI::HTTPS)) do |http|
      @http = http
      yield self
    end
  end

  def exist?(path)
    res = @http.head(path)
    res.code == '200' || res.code == '403'
  end
end

URLChecker.new('https://stackoverflow.com') do |uc|
  p uc.exist?('/questions/tagged/ruby')   #=> true
  p uc.exist?('/questions/tagged/python') #=> true
  p uc.exist?('/questions/tagged/foobar') #=> false
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...