Πολλές φορές θα χρειαστεί να κατεβάσουμε κάποιο αρχείο από το διαδίκτυο, από τη γραμμή εντολών. Υπάρχουν κάποια καλά προγράμματα όπως το wget. Εδώ είναι μια εκπαιδευτική υλοποίηση που χρησιμοποιεί τα modyle urllib.request και urllib.parse της Python3.
#!/usr/bin/env python3
#-*-coding: utf-8-*-
# filename: downloadme.py
import urllib.request
import urllib.parse
import sys
def download_me(the_urls, block_size=8192):
"""Downloads a file from a site.
USAGE: python3 downloadme.py http://1 http://2 ...
Author: Konstas Marmatakis <marmako[at]gmail[dot]com>
License: GNU/GPL v 3.0
"""
for the_url in the_urls: ## Αν έχουμε πάνω από μία διευθύνσεις δικτύου
the_url = urllib.parse.unquote(the_url) ## Σβήνουμε αν υπάρχουν χαρακτήρες '%20f' κλπ.
print(the_url)
file_name = the_url.split('/')[-1] # Διαχωρίζουμε το αρχείο από τη διεύθυνση.
site = urllib.request.urlopen(the_url) # Ανοίγουμε το αρχείο.
file_size = int(site.getheader("Content-Length")) # Παίρνουμε το μήκος του αρχείου
print("Κατεβάζω: {0} Bytes: {1} KBytes: {2:.2f}".format(file_name,\
file_size, int(file_size/1024)))
try:
fh = open(file_name, 'wb') # Ανοίγουμε τοπικά θέση για να γράψουμε.
megethos_arxeiou_kt = 0 # Αρχικό μέγεθος αρχείου 0 bytes.
while True:
buffer = site.read(block_size) # Διαβάζουμε 8192 bytes.
if not buffer: # Αν δεν έχουμε να διαβάσουμε σταματάμε.
break
megethos_arxeiou_kt += len(buffer) # Τι έχουμε κατεβάσει.
fh.write(buffer) # Γράφουμε το αρχείο.
prcnt = (megethos_arxeiou_kt / file_size)
katastasi = "{0:>6,d}kb {1:.2%}".format(round(megethos_arxeiou_kt/1024),\
prcnt)
sys.stdout.write("\rΚατέβηκαν: " + katastasi)
sys.stdout.flush()
sys.stdout.write("\n")
finally:
fh.close()
if __name__ == '__main__':
if len(sys.argv) > 1:
del sys.argv[0]
download_me(sys.argv)
else:
print("Usage: downloadme.py http://url/to/the/file/file http://url/to/the/file/file2 ...")
Σημείωσεις:
Το πρόγραμμα τρέχει στη γραμμή εντολών και σε windows.
Το πρόγραμμα δέχεται και πολλαπλά url.
Χρησιμοποιείται η urllib.parse.unquote για να αντικατασταθούν οι χαρακτήρες %xx, αν υπάρχουν στο url.
Αν θέλετε να το τρέξετε από το IDLE καλά είναι να αντικατασταθούν τα sys.stdout.write με την print και να αφαιρεθεί το sys.stdout.flush(), για να υπάρξει καλύτερο οπτικό αποτέλεσμα στην ενημερωτική οθόνη του προγράμματος.