私は、データベース内のすべての顧客を調べ、顧客のWebサイトのURLが機能することを確認し、顧客のホームページでTwitterリンクを見つけようとするスクリプトを作成しました。確認するURLは10,000を少し超えています。URLが検証された場合のほんの一部の後、すべてのURLに対してgetaddrinfoエラーが発生し始めます。
単一の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
注:このコードのバージョンを実行して、scrape_urlへのすべての呼び出しで共有される単一のMechanizeインスタンスを作成しました。まったく同じように失敗しました。
これをEC2で実行すると、ほぼ正確に1,000のURLを通過し、残りの9,000以上に対してこのエラーが返されます。
getaddrinfo: Temporary failure in name resolution
注:AmazonのDNSサーバーとGoogleのDNSサーバーの両方を使用してみましたが、これは正当なDNSの問題である可能性があると考えています。どちらの場合もまったく同じ結果が得られました。
次に、ローカルのMacBookProで実行してみました。残りのレコードに対してこのエラーを返す前に、約250を通過しただけです。
getaddrinfo: nodename nor servname provided, or not known
スクリプトを取得してすべてのレコードを処理する方法を知っている人はいますか?