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
}