2012-11-01 105 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 

將保持歷史從使用太多內存