2012-11-01 26 views
5

Tôi đã viết một tập lệnh sẽ đi qua tất cả các khách hàng trong cơ sở dữ liệu của chúng tôi, xác minh rằng URL trang web của họ hoạt động và cố gắng tìm một liên kết twitter trên trang chủ của họ. Chúng tôi có ít hơn 10.000 URL để xác minh. Sau một phần nhỏ nếu các url được xác minh, chúng tôi bắt đầu nhận các lỗi getaddrinfo cho mỗi URL.Lỗi getaddrinfo với Mechanize

Dưới đây là một bản sao của mã mà cạo một URL duy nhất:

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 

Lưu ý: Tôi cũng đã chạy một phiên bản của mã này tạo ra một trường hợp mechanize duy nhất được chia sẻ trên tất cả các cuộc gọi đến scrape_url. Nó thất bại trong chính xác cùng một thời trang.

Khi tôi chạy trên EC2, nó được thông qua gần như chính xác 1.000 url, sau đó trả về lỗi này cho phần còn lại 9,000+:

getaddrinfo: Temporary failure in name resolution 

Lưu ý, tôi đã cố gắng sử dụng cả hai máy chủ của Amazon DNS và DNS của Google máy chủ, nghĩ rằng nó có thể là một vấn đề DNS hợp pháp. Tôi đã nhận được kết quả tương tự trong cả hai trường hợp.

Sau đó, tôi đã thử chạy trên MacBook Pro cục bộ của mình. Nó chỉ có khoảng 250 trước khi trả lại lỗi này cho phần còn lại của các bản ghi:

getaddrinfo: nodename nor servname provided, or not known 

Có ai biết làm thế nào tôi có thể có được kịch bản để làm cho nó thông qua tất cả các hồ sơ?

+0

Hiển thị cho chúng tôi url không thành công. – pguardiario

+0

Nó thất bại trên khoảng 9.000 người trong số họ. Một ví dụ là http://www.agilecommerce.com. Các URL có xu hướng hoạt động nếu được cắm vào trình duyệt. – EricM

+0

bạn có thể hết bộ nhớ không? – pguardiario

Trả lời

7

Tôi tìm thấy giải pháp. Cơ chế đã để lại kết nối mở và dựa vào GC để làm sạch chúng. Sau một thời điểm nhất định, có đủ các kết nối mở mà không có kết nối gửi đi bổ sung nào có thể được thiết lập để thực hiện tra cứu DNS. Đây là mã khiến nó hoạt động:

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

Bằng cách đặt keep_alive thành false, kết nối sẽ bị đóng và làm sạch ngay lập tức.

0

Xem nếu điều này giúp:

agent.history.max_size = 10 

Nó sẽ giữ lại lịch sử từ việc sử dụng quá nhiều bộ nhớ

Các vấn đề liên quan