HolyMackerel! Sử dụng các công cụ!
import urllib2, sys, socket, time, os
def url_tester(url = "http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz"):
file_name = url.split('/')[-1]
u = urllib2.urlopen(url,None,1) # Note the timeout to urllib2...
file_size = int(u.info().getheaders("Content-Length")[0])
print ("\nDownloading: {} Bytes: {:,}".format(file_name, file_size))
with open(file_name, 'wb') as f:
file_size_dl = 0
block_sz = 1024*4
time_outs=0
while True:
try:
buffer = u.read(block_sz)
except socket.timeout:
if time_outs > 3: # file has not had activity in max seconds...
print "\n\n\nsorry -- try back later"
os.unlink(file_name)
raise
else: # start counting time outs...
print "\nHmmm... little issue... I'll wait a couple of seconds"
time.sleep(3)
time_outs+=1
continue
if not buffer: # end of the download
sys.stdout.write('\rDone!'+' '*len(status)+'\n\n')
sys.stdout.flush()
break
file_size_dl += len(buffer)
f.write(buffer)
status = '{:20,} Bytes [{:.2%}] received'.format(file_size_dl,
file_size_dl * 1.0/file_size)
sys.stdout.write('\r'+status)
sys.stdout.flush()
return file_name
Điều này sẽ in trạng thái như mong đợi. Nếu tôi tháo cáp ethernet của tôi, tôi nhận được:
Downloading: Python-2.7.3.tgz Bytes: 14,135,620
827,392 Bytes [5.85%] received
sorry -- try back later
Nếu tôi tháo cáp, sau đó cắm nó trở lại trong vòng chưa đầy 12 giây, tôi nhận được:
Downloading: Python-2.7.3.tgz Bytes: 14,135,620
716,800 Bytes [5.07%] received
Hmmm... little issue... I'll wait a couple of seconds
Hmmm... little issue... I'll wait a couple of seconds
Done!
Các tập tin được tải về thành công.
Bạn có thể thấy rằng urllib2 hỗ trợ cả thời gian chờ và kết nối lại. Nếu bạn ngắt kết nối và ngắt kết nối trong 3 * 4 giây == 12 giây, nó sẽ hết thời gian cho tốt và tăng ngoại lệ gây tử vong. Điều này cũng có thể được xử lý.
Bạn có thể tăng ngoại lệ trong bản đăng ký của mình. – Tobold
Vâng, việc tăng ngoại lệ có vẻ là cách phổ biến để ngừng tải xuống, từ một cái nhìn nhanh về Google. Nó không được đề cập trong tài liệu mặc dù, mà làm cho tôi lo lắng rằng nó có thể có hành vi bất ngờ. Ví dụ: có thể dữ liệu được tìm nạp bởi một chuỗi chuyên dụng và việc ném một ngoại lệ sẽ biến nó thành một đứa trẻ mồ côi và không thực sự dừng quá trình tải xuống. – Kevin