的getaddrinfo误差机械化(getaddrinfo error with Mechanize

2019-07-03 12:33发布

我写了一个脚本,将经历都在我们数据库中的客户,确认他们的网站URL的作品,并试图找到他们的主页的链接的Twitter。 我们有超过10,000一点的网址进行验证。 如果网址已经核实的一小部分后,我们开始获得的getaddrinfo每一个URL错误。

下面是擦伤单个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

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

Answer 1:

我找到了解决办法。 机械化离开连接打开,并依托GC来清除它们。 某一点后,有足够的,没有其他出站连接可以建立做一个DNS查找打开的连接。 下面是导致它运行的代码:

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

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



Answer 2:

看看这有助于:

agent.history.max_size = 10

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



文章来源: getaddrinfo error with Mechanize