Взгляните на очень способную комбинацию Typhoeus и Hydra .Эти два способа позволяют одновременно обрабатывать несколько URL-адресов.
Пример " Times " поможет вам быстро приступить к работе.В блоке on_complete
введите свой код для записи своих статусов в БД.Вы можете использовать поток для создания и поддержки запросов в очереди на исправном уровне или поставить в очередь заданное число, позволить всем им выполняться до завершения, а затем выполнить цикл для другой группы.Это зависит от вас.
Пол Дикс, первоначальный автор, рассказал о своих целях дизайна в своем блоге.
Это пример кода, который я написал для загрузки архивной почты.списки, чтобы я мог сделать локальный поиск.Я намеренно удалил URL, чтобы не подвергать сайт атакам DOS, если люди начнут запускать код:
#!/usr/bin/env ruby
require 'nokogiri'
require 'addressable/uri'
require 'typhoeus'
BASE_URL = ''
url = Addressable::URI.parse(BASE_URL)
resp = Typhoeus::Request.get(url.to_s)
doc = Nokogiri::HTML(resp.body)
hydra = Typhoeus::Hydra.new(:max_concurrency => 10)
doc.css('a').map{ |n| n['href'] }.select{ |href| href[/\.gz$/] }.each do |gzip|
gzip_url = url.join(gzip)
request = Typhoeus::Request.new(gzip_url.to_s)
request.on_complete do |resp|
gzip_filename = resp.request.url.split('/').last
puts "writing #{gzip_filename}"
File.open("gz/#{gzip_filename}", 'w') do |fo|
fo.write resp.body
end
end
puts "queuing #{ gzip }"
hydra.queue(request)
end
hydra.run
Запуск кода на моем многолетнем MacBook Pro вытащил 76 файлов общим объемом 11 МБ всего задо 20 секунд, по беспроводной связи в DSL.Если вы выполняете только HEAD
запросов, ваша пропускная способность будет лучше.Возможно, вы захотите поработать с параметром параллелизма, потому что есть момент, когда более параллельные сеансы только замедляют вас и бесполезно используют ресурсы.
Я даю ему 8 из 10;У него отличный ритм, и я могу танцевать под него.
РЕДАКТИРОВАТЬ:
При проверке URL-адресов удаления вы можете использовать запрос HEAD или GET с If-Modified-Since
.Они могут дать вам ответы, которые вы можете использовать для определения актуальности ваших URL.