2012-11-01 90 views
5

我写了一个脚本,将通过我们的数据库中的所有客户,验证他们的网站网址的作品,并试图找到他们的主页上的Twitter链接。我们有超过10,000个网址进行验证。如果网址已经过验证,那么我们会为每个网址获取getaddrinfo错误。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一个机械化实例。它的失败方式完全一样。

当我在EC2上运行此,它获得通过几乎完全1000个网址,然后返回该错误的剩余9,000+:

getaddrinfo: Temporary failure in name resolution 

注意,我同时使用Amazon的DNS服务器和谷歌的DNS尝试服务器,认为它可能是一个合法的DNS问题。在这两种情况下我都得到了完全相同的结果。

然后,我试着在我的本地MacBook Pro上运行它。它只能通过约250返回了这个错误的的记录剩余部分之前:

getaddrinfo: nodename nor servname provided, or not known 

有谁知道我怎样才能拿到剧本通过所有的记录做呢?

+0

向我们展示它失败的网址。 – pguardiario

+0

约有9000人失败。一个例子是http://www.agilecommerce.com。如果插入浏览器,URL往往会工作。 – EricM

+0

你能用完内存吗? – pguardiario

回答

7

我找到了解决办法。 Mechanize将连接打开并依靠GC来清理它们。在某一点之后,有足够的开放式连接,无法建立额外的出站连接来进行DNS查找。下面是导致其工作代码:

agent = Mechanize.new do |a| 
    a.follow_meta_refresh = true 
    a.keep_alive = false 
end 

通过设置KEEP_ALIVE为false,连接被立即关闭和清理。

0

看看这有助于:

agent.history.max_size = 10 

将保持历史从使用太多内存