Napisałem skrypt, który przejdzie przez wszystkich klientów w naszej bazie danych, sprawdzi, czy działa adres URL witryny i spróbuje znaleźć link do twittera na swojej stronie głównej. Mamy ponad 10 000 adresów URL do zweryfikowania. Po ułamku, jeśli adresy URL zostaną zweryfikowane, zaczniemy otrzymywać błędy getaddrinfo dla każdego adresu URL.Błąd getaddrinfo z Mechanize
Oto kopia kodu, który zdrapuje pojedynczy URL:
def scrape_url(url)
url_found = false
twitter_name = nil
begin
agent = Mechanize.new do |a|
a.follow_meta_refresh = true
end
agent.get(normalize_url(url)) do |page|
url_found = true
twitter_name = find_twitter_name(page)
end
@err << "[#{@current_record}] SUCCESS\n"
rescue Exception => e
@err << "[#{@current_record}] ERROR (#{url}): "
@err << e.message
@err << "\n"
end
[url_found, twitter_name]
end
Uwaga: Ja również uruchomić wersję tego kodu, który tworzy pojedynczą instancję Mechanize, który pobiera współdzielonej przez wszystkie połączenia do scrape_url. Nie udało się dokładnie w taki sam sposób.
Gdy uruchomię to na EC2, robi się przez prawie dokładnie 1000 adresów URL, a następnie zwraca ten błąd dla pozostałej 9,000+:
getaddrinfo: Temporary failure in name resolution
Uwaga, próbowałem przy użyciu obu serwerów DNS Amazona i DNS Google'a serwerów, myśląc, że może to być uzasadniony problem z DNS. W obu przypadkach uzyskałem dokładnie taki sam wynik.
Następnie próbowałem uruchomić go na moim lokalnym MacBook Pro. Doszło jedynie przez około 250 przed powrotem tego błędu dla pozostałej części zapisów:
getaddrinfo: nodename nor servname provided, or not known
Czy ktoś wie jak mogę uzyskać skrypt zrobić to przez wszystkie rekordy?
Pokaż nam adres URL, na którym się nie powiodło. – pguardiario
Błąd kończy się około 9000 z nich. Jednym z przykładów jest http://www.agilecommerce.com. Adresy URL działają, jeśli są podłączone do przeglądarki. – EricM
Czy może ci brakować pamięci? – pguardiario