Ruby Mechanize перестает работать во время каждого цикла

Я использую Ruby-скрипт механизации для циклического прохождения около 1000 записей в файле с разделителями табуляции. Все работает, как ожидалось, пока я не достигну около 300 записей.

Как только я получаю около 300 записей, мой скрипт вызывает спасение при каждой попытке и в конце концов перестает работать. Я думал, что это потому, что я не правильно настроил max_history, но это, кажется, не имеет значения.

Вот сообщение об ошибке, которое я начинаю получать:

getaddrinfo: nodename nor servname provided, or not known

Любые идеи о том, что я мог бы делать здесь не так?

require 'mechanize' 
result_counter = 0
used_file = File.open(ARGV[0])
total_rows = used_file.readlines.size

mechanize = Mechanize.new { |agent|
  agent.open_timeout   = 10
  agent.read_timeout   = 10
  agent.max_history = 0
}

File.open(ARGV[0]).each do |line|
  item = line.split("\t").map {|item| item.strip}
  website = item[16]
  name = item[11]

  if website
    begin
      tries ||= 3
      page = mechanize.get(website)

      primary1 = page.link_with(text: 'text')
      secondary1 = page.link_with(text: 'other_text')
      contains_primary = true
      contains_secondary = true

      unless contains_primary || contains_secondary
        1.times do |count|
          result_counter+=1
          STDERR.puts "Generate (#{result_counter}/#{total_rows}) #{name} - No"
        end
      end

      for i in [primary1]
        if i
          page_to_visit = i.click
          page_found = page_to_visit.uri
          1.times do |count|
            result_counter+=1
            STDERR.puts "Generate (#{result_counter}/#{total_rows}) #{name}"
          end
          break
        end
      end
    rescue Timeout::Error
      STDERR.puts "Generate (#{result_counter}/#{total_rows}) #{name} - Timeout"
    rescue => e
      STDERR.puts e.message
      STDERR.puts "Generate (#{result_counter}/#{total_rows}) #{name} - Rescue"
    end
  end
end

1 ответ

Решение

Вы получаете эту ошибку, потому что не закрываете соединение после того, как используете его.

Это должно исправить вашу проблему:

mechanize = Mechanize.new { |agent|
  agent.open_timeout = 10
  agent.read_timeout = 10
  agent.max_history  = 0
  agent.keep_alive   = false
}
Другие вопросы по тегам