2012-03-10 4 views
0

Я занимаюсь написанием ряда скребок Ruby с использованием Mechanize и Nokogiri. Например, здесь (однако, кажется, что после выполнения определенного количества запросов (около 14000 в этом случае) я получаю сообщение об ошибке, когда у меня есть ошибка времени ожидания подключения:Рубиновое механизированное соединение Время ожидания

/var/lib/gems/1.8/gems /net-http-persistent-2.5.1/lib/net/http/persistent/ssl_reuse.rb:90:in `initialize ': время ожидания подключения - соединение (2) (Errno :: ETIMEDOUT)

У меня есть В Googled много онлайн, но лучший ответ, который я могу получить, это то, что я делаю слишком много запросов на сервер. Есть ли способ исправить это дросселированием или каким-либо другим способом?

+0

Посмотрите эту тему относительно дросселирования: http://stackoverflow.com/questions/9241625/regulating-rate-limiting-ruby-mechanize также рассмотрите возможность возврата к версии 1.0, которая не использует постоянные http-соединения – pguardiario

+0

Версия 1.0 для Механизации или Нокигири? – ZenBalance

+0

механизация, извините – pguardiario

ответ

0

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

Для всех начинающих программистов Ruby, которые сталкиваются с подобной проблемой:

Связь тайм-аут ошибка обычно возникает из-за недопустимого ссылки и т.д. на странице быть утилизированы.

Вам нужно обернуть код, который обращается ссылку в сообщении, такие как ниже

begin 
    #[1 your scraping code here ] 
rescue 
    #[2 code to move to the next link/page/etc. that you are scraping instead of sticking to the invalid one] 
end 

Например, если у вас есть цикл, который Перебор ссылки и извлечения информации из каждого звена, а затем это должно быть в [1], а код для перехода к следующей ссылке (подумайте о том, чтобы использовать что-то вроде ruby ​​«next») следует поместить в [2]. Вы также можете попробовать распечатать что-нибудь на консоли, чтобы пользователь знал, что ссылка была недействительной.