2011-02-12 35 views
5

Tôi có một công việc cào lớn để thực hiện - hầu hết thời gian của tập lệnh được sử dụng để chặn do rất nhiều thời gian chờ của mạng. Tôi đang cố gắng để multi-thread kịch bản để tôi có thể tạo nhiều yêu cầu cùng một lúc, nhưng khoảng 10% số bài của tôi chết với các lỗi sauYêu cầu web đa luồng trong python - 'Tên hoặc dịch vụ không được biết'

URLError: <urlopen error [Errno -2] Name or service not known> 

Các khác 90% hoàn thành thành công. Tôi đang yêu cầu nhiều trang từ cùng một tên miền, vì vậy có vẻ như có thể có một số vấn đề về DNS. Tôi thực hiện 25 yêu cầu cùng một lúc (25 chủ đề). Tất cả mọi thứ hoạt động tốt nếu tôi giới hạn bản thân mình đến 5 yêu cầu cùng một lúc, nhưng một khi tôi nhận được khoảng 10 yêu cầu, đôi khi tôi bắt đầu thấy lỗi này.

Tôi đã đọc Repeated host lookups failing in urllib2 mô tả cùng một vấn đề tôi có và làm theo các đề xuất trong đó, nhưng không có kết quả.

Tôi cũng đã thử sử dụng mô-đun đa xử lý thay vì đa luồng, tôi nhận được cùng một hành vi - khoảng 10% các quá trình chết với cùng một lỗi - dẫn tôi tin rằng đây không phải là vấn đề với urllib2 nhưng cái gì khác.

Ai đó có thể giải thích những gì đang diễn ra và đề xuất cách khắc phục?

CẬP NHẬT

Nếu tôi tự mã địa chỉ IP của trang web vào kịch bản tất cả mọi thứ của tôi hoạt động hoàn hảo, vì vậy lỗi này xảy ra đôi khi trong việc tra cứu DNS.

+0

Bạn có quyền truy cập vào máy chủ không? Bạn có thể chạy vào một số công cụ chống từ chối dịch vụ hoặc nếu máy chủ không phải là trọng lượng nặng, thì bạn thực sự có thể đang quá tải ... – jswolf19

+0

Đây là trang web chính có khả năng xử lý hàng trăm hoặc hàng ngàn yêu cầu đồng thời, 25 của tôi thậm chí không làm cho một vết lõm nhỏ. Tôi khá chắc chắn đó là một vấn đề giải quyết dns, bởi vì nếu tôi thay thế tên miền với địa chỉ ip kịch bản của tôi chạy hoàn hảo - vì vậy trang web không rõ ràng là đóng cửa tôi. Tại thời điểm này tôi chỉ muốn hiểu tại sao các tra cứu DNS không thành công. –

+0

Sau đó, nó có thể là một vấn đề với máy chủ DNS chỉ cho phép rất nhiều yêu cầu từ một khách hàng trong một khoảng thời gian nhất định, hoặc những gì có bạn. – jswolf19

Trả lời

1

Đề xuất: Thử bật bộ nhớ cache DNS trong hệ thống của bạn, chẳng hạn như nscd. Điều này sẽ loại bỏ các vấn đề tra cứu DNS nếu scraper của bạn luôn đưa ra yêu cầu cho cùng một miền.

Đảm bảo rằng các đối tượng tệp được trả về bởi urllib2.urlopen được đóng lại đúng cách sau khi được đọc để tài nguyên miễn phí. Nếu không, bạn có thể đạt đến giới hạn của ổ cắm mở tối đa trong hệ thống của bạn.

Ngoài ra, hãy xem xét các trình thu thập dữ liệu trang web politeness policy cần phải tránh quá tải máy chủ có nhiều yêu cầu.

+1

Tôi đã thực hiện cả hai điều này, câu hỏi tràn ngăn xếp khác mà tôi đã liên kết trong bài đăng của tôi đưa ra cả hai đề xuất này, nhưng nó không giải quyết được vấn đề của tôi. Sử dụng địa chỉ IP trực tiếp thay vì tên miền, nhưng tôi không hiểu tại sao nscd không giải quyết vấn đề này, vì nó có vẻ liên quan đến bộ nhớ đệm DNS. –

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