2010-05-05 38 views
11

Tôi đang cố truy xuất tệp 500MB bằng Python và tôi có tập lệnh sử dụng urllib.urlretrieve(). Dường như có sự cố mạng giữa tôi và trang web tải xuống, vì cuộc gọi này liên tục bị treo và không hoàn thành. Tuy nhiên, sử dụng wget để truy xuất tệp có xu hướng hoạt động không có sự cố. Sự khác nhau giữa urlretrieve()wget có thể gây ra sự khác biệt này là gì?Sự khác biệt giữa Python urllib.urlretrieve() và wget

Trả lời

16

Câu trả lời khá đơn giản. urlliburllib2 của Python không ở đâu gần như trưởng thành và mạnh mẽ như chúng có thể. Thậm chí tốt hơn so với wget trong kinh nghiệm của tôi là cURL. Tôi đã viết mã tải xuống hàng gigabyte tệp qua HTTP với kích thước tệp từ 50 KB đến hơn 2 GB. Theo hiểu biết của tôi, cURL là phần mềm đáng tin cậy nhất trên hành tinh ngay bây giờ cho nhiệm vụ này. Tôi không nghĩ rằng python, wget, hoặc thậm chí hầu hết các trình duyệt web có thể phù hợp với nó về tính chính xác và mạnh mẽ của việc thực hiện. Trên một con trăn đủ hiện đại sử dụng urllib2 đúng cách, nó có thể được làm khá đáng tin cậy, nhưng tôi vẫn chạy một tiến trình con curl và đó là hoàn toàn đá rắn.

Một cách khác để nêu rõ điều này là cURL chỉ thực hiện một điều và nó thực hiện tốt hơn bất kỳ phần mềm nào khác vì nó đã có nhiều sự phát triển và tinh tế hơn. Python urllib2 có ích và tiện lợi và hoạt động đủ tốt cho khối lượng công việc nhỏ đến trung bình, nhưng cURL là con đường phía trước về độ tin cậy.

Ngoài ra, cURL có nhiều tùy chọn để điều chỉnh hành vi của độ tin cậy bao gồm thử lại đếm, giá trị timeout vv

2

Nếu bạn đang sử dụng:

page = urllib.retrieve('http://example.com/really_big_file.html') 

bạn đang tạo một chuỗi 500mb mà cũng có thể đánh thuế máy tính của bạn, làm cho nó chậm, và gây ra các kết nối đến thời gian chờ. Nếu vậy, bạn nên sử dụng:

(filename, headers) = urllib.retrieve('http://...', 'local_outputfile.html') 

sẽ không đánh thuế thông dịch viên.

Điều đáng chú ý là urllib.retrieve() sử dụng urllib.urlopen() which is now deprecated.

+0

Điểm tốt, mặc dù tôi đang sử dụng phiên bản dài hơn tiết kiệm vào một tập tin. – jrdioko

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