GetAddrinfo误差与机械化



我编写了一个脚本,该脚本将通过我们的数据库中的所有客户,验证他们的网站URL是否有效,并尝试在其主页上找到一个Twitter链接。我们有10,000多个URL可以验证。如果验证了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}] SUCCESSn" 
  rescue Exception => e 
    @err << "[#{@current_record}] ERROR (#{url}): " 
    @err << e.message 
    @err << "n" 
  end 
  [url_found, twitter_name] 
end

注意:我还运行了此代码的一个版本,该版本创建了一个单个机械化实例,该实例在所有调用scrape_url中共享。它以完全相同的方式失败。

当我在EC2上运行它时,它几乎完全通过1,000个URL,然后返回剩下的9,000 :

的此错误
getaddrinfo: Temporary failure in name resolution

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

然后,我尝试在本地MacBook Pro上运行它。在其余记录中返回此错误之前,它只能通过大约250次:

getaddrinfo: nodename nor servname provided, or not known

有人知道我如何获得脚本以通过所有记录制作脚本?

我找到了解决方案。机械化正在使连接打开,并依靠GC清理它们。一定的一点之后,有足够的开放连接,无法建立其他出站连接来进行DNS查找。这是导致其工作的代码:

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

通过将keep_alive设置为false,该连接立即关闭并清理。

查看这是否有帮助:

agent.history.max_size = 10

它将阻止历史记忆过多

相关内容

  • 没有找到相关文章

最新更新